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

Antlr 定义以任意顺序接受参数的规则,antlr,antlr4,Antlr,Antlr4,我有一条规则是 interfaceCommands : descriptionCmd ipAddressCmd otherCmd ; 虽然Cmds的预期顺序如语法中所述,但当这些Cmds的顺序互换时,我也应该能够接受输入。例如,在任何时候,在实际输入中,ipAddressCmd可以位于descriptionCmd之前,也可以位于otherCmd之后。如何修改我的语法以适应并能够解析这些无序的输入?有几种方法可以解决这个问题。最简单的选项之一是

我有一条规则是

interfaceCommands
    :   descriptionCmd
        ipAddressCmd
        otherCmd
    ;

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

有几种方法可以解决这个问题。最简单的选项之一是使用以下解析器规则

interfaceCommands
  : (descriptionCmd | ipAddressCmd | otherCmd)*
  ;
解析完成后,您可以在侦听器或访问者中执行额外的验证(例如,确保只解析了一个
descriptionCmd
,或者确保解析了其中的每一项,等等)。这种策略有很多优点,特别是在提高您检测和报告更多类型语法错误的能力以及清晰的消息方面

另一个选项是简单地列举用户输入这些项目的可能方式。由于这很难写入/读取/验证/维护,因此我仅在没有其他方法可以使用更通用的解析器规则并在以后执行验证时使用此选项

interfaceCommands
  : descriptionCmd ipAddressCmd otherCmd
  | descriptionCmd otherCmd ipAddressCmd
  | ipAddressCmd descriptionCmd otherCmd
  | ipAddressCmd otherCmd descriptionCmd
  | otherCmd descriptionCmd ipAddressCmd
  | otherCmd ipAddressCmd descriptionCmd
  ;
谢谢你!这帮助我走出了思维混乱的困境,对问题有了一个简单的看法。