2017-01-09 58 views
2

我有一個令牌定義問題。antlr4類似的令牌定義

這是我的語法。

r: PROPNAME ':' PROPVALUE 
PROPNAME: [a-zA-Z]+ 
PROPVALUE: [a-zA-Z0-9]+ 

如果我使用

名稱:christof123它匹配

如果我使用

名:克里斯托夫不匹配

當PROPVALUE等待,因爲'christof'與兩個PROPVALUE PROPORALPROPNAME表達式匹配,所以爭論'christof'是PROPNAME詞法分析器。

但我不希望匹配的

name123:克里斯托夫

任何想法?

回答

2

就像你說的那樣,詞法分析器會將christof和PROPNAME匹配起來,因爲它會在您的定義中最先匹配最長的。您可以使用grun查看比賽。

antlr4 MyGrammer.g4 
javac -g *.java 
grun MyGrammer r -tokens 
# enter your input string and press ctlr+d 

你的語法產生下面的錯誤給出的匹配。

name:christof 
line 1:13 token recognition error at: '\n' 
[@0,0:3='name',<2>,1:0] 
[@1,4:4=':',<1>,1:4] 
[@2,5:12='christof',<2>,1:5] 
[@3,14:13='<EOF>',<-1>,2:0] 
line 1:5 mismatched input 'christof' expecting PROPVALUE 

所以修改你的文法到下面就可以解決了。

r: name ':' value; 

name: ALPHA; 
value: ALPHA | ALPHANUM; 

ALPHA: [a-zA-Z]+; 
ALPHANUM: [a-zA-Z0-9]+; 

其中與grun產生以下匹配。

name:christof 
line 1:13 token recognition error at: '\n' 
[@0,0:3='name',<2>,1:0] 
[@1,4:4=':',<1>,1:4] 
[@2,5:12='christof',<2>,1:5] 
[@3,14:13='<EOF>',<-1>,2:0] 
+0

好吧,似乎工作,它的問題是我需要一箇中間規則名稱和值是它嗎? –

+0

Oups,非常感謝。 –

+0

歡迎。您需要將詞法分析規則分解爲更小的單位並將其組合爲用於此類用例。 – boring