为什么那是可解析的

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;