Я думаю, что проблема здесь в том, что язык имеет абстрактный синтаксис , который выглядит так:
E ::= E + E | E - E | E * E | E / E | Int | (E)
, но на самом деле это реализуется с помощью конкретного синтаксиса который используется для указания ассоциативности и приоритета.Итак, если вы пишете рекурсивный приличный синтаксический анализ, вы неявно вписываете в него конкретный синтаксис, и это нормально, хотя, возможно, было бы неплохо указать его точно также как грамматическую фразу!
Есть пара проблем с вашей грамматикой, если она должна быть полноценной конкретной грамматикой.Прежде всего, вам нужно добавить произведения, чтобы просто «перейти на следующий уровень вниз», поэтому немного ослабьте ваш синтаксис:
Expr ::= Term + Term | Term - Term | Term
Term ::= Factor * Factor | Factor / Factor | Factor
Factor ::= INTEGER | (Expr)
В противном случае невозможно получить правильные предложения, начиная с начального символа (в этом случае Expr).Например, как бы вы получили «1 * 2» без этих дополнительных производств?
Expr -> Term
-> Factor * Factor
-> 1 * Factor
-> 1 * 2
Мы можем видеть, что другие грамматики обрабатывают это немного по-другому:
Expr -> Term Expr'
-> Factor Term' Expr'
-> 1 Term' Expr'
-> 1 * Factor Term' Expr'
-> 1 * 2 Term' Expr'
-> 1 * 2 ε Expr'
-> 1 * 2 ε ε
= 1 * 2
, ноэто дает тот же эффект.
Ваш анализатор на самом деле неассоциативен.Чтобы увидеть это, спросите, как будет проанализирован E + E + E
, и обнаружите, что это невозможно.В зависимости от того, что потребляется +
первым, мы получаем E
с одной стороны и E + E
с другой, но затем мы пытаемся проанализировать E + E
как Term
, что невозможно.Эквивалентно, подумайте о том, чтобы извлечь это выражение из начального символа, опять же, это невозможно.
Expr -> Term + Term
-> ? (can't get another + in here)
Другая грамматика является ассоциативной слева, так как может быть получена произвольно длинная строка E + E + ... + E
.
Так или иначе, чтобы подвести итог, вы правы, что при написании RDP вы можете реализовать любую конкретную версию абстрактного синтаксиса, которая вам нравится, и вы, вероятно, знаете гораздо больше оэто, чем я.Но есть эти проблемы при попытке создать грамматику, которая точно описывает ваш RDP.Надеюсь, это поможет!