Грамматика в порядке.
Однако вы как-то неправильно его ввели. Обратите внимание, что в вашей таблице синтаксического анализа есть столбец λ. Это означает, что JFlap интерпретировал λ как символ, а не как пустую правую часть, вероятно, потому, что вы ввели реальный λ, а не позволили JFlap заполнить его автоматически. Вы должны просто оставить правую часть пустой, если вы хотите пустую правую часть. Затем JFlap покажет это как λ, но не будет рассматривать его как символ.
В качестве иллюстрации, вот скриншоты правильно введенной грамматики (с пустыми правыми сторонами) и грамматики, где I набрал λ вместо того, чтобы оставить правую часть пустой. Я остановил второй синтаксический анализ на один шаг раньше, чем сообщение об ошибке, чтобы вы могли увидеть сообщаемую проблему: поскольку M
не имеет пустой продукции, он блокирует синтаксический анализатор от распознавания знака +
.
Вот правильно введенная грамматика:
А вот тот, который я сгенерировал так же, как и вы (если моя догадка верна). Обратите внимание, что в таблице переходов есть столбец λ. Вы также можете увидеть, что это обрабатывается по-разному в наборах FIRST и FOLLOW.
Как постскриптум, JFlap, кажется, обрабатывает большинство символов Unicode в токенах, но использование символа λ в качестве токена вызывает множество ошибок. Так что вам не следует этого делать, даже если вы хотели, чтобы λ был законным персонажем.