我需要知道如何为表达式创建语法以创建解析器和 ast。我有四个优先级:
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 遵循的顺序是下一个:
Take 7 with Exp in Exps, 跟随 Val
转到 RExp 并继续 RExp3。
取“*”,然后返回 Exps。
我在纸上看到的树是下一个:
*
/ \
3 +
/ \
7 5
我应该拥有的树是下一个:
+
/ \
* 5
/ \
7 5