JavaCC оставил вопрос разбора рекурсии о законности разбиения грамматики - PullRequest
0 голосов
/ 08 ноября 2018

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

A = B AP APP
      | C AP APP

AP = A AP | {}

APP = (D AP) APP | {}

1 Ответ

0 голосов
/ 11 ноября 2018

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

...