Грамматики, основанные на алгебраических выражениях, довольно сложно устранить.Вот несколько примеров проблем, которые необходимо решить:
a + b + c естественным образом создает два дерева разбора.Чтобы решить эту проблему, вам необходимо устранить неоднозначность ассоциативности +.Вы можете пожелать, чтобы стратегия синтаксического анализа слева направо позаботилась об этом за вас, но будьте осторожны: возведение в степень, вероятно, должно ассоциироваться справа налево.
a + b * c естественным образом создает два дерева разбора.Чтобы решить эту проблему, вам нужно иметь дело с приоритетом оператора.
неявное умножение (a + bc), если это разрешено, создает всевозможные кошмары, в основном при токенизации.
Унарное вычитание проблематично, как вы упоминаете.
Если мы хотим решить эти проблемы, но по-прежнему имеем грамматику быстрого анализа, специализированную для алгебры, один из подходов состоит в том, чтобы иметь различные «уровни» EXPR, по одному для каждого уровня связывания, требуемого уровнями приоритета.Например,
TERM -> (S)
EXPO -> TERM ^ EXPO
PROD -> PROD * EXPO
PROD -> PROD / EXPO
PROD -> -PROD
SUM -> SUM + PROD
SUM -> SUM - PROD
S -> SUM
Для этого также необходимо разрешить «продвижение» типов: SUM -> PROD, PROD -> EXP, EXP -> TERM и т. Д., Чтобы все могло завершиться.
Надеюсь, это поможет!