Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2011, 14:08   #1
Deni55
Пользователь
 
Регистрация: 10.04.2009
Сообщений: 64
Вопрос Интерпретатор на Delphi

Помогите пожалуйста!!!

требуется написать программу интерпретатор языка pascal
в окно мемо загрузается текст с кодом, который в последствии будет проанализирован. Требуется найти ошибку в операоре, преобразоать код в систему счисления 4 и проверить правельность выполнения цикла в данном случае цикл repeat .... until....

В архиве находися файл с расширением .pas
В нем описан код в котором пререводится в 4 систему счисления, выполняется проверак но реализовано для цикла Case .. of.....
как его переделать для repeat .... until....

Помогите!!! очень нужна ваша помощь!
Вложения
Тип файла: rar Interpr.rar (4.7 Кб, 29 просмотров)
Deni55 вне форума Ответить с цитированием
Старый 25.05.2011, 15:06   #2
Deni55
Пользователь
 
Регистрация: 10.04.2009
Сообщений: 64
По умолчанию

Этот же файл, только с коментариями
Код:
   //анализ строки, содержащей оператор 'case' нужно сделать для repeat

procedure strcase(strprog: string; tst:boolean);      //в strprog- строка программы с оператором 'case'; признак tst=true - только синтаксический анализ строки, tst=false - синтаксический анализ строки и ее выполнение
var c: char; i,n: byte; str,str1: string; s_op: array [1..2] of string; fl_minus: boolean;
    c1: array [1..2] of char; kons, op: array [1..2] of Int64;
begin
  strprog:=TrimLeft(strprog);      //убираем пробелы слева
  Delete(strprog,1,4);               //убираем из строки слово 'case'
  strprog:=TrimLeft(strprog);        //убираем левый пробел (или пробелы)
    //проверяем символ, следующий после 'case'
  if not (strprog[1] in ['a'..'z']) or (strprog[2]<>' ') then      //если это не символ идентификатора с последующим пробелом- ошибка
  begin errorsoob(10); exit; end;

  if  not nal_var[ord(strprog[1])-96] then begin errorsoob(8); exit; end         //использование идентификатора, неописанного в строке 'var'
  else nal_pr[ord(strprog[1])-96]:=true;        //признак: идентификатор, описанный в строке 'var', используется в программе
  c:=strprog[1];                            //запоминаем символ идентификатора
  Delete(strprog,1,2);                  //убираем идентификатор из текущей строки (вместе с последующим пробелом)
  strprog:=TrimLeft(strprog);           //если есть еще пробелы - убираем их из strprog
  if (Pos('of ', strprog)<>1) then     //если первое слово в strprog не 'of' с последующим пробелом- ошибка
  begin errorsoob(10); exit; end;       //cтрока не соответствует синтаксису языка
  Delete(strprog,1,2);                //убираем из strprog 'of'

  n:=Pos(' end',strprog);                //конец оператора 'case' - 'end' с пробелом перед 'end' или с ';'
  if n=0 then n:=Pos(';end',strprog);
  if (n<>(length(strprog)-3)) then begin errorsoob(10); exit; end;    //cтрока не соответствует синтаксису языка
  Delete(strprog,n+1,3);   //убираем из строки завершающий 'end'

  repeat                //удалить из оставшейся строки все пробелы
    n:=Pos(' ',strprog);
    if n<>0 then Delete(strprog,n,1) else break;
  until false;
  if strprog[length(strprog)]=';' then strprog:=Copy(strprog,1,length(strprog)-1);

  n:=Pos(';', strprog);                     //поиск ';' после первого оператора
  if n=0 then begin errorsoob(10); exit; end;        //cтрока не соответствует синтаксису языка
  str:=Copy(strprog,1,n-1);                     //в str - первая константа и первый оператор
  str1:=str;
  Delete(strprog,1,n);                     //убираем из строки первый оператор (теперь в strprog - вторая константа и второй оператор)
  s_op[1]:=str; s_op[2]:=strprog;

  for i:=1 to 2 do               //в структуре оператора 'case' две константы
  begin
    fl_minus:=false;
    if str[1]='-' then begin fl_minus:=true; Delete(str,1,1); end;      //запоминаем признак отрицательного числа и удаляем знак '-'
    if not (str[1] in ['0'..'3']) then                      //следующим словом в структуре оператора 'case' должна быть - константа (в четверичной системе счисления)(а значит. первый ее символ должен начинаться с цифры)
    begin
      if str[1] in ['4'..'9'] then errorsoob(7)     //числовая константа не в четверичной системе счисления
      else errorsoob(10);                              //cтрока не соответствует синтаксису языка
      exit;
    end;
    if not (poisk_operand(str, kons[i])) then exit;    //если не ошибка в синтаксисе операнда, запоминаем константу в операторе 'case'
    if fl_minus then kons[i]:=-kons[i];
    if (str[1]<>':') then begin errorsoob(10); exit; end;  //следующим символом после константы в структуре оператора 'case' должно быть ':' (если его нет - ошибка)
    Delete(str,1,1);               //убираем из strprog символ ':'
    if (Pos('readln(',str)<>0) then
      if  not strread(str,true) then           //синтаксическая ошибка в строке
        exit
      else
        begin str:=s_op[2]; continue; end;           //в str - вторая константа и второй оператор
    if not stropprisv(str, op[i], c1[i]) then exit;    //следующим в в структуре 'case' должен быть оператор (проверяем только его синтаксис)
    str:=s_op[2];                                  //в str - вторая константа и второй оператор
  end;

  if tst then exit;              //выход, если только проверка синтаксиса
       //после проверки синтаксиса оператора 'case' вычислим его
  for i:=1 to 2 do                         //в структуре оператора 'case' две константы
  begin
    if val[ord(c)-96]=kons[i] then         //убираем из строки константу вместе с ':'(остается только оператор 'readln()')
    begin
      if (Pos('readln(',s_op[i])<>0) then
      begin
       Delete(s_op[i],1,Pos(':',s_op[i]));
       strread(s_op[i],false);  //выполнение оператора 'readln()'
       break;
      end;
      val[ord(c1[i])-96]:=op[i];      //вычисление оператора
      break;
    end;
  end;
  Vyvodval(false);
end;
Вложения
Тип файла: rar Interpr.rar (6.6 Кб, 37 просмотров)

Последний раз редактировалось Deni55; 25.05.2011 в 15:12.
Deni55 вне форума Ответить с цитированием
Старый 25.05.2011, 15:13   #3
Deni55
Пользователь
 
Регистрация: 10.04.2009
Сообщений: 64
По умолчанию

Код:
       //анализ строки кода программы
procedure Analizstr(s: string; tst:boolean);  //в s- строка кода программы; признак tst=true - только синтаксический анализ строки, tst=false - синтаксический анализ строки и ее выполнение
var op: Int64; idn: char;
begin
  if (nstr<>1) and (nstr<>code.Count-1) then    //не строка 'begin' и не последняя строка ('end.')
  begin
    if s[length(s)]<>';' then begin errorsoob(4); exit; end;    //в конце строки кода должен быть символ ';'
    s:=Copy(s,1,length(s)-1);                //удаляем символ ';' из конца строки
  end;
  if s='' then begin errorsoob(10); exit; end;     //cтрока не соответствует синтаксису языка
  case nstr of
  0:
    begin
      if (Pos('var ',s)<>1) then errorsoob(13)      //если это первая строка кода и она начинается не с ключевого слова 'var' - ошибка
      else strvar(s);                    //анализ строки 'var', содержащей список идентификаторов
    end;
  1:
    if s<>'begin' then errorsoob(1);       //вторая строка должна быть 'begin'
  else
    begin
      if nstr = code.Count-1 then               //если это последняя строка кода
      begin
        if s<>'end.' then errorsoob(2);        //последняя строка должна быть 'end.'
        exit;
      end;
      if Pos('case ',s)<>0 then strcase(s,tst)        //если в строке найдено ключевое слово 'case', выполнить анализ строки, содержащей управляющую конструкцию 'case'
      else
        if Pos('readln(',s)<>0 then strread(s,tst)   //если в строке найдено ключевое слово 'readln', выполнить анализ строки, содержащей оператор 'readln'
        else
          if Pos(':=',s)<>0 then                //если в строке найден знак присвоения (:=')
          begin
            if stropprisv(s, op, idn) then      //выполнить анализ строки, содержащей оператор присвоения и, если нет синтаксических ошибок в строке
              if not tst then begin val[ord(idn)-96]:=op; Vyvodval(false); end;
          end
          else errorsoob(10);   //иначе cтрока не соответствует синтаксису языка
    end;
  end; //case
end;
Deni55 вне форума Ответить с цитированием
Старый 25.05.2011, 22:25   #4
Deni55
Пользователь
 
Регистрация: 10.04.2009
Сообщений: 64
По умолчанию

Помогите!!! подскажите как сделать!!
Deni55 вне форума Ответить с цитированием
Старый 25.05.2011, 22:35   #5
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
для цикла Case .. of
Case .. of - это вообще не цикл

Цитата:
//в конце строки кода должен быть символ ';'
Это с какого же перепугу ?

В конце строки могут быть и пробельные символы, и правилам Паскаля это не противоречит.

И вообще куча несуразностей в логике твоего анализатора.
mss вне форума Ответить с цитированием
Старый 25.05.2011, 22:45   #6
Deni55
Пользователь
 
Регистрация: 10.04.2009
Сообщений: 64
По умолчанию

однако работает
Deni55 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интерпретатор Brainfuck Alex_under Общие вопросы C/C++ 6 01.05.2011 17:28
интерпретатор выражений на delphi Brabus Помощь студентам 3 16.12.2010 21:29
Интерпретатор FALSE Granus Софт 2 13.08.2010 11:37
Интерпретатор Volkodav2411 Фриланс 6 04.02.2010 21:17
командный интерпретатор <Dusha> Общие вопросы C/C++ 4 16.08.2008 18:27