有没有一种定义 Lexer 规则的方法,例如:
DESCRIPTOR :   'INIT'(.)*'END';
那么DESCRIPTOR返回INIT和END这两个标签之间的内容呢?
我想我可以使用返回值,例如:
DESCRIPTOR returns [String content]
@init {
   content="";
}: 'INIT'(.)*'END';
但我不明白如何获得这样的价值。
请注意,词法分析器规则(以大写开头的规则)不能有returns子句,只有解析器规则可以。
但是规则:
DESCRIPTOR :   'INIT' (.)* 'END';
工作得很好。默认情况下,ANTLR 不情愿地(不情愿地)匹配.*,.+因此上面的规则匹配 "INIT" 后跟零个或多个字符,直到第一个"END".
啊,你想从令牌中去掉"INIT"and 。"END"你可以这样做:
DESCRIPTOR 
 : 'INIT' .* 'END' {setText($text.substring(4, $text.length() - 3));}
 ;
where$text是简写getText()(即标记匹配的整个字符串)。