<start>
<expr>
<expr><expr>
<expr><expr><expr>
<term><term><term>
'abc'
Это неоднозначно, потому что на третьем шаге вы можете расширить либо первый <expr>
, либо последний. Вы должны быть в состоянии обойти это, удалив
<expr> -> <expr> { <expr> }
и создать
<term> -> <term> <expr>
вместо.
Вы повторяетесь здесь
<term> -> '(' <expr> ')' | <char> // Grouping
| <char>
(у вас есть <char>
два раза, вы хотели иметь это '(' <expr> ')' '|' <char>
в первом правиле?) Думаю, было бы яснее удалить
<term> -> '(' <expr> ')'
и создайте
<expr> -> '(' <expr> ')'
вместо.
Затем вам также нужно добавить кавычки вокруг символов в <char>
.
Это то, что я вижу по быстрому просмотру вашего EBNF, прошло много времени с тех пор, как я сам изучал это, поэтому некоторые из моих исправлений могут быть неверными.