为什么那是可解析的
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;
我有以下语法:
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;