1

有没有一种定义 Lexer 规则的方法,例如:

DESCRIPTOR :   'INIT'(.)*'END';

那么DESCRIPTOR返回INIT和END这两个标签之间的内容呢?

我想我可以使用返回值,例如:

DESCRIPTOR returns [String content]
@init {
   content="";
}: 'INIT'(.)*'END';

但我不明白如何获得这样的价值。

4

1 回答 1

1

请注意,词法分析器规则(以大写开头的规则)不能有returns子句,只有解析器规则可以。

但是规则:

DESCRIPTOR :   'INIT' (.)* 'END';

工作得很好。默认情况下,ANTLR 不情愿地(不情愿地)匹配.*.+因此上面的规则匹配 "INIT" 后跟零个或多个字符,直到第一个"END".

编辑

啊,你想从令牌中去掉"INIT"and 。"END"你可以这样做:

DESCRIPTOR 
 : 'INIT' .* 'END' {setText($text.substring(4, $text.length() - 3));}
 ;

where$text是简写getText()(即标记匹配的整个字符串)。

于 2012-07-17T14:31:08.077 回答