繁体   English   中英

为什么这样解析

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM