我可以更改令牌与上一个“更多”命令匹配的方式吗?

时间:2018-08-08 03:04:52

标签: antlr4

我的语法有些复杂,我不得不使用词汇模式。要退出我的一种模式,我需要匹配在下一种模式下语义上有意义的令牌。但是,public static string stopWriteFileHalfWay(string option) { string filePath = @"d:\test\test.txt"; using (StreamWriter sw = File.AppendText(filePath)) { sw.WriteLine("line 1"); return "after line 3"; // => exit and do not want to create and write any file sw.WriteLine("line 2"); } return "completed"; } 命令的行为似乎不符合我的预期。这是一个简化的语法来说明:

FooLexer.g4

more

test.input

lexer grammar FooLexer;

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

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

mode FINDBAR;

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

foobarfoo 的输出:

grun FooLexer tokens -encoding utf-8 -tokens test.input

重新输入默认模式时,我想匹配[@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] 而不是BARFOO。目前,我将FOO与内容“ barfoo”匹配。

1 个答案:

答案 0 :(得分:0)

给出

  

我需要匹配下一个在语义上有意义的令牌   模式。

尝试-

IocManager.IocContainer.Register(
    Component.For<IRealTimeNotifier>()
        .ImplementedBy<EmailNotifier>()
        .Named("Email")
        .LifestyleTransient()
);

在退出时发出所需的FOO: 'foo' -> pushMode(FINDBAR); BARFOO: 'barfoo'; mode FINDBAR; EXIT: 'barfoo' -> type(BARFOO),popMode; OOPS: [\r\n]+; 令牌。


使用BARFOO不能实现任何等效功能,因为more属性无法更改任何规则匹配的内容。它只会累积匹配(和消耗)的文本,以包含在实际发出的下一个令牌(下一个不再更多的令牌)中。

因此,more规则不会产生令牌。与EXIT相匹配的文本会累积到EXIT令牌FOO

的文本中