簡體   English   中英

為什么這樣解析

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM