1

我试图让我的语法支持变量声明,您不必重复变量类型,例如int i = 3, j = 4, k;

我遇到的问题是我生成的树。这是我的规矩...

varDeclaration
:   type ID (ASSIGN expression)? (COMMA ID (ASSIGN expression)?)* SEMICOLON -> ^(VAR_DECL type ID expression?)+;

它成功地将声明拆分为单独的变量声明,但它正在为所有这些声明重复表达式树。

所以对于,它们在 AST 中int x = 4, y = 5都有价值。4

对操作员的任何帮助或我可以使用的东西将不胜感激。

4

1 回答 1

2

ANTLR 无法区分expressions。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?)
 ;

或类似的东西。您可以在重写规则中{使用纯目标代码。}

于 2012-09-10T20:11:02.900 回答