Грамматика для выражений. Четыре уровня приоритета. LL(1)
Мне нужно знать, как сделать грамматику для выражений, чтобы создать синтаксический анализатор и аст. У меня есть четыре уровня приоритета:
1. ** !
2. * / % &
3. + - ^ |
4. <= >= < >
Я сделал это:
Exps -> RExp4
RExp4 -> OpEq Exps | RExp3
RExp3 -> OpAd Exps | RExp2
RExp2 -> OpMul Exps | RExp1
RExp1 -> OpExp Exps | Exp
Exp -> Val | '('Exps')'
OpExp -> ** | !
OpMul -> * | / | % | &
OpAd -> + | - | ^
OpEq -> <= | >= | < | >
Val -> Id | Int
Я не уверен, сработает ли это, потому что, когда я делаю дерево на бумаге, я не получаю правильную форму для таких выражений, как:
x*7+7
В основном потому, что я делаю сумму в первую очередь. Моя грамматика должна быть LL(1) и рекурсивной по праву, потому что мой компилятор будет сверху вниз.
Спасибо за помощь и извините за мой английский
редактировать
Извините, я ошибся, я имею в виду парсер сверху вниз. Проблема, которую я вижу на бумаге, следующая. Например, у меня есть следующее выражение "7*5+5", и порядок, которым следует мой BNF, следующий:
Возьмите 7 с Exp в Exps, которые следуют за Val
Перейти к RExp и продолжить RExp3.
Возьмите * и вернитесь к Exps.
Дерево, которое я вижу на бумаге, выглядит следующим образом:
*
/ \
3 +
/ \
7 5
Дерево, которое я должен иметь, следующее:
+
/ \
* 5
/ \
7 5