就像你說的那樣,詞法分析器會將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]
好吧,似乎工作,它的問題是我需要一箇中間規則名稱和值是它嗎? –
Oups,非常感謝。 –
歡迎。您需要將詞法分析規則分解爲更小的單位並將其組合爲用於此類用例。 – boring