1

我有一个非常简单的键/值语法(不是我正在研究的实际语法,但这是我能想到的最简单的语法,它显示了我的问题),它似乎与 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'

我究竟做错了什么?

4

1 回答 1

3

语法编译器应该发出关于.+在词法分析器中使用贪婪的警告。

VALUE规则的字面意思是“尽可能多地使用字符,而不考虑字符是什么”。如果您的输入不完全是 helloor ,那么您的词法分析器将使用包含整个输入:的单个标记。VALUE

也许以下词法分析器更接近您所追求的:

lexer grammar textLexer;

HELLO : 'hello';
COLON : ':' -> pushMode(ValueMode);

mode ValueMode;

    VALUE : ~[\r\n]+ -> popMode;
于 2012-12-27T03:03:34.910 回答