Я собираюсь предположить, что B, C и D являются терминалами. И я собираюсь добавить еще один нетерминал
START --> A <EOF>
A --> <B> AP APP
| <C> AP APP
AP --> A AP | {}
APP --> <D> AP APP | {}
Первый выбор явно решаем на один знак будущего. Для второго выбора нам нужно, чтобы первый набор A AP
не отличался от следующего набора AP
; первый - {<B>, <C>}
, а второй - {<EOF>,<D>}
. Для третьего варианта нам нужно, чтобы <D>
не входило в следующий набор APP
, который равен {<EOF>}
.
Теперь мы знаем, что грамматика - это LL (1), поэтому она должна работать с JavaCC.
Примечание: определить, будет ли грамматика работать с JavaCC, немного сложнее, потому что JavaCC не рассчитывает наборы следования в точности так, как говорит теория, и потому что JavaCC имеет много механизмов, которые позволяют ему работать с не-LL (1 Грамматика Но обычно, если ваша грамматика LL (1), JavaCC справится с этим. Также, если JavaCC не будет работать, выдается предупреждение.