Построить синтаксический анализатор - Pascal ABC

Узнай цену своей работы

Формулировка задачи:

Построить синтаксический анализатор для понятия “отношение”, используя рекурсию. <отношение> := <простое выражение> {<, >, =, >=, <=, <>} <простое выражение> Помогите пожалуйста, ума не приложу как это сделать.

Решение задачи: «Построить синтаксический анализатор»

textual
Листинг программы
Const eps = 0.000001;
 
Var St : String;
 
Function CheckLogic(S : String) : Boolean;
Const
  op : array[1..6] of String[2] = ('<>','<=','>=','<','>','=');
  un : Set of Char              = ['+','-','*','/'];
Var
  r1,r2       : Real;
  a1,a2,b1,b2 : Longint;
  k,i,o1,o2   : Byte;
Begin
  CheckLogic:=False;
  For i:=Length(S) downto 1 do
  Begin
    If not (S[i] in [' ','-','+','*','/','=','>','<','0'..'9']) then Exit
    else If S[i]=' ' then Delete(S,i,1); {'11 22+33>44-5 66 77 88' приведется к виду: '1122+33>44-5667788' -будем считать это особенностью работы функции ;) }
  end;
  k:=1;
  While (k<=6) and (Pos(op[k],S)=0) do Inc(k);
  If k<=6 then
  Begin
    a1:=0; a2:=0; b1:=0; b2:=0;
    i:=1;
// дальше будет нормально работать, если введена строка вида: {numeric}{операция}{numeric}{условие сравнения}{numeric}{операция}{numeric}
    While (i<=Length(S)) and (not (S[i] in un)) do
    Begin
      a1:=a1*10+Ord(S[i])-Ord('0');
      Inc(i);
    end;
    o1:=i;
    Inc(i);
    While (i<=Length(S)) and ((not (S[i] in un)) and (i<Pos(op[k],S))) do
    Begin
      a2:=a2*10+(Ord(S[i])-Ord('0'));
      Inc(i);
    end;
    i:=Pos(op[k],S)+Length(op[k]);
    While (i<=Length(S)) and (not (S[i] in un)) do
    Begin
      b1:=b1*10+Ord(S[i])-Ord('0');
      Inc(i);
    end;
    o2:=i;
    Inc(i);
    While (i<=Length(S)) and (not (S[i] in un)) do
    Begin
      b2:=b2*10+(Ord(S[i])-Ord('0'));
      Inc(i);
    end;
    Case S[o1] of
      '+' : r1:=a1+a2;
      '-' : r1:=a1-a2;
      '*' : r1:=a1*a2;
      '/' : r1:=a1/a2;
    end;
    Case S[o2] of
      '+' : r2:=b1+b2;
      '-' : r2:=b1-b2;
      '*' : r2:=b1*b2;
      '/' : r2:=b1/b2;
    end;
    Case k of  {'<>','<=','>=','<','>','='}
      1 : CheckLogic:=((abs(r1-r2)-eps)>0);
      2 : CheckLogic:=(r1<r2) or ((abs(r1-r2)-eps)<=0);
      3 : CheckLogic:=(r1>r2) or ((abs(r1-r2)-eps)<=0);
      4 : CheckLogic:=(r1<r2);
      5 : CheckLogic:=(r1>r2);
      6 : CheckLogic:=((abs(r1-r2)-eps)<=0);
    end;
  end;
  // {for debugging} Writeln(a1,S[o1],a2,op[k],b1,S[o2],b2,'   ',r1:2,op[k],r2:2);
end;
 
Begin
  St:=' 1 + 4 >  1  + 1 ';               {TRUE}
  Writeln(St,'      ',CheckLogic(St));
  St:=' 1 + 4 <  1  + 1 ';               {FALSE}
  Writeln(St,'      ',CheckLogic(St));
  St:='1 + 4  >= 1  + 1 ';               {TRUE}
  Writeln(St,'      ',CheckLogic(St));
  St:='1 + 4  <= 3  + 2 ';               {TRUE}
  Writeln(St,'      ',CheckLogic(St));
  St:='10 * 2 =  40 / 2 ';               {TRUE}
  Writeln(St,'      ',CheckLogic(St));
  St:='11 +42 =  11 * 10';               {FALSE}
  Writeln(St,'      ',CheckLogic(St));
  St:='1 + 4  <> 1  + 1 ';               {TRUE}
  Writeln(St,'      ',CheckLogic(St));
  St:='1 + 4  <> 3  + 2 ';               {FALSE}
  Writeln(St,'      ',CheckLogic(St));
end.

Объяснение кода листинга программы

  1. Функция CheckLogic принимает на вход строку S и возвращает логическое значение True или False.
  2. В начале функции объявляются константы и переменные:
    • eps = 0.000001 - приближенное значение числа Пи;
    • St - строка, в которой будет храниться исходное выражение;
    • op - массив из 6 пар символов, представляющих операции сравнения;
    • un - множество символов, которые могут быть использованы в качестве операций;
    • r1, r2 - переменные типа Real для хранения чисел;
    • a1, a2, b1, b2 - переменные типа Longint для хранения чисел;
    • k, i, o1, o2 - переменные типа Byte для контроля перебора символов в строке.
  3. Далее в цикле проверяется каждый символ входной строки S. Если символ является пробелом, знаком равенства, знаком больше, знаком меньше, знаком сложения, знаком вычитания, знаком умножения или знаком деления, то он пропускается. Если символ не является перечисленными выше, то он обрабатывается.
  4. Если в строке встречается операция сравнения, то в зависимости от ее типа выполняется соответствующая проверка.
  5. Если в строке встречаются операции арифметических действий, то в зависимости от знака операции выполняется соответствующая арифметическая операция.
  6. Если в строке встречаются числа, то они преобразуются в тип Real и сохраняются в переменных r1 и r2.
  7. В конце функции выводится результат проверки выражения на истинность.
  8. В основной части программы приводятся примеры использования функции CheckLogic для различных выражений.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы