Теория вычислительных процессов

Автор: Пользователь скрыл имя, 15 Сентября 2012 в 17:08, лабораторная работа

Описание работы

Создание в среде Pascal программы, которая определяет правильно ли описаны переменные языка Паскаль во входном файле input.txt

Содержание

1. Задание
1.1 Входные данные
1.2 Выходные данные
2. Краткая теория
3. Результаты работы программы
4. Выводы
Список литературы
Приложение.

Работа содержит 1 файл

Лаб№1.doc

— 101.50 Кб (Скачать)

                       err_line:=line;

                       err_pos:=err_pos+position;

                       if (not aft_dots) and (not aft_str) then

                        err_name:='Ожидается ".."'

                       else

                        if aft_str then

                         err_name:='Ожидается "]", а найдено '+'"'+lines[err_line][err_pos]+'"'

                        else

                         err_name:='Ожидается "," или "]", а найдено '+'"'+lines[err_line][err_pos]+'"';

                       check:=false;

                       exit;

                    end;

                  end;

                end;

      BRECKET_2:

                begin

                  if (lines[line][position]=';') and (not is_array) then   //Если не идет объявления массива

                    begin

                      prev_pos:=SEMICOLON;

                      position:=position+1;

                      check(lines[line]);

                      exit;

                    end

                  else

                    if (UpCase(lines[line][position])='O') and (is_array) then   //Если идет объявление массива

                      begin

                        if UpperCase(get_str) = 'OF' then

                          begin

                            prev_pos:=COLON;

                            is_array:=false;

                            check(lines[line]);

                            exit;

                          end

                        else

                          goto else_p_brecket_2;

                      end

                  else

else_p_brecket_2:   begin

                       err_line:=line;

                       err_pos:=err_pos+position;

                       if not is_array then

                        err_name:='Ожидается ";", а найдено '+'"'+lines[err_line][err_pos]+'"'

                       else

                        err_name:='Ожидается "of", а найдено '+'"'+lines[err_line][err_pos]+'"';

                       check:=false;

                       exit;

                    end

                end;

      VAR_TYPE :

                begin

                  if (lines[line][position] = '[') and (aft_str) then

                    begin

                      prev_pos:=BRECKET_1;

                      startP:='';

                      position:=position+1;

                      check(lines[line]);

                      exit;

                    end

                  else

                    if lines[line][position] = ';' then

                      begin

                        prev_pos:=SEMICOLON;  //unexp_end:=false;

                        position:=position+1;

                        check(lines[line]);

                        exit;

                      end

                    else

                      begin

                       err_line:=line;

                       err_pos:=err_pos+position;

                       if aft_str then

                        err_name:='Ожидается "[" или ";", а найдено '+'"'+lines[err_line][err_pos]+'"'

                       else

                        err_name:='Ожидается ";", а найдено '+'"'+lines[err_line][err_pos]+'"';

                       check:=false;

                       exit;

                      end;

                end;

    end;

end;

         //----------Начало программы----------//

begin

  err_name:='Ошибок не обнаружено';

  assignfile(input,'input.txt');

  reset(input);

  line:=0;

 

   while not EOF(input) do //Ищем начало объявлений

    begin

      line:=line+1;   //увеличиваем счетчик строк на 1

      setlength(lines,line+1); //Устанавливаем размер массива

      readln(input,lines[line]); //считываем строку

      j:=1;

      while (not symb(lines[line][j])) and

            (lines[line][j]<>#13) and

            (lines[line][j]<>#10) do j:=j+1;

      if (lines[line][j]=#13) or

         (lines[line][j]=#10) then

            continue;

          while symb(lines[line][j]) do

            begin

              var_str:=var_str+lines[line][j];

              j:=j+1;

            end;

          if (UpperCase(var_str)='VAR') and ((  separator(lines[line][j]) or

               (lines[line][j]=#10) or

               (lines[line][j]=#13) ) and //следующий за ним символ - разделитель

             ( (separator(lines[line][j-length(var_str)-1])or      // предыдущий - разделитель

               (lines[line][j-length(var_str)-1]=#10) or

               (lines[line][j-length(var_str)-1]=#13) or

               (lines[line][j-length(var_str)-1]=#0)) )) then //предыдущий - начало файла

            begin

              position:=j;

              break; //выходим из цикла - while

            end;

    end;

 

  prev_pos:=SEMICOLON;

 

      if check(lines[line]) then //Можно попробовать убрать фроверку отсюда и просто начинать следующий цикл с этого кода

        is_error:=false          //Но возникает проблема.

      else

        is_error:=true;

      if err_name='Ошибок не обнаружено' then  //Почему нужна эта проверка не знаю, но без нее не работало   

        is_error:=false;

 

   while (not eof(input)) and (not is_error) do //Если не конец файла и не ошибка

    begin

      line:=line+1;   //увеличиваем счетчик строк на 1

      setlength(lines,line+1);

      readln(input,lines[line]); //считываем строку

      position:=1;

      err_pos:=0;

      if check(lines[line]) then    //Проверка должна быть именно здесь, если ее поместить в начале цикла, то последняя строка небудет проверятся, т.к. обнаружится "OEF" - конец файла

        is_error:=false

      else

          if err_name<>'Ошибок не обнаружено' then  //Почему нужна эта проверка не знаю, но без нее не работало   

            begin

              is_error:=true;

              break;

            end

          else is_error:=false;     

   end;

 

   if ((prev_pos <> SEMICOLON) or (unexp_end)) and (not is_error) then

    begin

     err_line:=line;

     err_pos:=position;

     err_name:='Неожиданный конец файла';

    end;

 

 

 

  close(input);

 

 

  assignfile(output,'output.txt');

  Rewrite(output);

 

  writeln(output,err_name);

  if err_name<>'Ошибок не обнаружено' then

    writeln(output,'В позиции: '+IntToStr(err_line)+':'+IntToStr(err_pos));

 

  close(output);

 

end.



Информация о работе Теория вычислительных процессов