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