定义以任何顺序接受参数的规则

时间:2013-07-17 11:21:11

标签: antlr antlr4

我的规则是

interfaceCommands
    :   descriptionCmd
        ipAddressCmd
        otherCmd
    ;

虽然Cmds的预期顺序如语法中所述,但我也应该能够在这些Cmds的顺序互换时接受输入。例如,ipAddressCmd可以在实际输入中descriptionCmd之前或otherCmd之后。{{1}}。我的语法应该如何修改以适应并能够解析这些无序输入?

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
  ;