2013-02-01 85 views
1

我有一個簡單的語法試圖解析兩種類型的文本,行以「#包括」和其他開始。下面是我的語法:爲什麼有多種選擇?

cmds 
    : cmd+ 
    ; 

cmd 
    : include_cmd | other_cmd 
    ; 

include_cmd 
    : INCLUDE DOUBLE_QUOTE FILE_NAME DOUBLE_QUOTE 
    ; 

other_cmd 
    : (~'#')+ 
    ; 


INCLUDE 
    : '#include' 
    ; 

DOUBLE_QUOTE 
    : '"' 
    ; 

FILE_NAME 
    : ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')+ 
    ; 

New_Line 
    : ('\r' | '\n')+ 
    ; 

WS 
    : ('\t' | ' ')+ {$channel = HIDDEN;} 
    ; 

但我得到這樣的警告:

Decision can match input such as "INCLUDE DOUBLE_QUOTE FILE_NAME DOUBLE_QUOTE" using multiple alternatives: 1, 2 

As a result, alternative(s) 2 were disabled for that input 

我不知道如何解釋此警告。其中的示例「INCLUDE DOUBLE_QUOTE FILE_NAME DOUBLE_QUOTE」應該只匹配include_cmd,因爲「other_cmd」不以「#」開頭。

你能幫助這裏發生了什麼嗎?

我正在使用antlr3.4。

更新 - 感謝您的greydet建議,將other_cmd規則更改爲(〜INCLUDE)+後,該警告消失。但還有另一種警告實際上,

Decision can match input such as "{DOUBLE_QUOTE..FILE_NAME, New_Line..WS}" using multiple alternatives: 1, 2 

As a result, alternative(s) 2 were disabled for that input 

現在,我想這是因爲雙引號可以同時匹配other_cmd規則和DOUBLE_QUOTE規則,但我想知道在這裏,一個是解析器規則,另一個是詞法規則,並這個警告有意義嗎?我可以不使用DOUBLE_QUOTE在所有,但在解析器規則include_cmd直接使用「,但使不容易閱讀

任何幫助清除這個警告

A面的問題? - 警告消息只是說替代1 ,2,但我不清楚什麼是1和2是什麼,有沒有辦法讓antlr給更直接的選擇?

回答

1

other_cmd規則將匹配每個令牌序列,它不以# token。
include_cmd規則將匹配以#include toke開頭的序列ñ。

由於##include是兩個不同的標記,以令牌#include開頭的標記序列匹配兩個規則。

嘗試用以下規則:

other_cmd 
    : (~INCLUDE)+ 
    ; 
+0

是的,它修復它。 –