2012-12-27 124 views
1

我有一個非常簡單的鍵/值語法(不是我正在處理的實際語法,但這是最簡單的,我可以拿出來顯示我的問題),似乎有問題詞法對照順序在ANTLR 4.0b4中。語法是:ANTLR4鍵/值語法

grammar test; 

r  : HELLO COLON VALUE; 
HELLO : 'hello'; 
COLON : ':'; 
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' 

我在做什麼錯?

回答

3

語法編譯器應該發出關於在詞法分析器中使用貪婪.+的警告。

VALUE規則的字面意思是「儘可能多地使用字符,而不考慮字符是什麼」。如果你的輸入不是正好是hello:,那麼你的詞法分析器將會消耗一個包含整個輸入的token。

也許下面詞法分析器更接近你追求的:

lexer grammar textLexer; 

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

mode ValueMode; 

    VALUE : ~[\r\n]+ -> popMode; 
+1

好吧,這點我在正確的方向。我認爲絕對令牌將首先被解析,但看起來像我需要限制貪婪的解析片段,以便它們不會猖獗。謝謝! – jgm