Я создаю синтаксический анализатор для Паскаля, и я застрял в условных операторах.
Предположим, у меня есть этот фрагмент кода:
if ((10 mod 3) = 1) then ...
Это допустимый оператор паскаля if. Однако, когда я пытаюсь придумать грамматику LL(1) для выражения ((10 mod 3) = 1)
, я терплю крах и сжигаю скобки. Проблема в том, что приведенное выше условие может быть переписано как if (10 mod 3) = 1 then ...
или благодаря приоритету оператора как if 10 mod 3 = 1 then ...
У меня есть типичная грамматика LL(1) для арифметических выражений:
E -> TE'
E' -> ADD_SUB TE' | epsion
T -> FT'
T' -> MUL_DIV FT' | epsilon
F -> 'number' | '(' E ')'
ADD_SUB -> '+' | '-'
MUL_DIV -> '*' | 'div' | 'mod'
Однако я не могу придумать грамматику LL (1) для всего условия. Я подумал о чем-то вроде:
CE -> CT CE'
CE' -> 'or' CT CE' | epsion
CT -> CF CT'
CT' -> 'and' CF CT' | epsilon
CF -> E REL-OP E | '(' E REL-OP E ')' | 'not' E REL-OP E
REL-OP -> '=' | '<' | '<=' | '>' | '>=' | '<>
Где E
— это E
из приведенной выше грамматики арифметических выражений.
Это не LL(1), потому что правила CF -> E REL_OP E
и CF -> '(' E REL-OP E ')'
содержат коллизию '('
первый-первый.
Любые идеи, как исправить первое столкновение?