Поскольку F
и G
идентичны, анализатор, работающий сверху вниз, не сможет обработать грамматику, в которой оба возможных предсказания. (Здесь мы не видим определения I
, но если случится так, что lpar ∈ FIRST(I)
, то даже у анализатора снизу вверх будут проблемы.)
Простое решение состоит в том, чтобы Устраните избыточность, используя только одно из этих производств в обоих контекстах.
Для синтаксического анализатора с нисходящим потоком вам все равно потребуется левосторонний фактор, поскольку B
и C
по-прежнему имеют одинаковые FIRST
наборы. Простое решение может быть:
A ⇒ B'
| intnum
| floatnum
| lpar D rpar
| not A
| E A .
B' ⇒ F C' .
C' ⇒ I
| lpar rpar .
При условии, что lpar ∉ FIRST(I)
(и аналогичные гарантии для E
), этот фрагмент является LL (1).
Насколько это применимо к вашему полная грамматика зависит от степени упрощения этого фрагмента. Существуют варианты этой проблемы, которые чрезвычайно трудно решить для парсера LL (1), но относительно просты для парсера LR (1) (или парсера LR (k) для малых k). В частности, ваша оригинальная грамматика, даже с избыточностью F
и G
, является LALR (1) (протестировано с Bison).