5

让我们假设以下具有 2 个 ANTLR 语法的场景:

1)

expr     : antExp+;
antExpr  : '{' T '}' ;
T        : 'foo';

2)

expr     : antExpr; 
antExpr  : '{' T* '}' ;
T        : 'bar';

在这两种情况下,我都需要知道如何迭代 antExp+ 和 T*,因为我需要为它们的每个元素生成一个 ArrayList。当然我的语法更复杂,但我认为这个例子应该解释我需要什么。谢谢!

4

1 回答 1

6

ANTLR 中的生产规则可以有一个或多个返回类型,您可以在循环中引用它们(a(...)*(...)+)。因此,假设您要打印规则匹配的每个T's 文本。antExp这可以这样做:

expr
 : (antExp {System.out.println($antExp.str);} )+
 ;

antExpr returns [String str]
 : '{' T '}' {$str = $T.text;}
 ;

T : 'foo';

相同的原则适用于例如语法 #2:

expr     : antExpr; 
antExpr  : '{' (T {System.out.println($T.text);} )* '}' ;
T        : 'bar';

编辑

请注意,您不限于返回单个引用。运行从以下位置生成的解析器:

grammar T;  

parse
 : ids {System.out.println($ids.firstId + "\n" + $ids.allIds);}
 ;

ids returns [String firstId, List<String> allIds]
@init{$allIds = new ArrayList<String>();}
@after{$firstId = $allIds.get(0);}
 : (ID {$allIds.add($ID.text);})+
 ;

ID    : ('a'..'z' | 'A'..'Z')+;
SPACE : ' ' {skip();};

在输入"aaa bbb ccc"上将打印以下内容:

aaa
[aaa, bbb, ccc]
于 2012-04-30T17:25:03.527 回答