Я пытаюсь сделать компиляторы на javacc, но я не уверен, что следующее является законным при удалении левой рекурсии:
A = B AP APP
| C AP APP
AP = A AP | {}
APP = (D AP) APP | {}
Я пытаюсь сделать компиляторы на javacc, но я не уверен, что следующее является законным при удалении левой рекурсии:
A = B AP APP
| C AP APP
AP = A AP | {}
APP = (D AP) APP | {}
Я собираюсь предположить, что 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 не работает, выдается предупреждающее сообщение.