为什么这是可解析的

时间:2017-05-27 06:40:13

标签: java antlr antlr4

我有以下语法:

grammar Demo;

program: command
         IDENTIFIER
         ;

command:
       | 'add'
       | 'remove'
       ;

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

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

现在我可以输入类似“添加foo”的内容,我得到了正确的结果。 但他也只接受“foo”。我认为解析器会抛出异常,因为值必须从其中一个命令开始? 有没有解决问题的方法?或者我有谬论?

1 个答案:

答案 0 :(得分:3)

正如Seelenvirtuose的评论中所指出的,问题是你的command规则允许空命令,它应该是:

command:
         'add'
       | 'remove'
       ;

管道符号(|)是替代品之间的分隔符,在原始代码中,它将空制作与'add'分开。

但是,按原样,语法仍然只允许匹配foo,这是因为您在program规则中没有明确的EOF令牌(类似于{{1}正则表达式中的选项)。如果没有EOF令牌,解析器会愉快地匹配它,并忽略其余的。因此,如果这不是所期望的行为,总是用EOF结束你的主要规则:

$