JavaCC оставил вопрос разбора рекурсии о законности нарушения грамматики

Я пытаюсь сделать компиляторы на javacc, но я не уверен, что следующее является законным при удалении левой рекурсии:

A = B AP APP
      | C AP APP

AP = A AP | {}

APP = (D AP) APP | {}

person Community    schedule 08.11.2018    source источник
comment
В вопросе недостаточно информации для ответа. Какие терминалы и какие нетерминалы? Какой нетерминал является начальным нетерминалом? Получив ответы на эти вопросы, вы можете сказать, является ли грамматика LL(1). Если это так, то он должен работать с JavaCC.   -  person Theodore Norvell    schedule 11.11.2018


Ответы (1)


Я собираюсь предположить, что 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 не работает, выдается предупреждающее сообщение.

person Theodore Norvell    schedule 11.11.2018