用c语法构建ast时管理操作优先级

时间:2013-03-09 14:54:40

标签: c operators antlr grammar antlr3

我正在尝试使用我的C语法构建一个AST,可以找到here。但是,它不考虑操作的优先级,例如,当我输入此代码时:

 l = k*j*5 - 10;

我明白了:

AST

操作由以下代码管理:

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'标记?

3 个答案:

答案 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,为什么不使用其中一个呢?或者至少从那里开始?