ANTLR 无法区分expression
s。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?)
;
或类似的东西。您可以在重写规则中{
使用纯目标代码。}