我有一个非常简单的键/值语法(不是我正在处理的实际语法,但这是我能提出的最简单的语法,显示我的问题)似乎在ANTLR中的词法分析器匹配顺序有问题4.0b4。语法是:
grammar test;
r : HELLO COLON VALUE;
HELLO : 'hello';
COLON : ':';
VALUE : .+;
鉴于这个语法和输入'hello:world',我希望它能正确解析,但是看起来整个输入被拉入单个VALUE令牌并因此失败:
hello:world
[@0,0:11='hello:world\n',<3>,1:0]
[@1,12:11='<EOF>',<-1>,2:12]
line 1:0 mismatched input 'hello:world\n' expecting 'hello'
我做错了什么?
答案 0 :(得分:3)
语法编译器应该发出关于在词法分析器中使用贪心.+
的警告。
VALUE
规则字面上说“尽可能多地使用字符,而不考虑字符是什么”。如果您的输入不是完全 hello
或:
,那么您的词法分析器将使用包含整个输入的单个VALUE
标记。
也许下面的词法分析器更接近你所追求的目标:
lexer grammar textLexer;
HELLO : 'hello';
COLON : ':' -> pushMode(ValueMode);
mode ValueMode;
VALUE : ~[\r\n]+ -> popMode;