我的语法有些复杂,我不得不使用词汇模式。要退出我的一种模式,我需要匹配在下一种模式下语义上有意义的令牌。但是,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”匹配。
答案 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