2017-05-27 76 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,但:-) –