1

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

 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”令牌?

4

3 回答 3

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 无法应对这样的左递归。让我知道它是否不起作用。

于 2013-03-09T15:22:06.017 回答
0

我找到了添加新令牌的解决方案,为此我将其放在开头:

 tokens {
     VAR;
 }

然后我就可以使用它了。

于 2013-03-09T16:28:45.723 回答
0

周围有很多正确的C 语法,为什么不使用其中的一种呢?或者至少从那里开始?

于 2013-03-09T17:14:26.330 回答