[英]Why is that parsable
我有以下語法:
grammar Demo;
program: command
IDENTIFIER
;
command:
| 'add'
| 'remove'
;
IDENTIFIER: [a-zA-Z][a-zA-Z0-9]* ;
WHITESPACE: [ \t\n\r]+ -> skip;
現在,我可以輸入“ add foo”之類的東西,並且得到正確的結果。 但是他也只接受“ foo”。 我以為解析器會拋出異常,因為值必須以命令之一開頭? 有解決此問題的選項嗎? 還是我有謬誤?
如Seelenvirtuose的注釋中所述,問題是您的command
規則允許使用空命令,它應該是:
command:
'add'
| 'remove'
;
管道符號( |
)是備選項之間的分隔符,在您的原始代碼中,它用'add'
分隔了空的生產。
但是,語法仍然只允許匹配foo
,這是因為您的program
規則中沒有顯式的EOF標記(類似於正則表達式中的$
選項)。 如果沒有EOF令牌,則解析器會愉快地匹配它可以執行的操作,而忽略其余操作。 因此,如果這不是所需的行為,請始終以EOF結束您的主要規則:
program: command IDENTIFIER EOF;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.