Antlr4 我是否可以更改令牌与前一个“标记”的匹配方式;“更多”;命令

Antlr4 我是否可以更改令牌与前一个“标记”的匹配方式;“更多”;命令,antlr4,Antlr4,我的语法有点复杂,我不得不使用词汇模式。要退出我的一个模式,我需要匹配一个在下一个模式中具有语义意义的标记。但是,more命令的行为似乎不像我预期的那样。下面是一个简化的语法来说明: 愚人节 lexer grammar FooLexer; IGNORE: [\r\n]+ -> skip; FOO: 'foo' -> pushMode(FINDBAR); BARFOO: 'barfoo'; mode FINDBAR; EXIT: 'bar' -> more,popMode

我的语法有点复杂,我不得不使用词汇模式。要退出我的一个模式,我需要匹配一个在下一个模式中具有语义意义的标记。但是,
more
命令的行为似乎不像我预期的那样。下面是一个简化的语法来说明:

愚人节

lexer grammar FooLexer;

IGNORE: [\r\n]+ -> skip;

FOO: 'foo' -> pushMode(FINDBAR);
BARFOO: 'barfoo';

mode FINDBAR;

EXIT: 'bar' -> more,popMode;
OOPS: [\r\n]+;
测试输入

foobarfoo
来自
grun-Goodexer令牌-编码utf-8-令牌测试的输出。输入

[@0,0:2='foo',<'foo'>,1:0]
[@1,3:8='barfoo',<'foo'>,1:3]
[@2,9:9='\n',<OOPS>,1:9]
[@3,10:9='<EOF>',<EOF>,2:0]
[@0,0:2='foo',1:0]
[@1,3:8='barfoo',1:3]
[@2,9:9='\n',1:9]
[@3,10:9='',,2:0]
我想在重新进入默认模式时匹配
BARFOO
,而不是
FOO
。目前,我将
FOO
与给定的内容“barfoo”匹配

我需要匹配一个在下一节中具有语义意义的标记 模式

试试这个--

在退出时发出所需的
BARFOO
标记


由于
more
属性不能改变任何规则所匹配的内容,因此使用
more
无法实现任何等效。它只累积匹配(和消耗)的文本,以便包含到实际发出的下一个标记(下一个未加更多标记)中


因此,
退出
规则不生成令牌。
EXIT
匹配的文本被累积到
FOO
标记
[@1,3:8='barfoo',1:3]

的文本中。不幸的是,对于我的特定示例,我有多种模式(因此语义不同),因此我需要重新思考如何处理语法。不过,你的回答很有帮助,谢谢!
FOO: 'foo' -> pushMode(FINDBAR);
BARFOO: 'barfoo';

mode FINDBAR;
  EXIT: 'barfoo' -> type(BARFOO),popMode;
  OOPS: [\r\n]+;