Почему JFlap не может построить полезный анализатор LL (1) из моей грамматики калькулятора? - PullRequest
1 голос
/ 29 мая 2020

Я ввел следующую грамматику в JFlap:

E → TK
K → +TK
K → λ
T → FM
M → *FM
M → λ
F → i
F → (E)

и попытался разобрать i * (i + i). Я уверен, что грамматика LL (1) верна и вводимая строка должна быть принята, но JFlap сказал, что строка отклонена. (Смотрите скриншот). Почему?

Screenshot of My Grammar

1 Ответ

0 голосов
/ 29 мая 2020

Грамматика в порядке.

Однако вы как-то неправильно его ввели. Обратите внимание, что в вашей таблице синтаксического анализа есть столбец λ. Это означает, что JFlap интерпретировал λ как символ, а не как пустую правую часть, вероятно, потому, что вы ввели реальный λ, а не позволили JFlap заполнить его автоматически. Вы должны просто оставить правую часть пустой, если вы хотите пустую правую часть. Затем JFlap покажет это как λ, но не будет рассматривать его как символ.

В качестве иллюстрации, вот скриншоты правильно введенной грамматики (с пустыми правыми сторонами) и грамматики, где I набрал λ вместо того, чтобы оставить правую часть пустой. Я остановил второй синтаксический анализ на один шаг раньше, чем сообщение об ошибке, чтобы вы могли увидеть сообщаемую проблему: поскольку M не имеет пустой продукции, он блокирует синтаксический анализатор от распознавания знака +.

Вот правильно введенная грамматика:

enter image description here

А вот тот, который я сгенерировал так же, как и вы (если моя догадка верна). Обратите внимание, что в таблице переходов есть столбец λ. Вы также можете увидеть, что это обрабатывается по-разному в наборах FIRST и FOLLOW.

enter image description here

Как постскриптум, JFlap, кажется, обрабатывает большинство символов Unicode в токенах, но использование символа λ в качестве токена вызывает множество ошибок. Так что вам не следует этого делать, даже если вы хотели, чтобы λ был законным персонажем.

...