我有一個簡單的語法試圖解析兩種類型的文本,行以「#包括」和其他開始。下面是我的語法:爲什麼有多種選擇?
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給更直接的選擇?
是的,它修復它。 –