我的规则是
interfaceCommands
: descriptionCmd
ipAddressCmd
otherCmd
;
虽然Cmds
的预期顺序如语法中所述,但我也应该能够在这些Cmds
的顺序互换时接受输入。例如,ipAddressCmd
可以在实际输入中descriptionCmd
之前或otherCmd
之后。{{1}}。我的语法应该如何修改以适应并能够解析这些无序输入?
答案 0 :(得分:6)
有几种方法可以解决这个问题。最简单的选项之一是使用以下解析器规则。
interfaceCommands
: (descriptionCmd | ipAddressCmd | otherCmd)*
;
然后,您可以在解析完成后在侦听器或访问者中执行其他验证(例如,确保仅解析了一个descriptionCmd
,或确保解析了这些项中的每一个中的一个,等等。)。这种策略有许多优点,特别是在提高您使用清晰消息检测和报告更多类型的语法错误的能力方面。
另一种选择是简单地枚举用户输入这些项目的可能方式。由于这很难写/读/验证/维护,所以当我没有其他方法可以使用更通用的解析器规则并在以后执行验证时,我只使用此选项。
interfaceCommands
: descriptionCmd ipAddressCmd otherCmd
| descriptionCmd otherCmd ipAddressCmd
| ipAddressCmd descriptionCmd otherCmd
| ipAddressCmd otherCmd descriptionCmd
| otherCmd descriptionCmd ipAddressCmd
| otherCmd ipAddressCmd descriptionCmd
;