2017-05-27 115 views
2

我有以下的語法:這是爲什麼可解析

grammar Demo; 

program: command 
     IDENTIFIER 
     ; 

command: 
     | 'add' 
     | 'remove' 
     ; 

IDENTIFIER: [a-zA-Z][a-zA-Z0-9]* ; 

WHITESPACE: [ \t\n\r]+ -> skip; 

現在我可以進入類似「添加富」,我得到正確的結果。 但他也只接受「foo」。我認爲解析器會拋出異常,因爲值必須以其中一個命令開始? 有沒有解決問題的選項?或者我有謬誤?

+5

我不知道ANTLR,但我認爲第一個'|'字符是問題,從而使空的輸入。也許把它改成'command:'add'| '刪除';'? – Seelenvirtuose

回答

3

如由Seelenvirtuose的評論所指出的,問題是,你的command規則允許一個空的命令,它應該是:

command: 
     'add' 
     | 'remove' 
     ; 

管道符號(|)是替代品之間的分隔,在你原始代碼它從'add'中分離出一個空產品。

但由於是,語法仍允許僅是因爲你沒有在你的program規則明確EOF令牌(在正則表達式類似$選項)比賽foo。如果沒有EOF標記,解析器會愉快地匹配它可以忽略的部分。所以,如果是沒有希望的行爲總是最後你用EOF主要規則:

program: command IDENTIFIER EOF; 
+0

@MikeLischke我做了答案社區wiki,隨時將其添加到答案:) –

+0

完成,無需製作此社區wiki,但:-) –