Я пишу парсер рекурсивного спуска для логических выражений, например:
(1 * 0)
(0 + ~1)
(0 * (1 + c)
Где 1 — «Истина», 0 — «Ложь», + — «или», * — «и», ~ — «не», а «с» — просто имя переменной (это может быть любая буква алфавита). Я планирую использовать круглые скобки, а не реализовывать какой-то порядок операций.
Мой текущий синтаксический анализатор может распознавать следующую форму выражения
Expression ::= 1
| 0
| Character
| ~ Expression
Но я не уверен, как бы я реализовал + и * поверх этого. Я вполне уверен из того, что я прочитал об очевидной реализации
Expression ::= 1
| 0
| Character
| ( Expression + Expression )
| ( Expression * Expression )
Вызовет бесконечный цикл, поскольку он «леворекурсивный». Я не уверен, как изменить это, чтобы удалить такую бесконечную рекурсию.