有没有一种定义 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()
(即标记匹配的整个字符串)。