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