我有以下语法:
grammar Demo;
program: command
IDENTIFIER
;
command:
| 'add'
| 'remove'
;
IDENTIFIER: [a-zA-Z][a-zA-Z0-9]* ;
WHITESPACE: [ \t\n\r]+ -> skip;
现在我可以输入类似“添加foo”的内容,我得到了正确的结果。 但他也只接受“foo”。我认为解析器会抛出异常,因为值必须从其中一个命令开始? 有没有解决问题的方法?或者我有谬论?
答案 0 :(得分:3)
正如Seelenvirtuose的评论中所指出的,问题是你的command
规则允许空命令,它应该是:
command:
'add'
| 'remove'
;
管道符号(|
)是替代品之间的分隔符,在原始代码中,它将空制作与'add'
分开。
但是,按原样,语法仍然只允许匹配foo
,这是因为您在program
规则中没有明确的EOF令牌(类似于{{1}正则表达式中的选项)。如果没有EOF令牌,解析器会愉快地匹配它,并忽略其余的。因此,如果这不是所期望的行为,总是用EOF结束你的主要规则:
$