我正在尝试允许我的语法支持变量声明,而不必重复变量类型,例如int i = 3, j = 4, k;
我遇到的问题是我生成的树。这是我的规则......
varDeclaration
: type ID (ASSIGN expression)? (COMMA ID (ASSIGN expression)?)* SEMICOLON -> ^(VAR_DECL type ID expression?)+;
它成功地将声明拆分为单独的变量声明,但它正在为所有声明重复表达式树。
因此对于int x = 4, y = 5
,它们在AST中都具有值4
。
对操作员的任何帮助或我可以使用的东西都将不胜感激。
答案 0 :(得分:2)
ANTLR无法在expression
之间产生干扰。 AFAIK,你必须创建一个“助手”规则。
快速演示:
options {
output=AST;
ASTLabelType=CommonTree; // <- important, otherwise `$t.tree` returns an Object instead of a CommonTree
}
tokens {
VAR_DECLS;
VAR_DECL;
}
// ...
varDeclaration
: t=type assign[$t.tree] (COMMA assign[$t.tree])* SEMICOLON -> ^(VAR_DECLS assign+)
;
assign[CommonTree type]
: ID (ASSIGN expression)? -> ^(VAR_DECL {type} ID expression?)
;
// ...
现在您的输入将生成以下AST:
请注意,所有VAR_DECL
个节点的类型节点都相同。这可能不是问题(因为此节点很可能不会更改),但如果您希望每个VAR_DECL
节点都有自己的类型节点实例,请执行以下操作:
assign[CommonTree type]
: ID (ASSIGN expression)? -> ^(VAR_DECL {new CommonTree(type)} ID expression?)
;
或类似的东西。您可以在重写规则中的{
和}
内使用纯目标代码。