我正在尝试使用我的C语法构建一个AST,可以找到here。但是,它不考虑操作的优先级,例如,当我输入此代码时:
l = k*j*5 - 10;
我明白了:
操作由以下代码管理:
multiplicative_expression
: primary_expression (('*'^ additive_expression) | ('/'^ additive_expression) | ('%'^ additive_expression) )*
;
additive_expression
: multiplicative_expression (('+'^ multiplicative_expression) | ('-'^ multiplicative_expression))*
;
有解决方法吗?
另一个问题是,有没有办法在构建AST时添加特殊标记? 例如:
A B C -> ^( "VAR" B C)
VAR是只能在AST中看到的新令牌。
是否可以通过别的方式重命名'nil'标记?
答案 0 :(得分:1)
我不是ANTLR的专家,但这不应该是你想要的吗?
multiplicative_expression
: primary_expression (('*'^|'/'^|'%'^) multiplicative_expression)*
;
additive_expression
: multiplicative_expression (('+'^|'-'^) multiplicative_expression)*
;
编辑:很高兴它适合你。对于Daniel Fischer关于关联性的观点,我想到的解决方案是
multiplicative_expression
: primary_expression |
(multiplicative_expression ('*'^|'/'^|'%'^) primary_expression)
;
additive_expression
: multiplicative_expression |
(additive_expression ('+'^|'-'^) multiplicative_expression)
;
然而,我似乎记得曾经读过,ANTLR在某一点上无法应对左递归。如果它不起作用,请告诉我。
答案 1 :(得分:0)
我找到了添加新令牌的解决方案,为此我把它放在开头:
tokens {
VAR;
}
然后我可以使用它。
答案 2 :(得分:0)
周围有很多正确的C grammars,为什么不使用其中一个呢?或者至少从那里开始?