dav*_*tto 5 java production parsing antlr rules
让我们假设使用2个ANTLR语法的以下场景:
1)
expr : antExp+;
antExpr : '{' T '}' ;
T : 'foo';
Run Code Online (Sandbox Code Playgroud)
2)
expr : antExpr;
antExpr : '{' T* '}' ;
T : 'bar';
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我都需要知道如何迭代antExp +和T*,因为我需要为它们的每个元素生成一个ArrayList.当然我的语法更复杂,但我认为这个例子应该解释我需要什么.谢谢!
ANTLR中的生产规则可以有一个或多个返回类型,您可以在循环(a (...)*或(...)+)中引用它们.所以,假设您要打印规则匹配的每个T文本antExp.这可以这样做:
expr
: (antExp {System.out.println($antExp.str);} )+
;
antExpr returns [String str]
: '{' T '}' {$str = $T.text;}
;
T : 'foo';
Run Code Online (Sandbox Code Playgroud)
同样的原则也适用于语法#2:
expr : antExpr;
antExpr : '{' (T {System.out.println($T.text);} )* '}' ;
T : 'bar';
Run Code Online (Sandbox Code Playgroud)
请注意,您不仅限于返回单个引用.运行从以下位置生成的解析器:
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();};
Run Code Online (Sandbox Code Playgroud)
在输入"aaa bbb ccc"上将打印以下内容:
aaa
[aaa, bbb, ccc]
Run Code Online (Sandbox Code Playgroud)