ANTLR Lexer子串

ANTLR Lexer子串,antlr,lexer,Antlr,Lexer,是否有一种定义Lexer规则的方法,如: DESCRIPTOR : 'INIT'(.)*'END'; 描述符返回两个标签INIT和END之间的内容 我想我可以使用返回值,例如: DESCRIPTOR returns [String content] @init { content=""; }: 'INIT'(.)*'END'; 但是我不知道如何访问这样的值。请注意,lexer规则(以大写字母开头的规则)不能有返回子句,只有解析器规则可以 但规则是: DESCRIPTOR : '

是否有一种定义Lexer规则的方法,如:

DESCRIPTOR :   'INIT'(.)*'END';
描述符返回两个标签INIT和END之间的内容

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

DESCRIPTOR returns [String content]
@init {
   content="";
}: 'INIT'(.)*'END';
但是我不知道如何访问这样的值。

请注意,lexer规则(以大写字母开头的规则)不能有
返回
子句,只有解析器规则可以

但规则是:

DESCRIPTOR :   'INIT' (.)* 'END';
很好用。默认情况下,ANTLR不情愿地匹配
*
+
,因此上面的规则匹配“INIT”,后跟零个或多个字符,直到第一个
“END”

编辑 啊,您想从令牌中去掉
“INIT”
“END”
。您可以按如下方式执行此操作:

DESCRIPTOR 
 : 'INIT' .* 'END' {setText($text.substring(4, $text.length() - 3));}
 ;
其中,
$text
getText()
的缩写(即标记匹配的整个字符串)。

请注意,lexer规则(以大写字母开头的规则)不能包含
returns
子句,只有解析器规则可以

但规则是:

DESCRIPTOR :   'INIT' (.)* 'END';
很好用。默认情况下,ANTLR不情愿地匹配
*
+
,因此上面的规则匹配“INIT”,后跟零个或多个字符,直到第一个
“END”

编辑 啊,您想从令牌中去掉
“INIT”
“END”
。您可以按如下方式执行此操作:

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

其中,
$text
getText()
的缩写(即令牌匹配的整个字符串)。

谢谢,巴特。假设我有下面的句子,这是一个测试结束。如果我能拿到“这是一个测试”的文本,我现在想知道。谢谢,巴特。假设我有下面的句子,这是一个测试结束。我现在想知道我是否能得到“这是一个测试”的文本。