Грамматика для выражений. Четыре уровня приоритета. 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 

0 ответов

Другие вопросы по тегам