2014-11-01 100 views
1

我有以下規則:antlr4 - 衝突的規則,如何解決

property : NAME; 
value  : STRING | NUMBER; 

NUMBER  : ('0'..'9')+; 
NAME  : ('a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_')+; 
STRING  : '"' (~'"')* '"'; 

當屬性是一個數字,ANTLR說:

line 1:14 mismatched input '5' expecting NAME 

我明白爲什麼會這樣。在NAME規則之前提到NUMBER規則,因此它具有優先權。該號碼由NUMBER規則識別。

在ANTLR中處理這個問題的常用方法是什麼?我可以重寫property規則如下,但我不知道這是否是一個好主意,因爲我正在引入冗餘。

property : NAME | NUMBER; 

重新排序NUMBERNAME是不是一個好主意要麼,因爲它會打破號碼value規則(同樣的問題)。

重要提示:我對ANTLR相當陌生,現在仍在學習。

回答

1

是的,property : NAME | NUMBER;是做到這一點的方法。

+0

謝謝!我必須習慣於定義多餘的右側('NUMBER'是'NAME'的一個子集)是首選。 – 2014-11-01 21:33:08