Грамматика имеет только одно рекурсивное правило: последнее, где R - символ слева, а также появляется справа. Это правильно-рекурсивно, потому что в правиле грамматики R является самым правым символом. Правило относится к R, и эта ссылка является самой правой.
язык является LL (1). Как мы знаем, это то, что мы можем легко построить рекурсивный синтаксический анализатор спуска, который не использует никакого обратного отсчета и не более одного знака lookahead.
Но такой синтаксический анализатор будет основан на слегка модифицированной версии грамматики.
Например, два производства: S -> a
и S -> a T
могут быть объединены в один, который может быть выражен EBNF S -> a [ T ]
. (S
получает a
, а затем дополнительно T
). Это правило может обрабатываться с помощью одной функции синтаксического анализа для распознавания S
.
Функция соответствует a
, а затем ищет необязательный T
, который будет обозначаться следующим символом ввода: b
.
Мы можем написать LL (1) грамматикой для этого вдоль этих линий:
S -> a T_opt
T_opt -> b R_opt
T_opt -> <empty>
... et cetera
необязательность T
обрабатывается явным образом, делая T
(который мы переименуем в T_opt
), способный получения пустого string, а затем сжимается до одного правила для S
, так что у нас нет двух фраз, начинающихся с a
.
Итак, язык LL (1), но данная грамматика для него не является. Поскольку язык LL (1), можно найти другую грамматику, которая является LL (1), и что грамматика не за горами.
У него нет * есть *, чтобы быть рекурсивным, но он не должен быть леворекурсивным. –