Следующая простая грамматика «выражения калькулятора» (BNF) может быть легко проанализирована с помощью тривиального синтаксического анализатора с рекурсивным спуском, который является прогнозирующим LL (1):
<expr> := <term> + <term>
| <term> - <term>
| <term>
<term> := <factor> * <factor>
<factor> / <factor>
<factor>
<factor> := <number>
| <id>
| ( <expr> )
<number> := \d+
<id> := [a-zA-Z_]\w+
Потому что всегда достаточно увидеть следующий токен, чтобы узнать правило выбора. Однако предположим, что я добавляю следующее правило:
<command> := <expr>
| <id> = <expr>
Для взаимодействия с калькулятором в командной строке, с переменными, например:
calc> 5+5
=> 10
calc> x = 8
calc> 6 * x + 1
=> 49
Правда ли, что я не могу использовать простой прогностический синтаксический анализатор LL (1) для разбора <command>
правил? Я попытался написать парсер для него, но мне кажется, мне нужно знать больше токенов вперед. Является ли решение использовать возвратный путь, или я могу просто реализовать LL (2) и всегда смотреть на два токена вперед?
Как генераторы синтаксических анализаторов RD справляются с этой проблемой (например, ANTLR)?