Antlr 使用侦听器遍历anltr解析树的问题

Antlr 使用侦听器遍历anltr解析树的问题,antlr,antlr4,Antlr,Antlr4,我一直在使用Antlr,试图在数据结构中解析和存储(Antlr中的语法).g4文件,这样我就可以在规则上进行变异,然后在具有变异规则的garmmars上运行Antlr。我有ANTLRv4Parser语法,我正在尝试编写一个侦听器,它沿着存储令牌的树走下去。然而,这样做是可行的,但对于具有替代方案的规则,管道“|”符号似乎已关闭。这来自antlrv4parser语法ruleAltList中的以下规则:alternative(或alternative)*。因此,似乎我正在努力从alternative

我一直在使用Antlr,试图在数据结构中解析和存储(Antlr中的语法).g4文件,这样我就可以在规则上进行变异,然后在具有变异规则的garmmars上运行Antlr。我有ANTLRv4Parser语法,我正在尝试编写一个侦听器,它沿着存储令牌的树走下去。然而,这样做是可行的,但对于具有替代方案的规则,管道“|”符号似乎已关闭。这来自antlrv4parser语法ruleAltList中的以下规则:alternative(或alternative)*。因此,似乎我正在努力从alternative的子节点获取令牌,在管道之前,然后在侦听器的enterRuleAltList中的管道之后,似乎antlr进行了预排序遍历,因此它在进入alternative之前获取管道

所以我想要的是在antlr中使用相同的侦听器模式,并进行某种顺序遍历

下面是antlrv4parser语法的片段

ruleAltList: labeledAlt (OR labeledAlt)* ;
可以在此链接上找到anltrv4parser语法和其他语法

例如,如果我有以下语法

语法c
A:B|C

我希望能够在数据结构中存储为 [“A”、“:”、“B”、“|”、“C”、“;”]

我得到的是 [“A”、“:”、“|”、“B”、“C”、“;”]


那么,关于如何在我的侦听器中覆盖enterRuleAltList方法,使其在OR之前具有来自替代子节点的标记,即“|”?

语法的简化表示法,您有什么想法吗

parserRuleSpec
   : RULE_REF COLON ruleBlock SEMI 
   ;

ruleBlock
   : ruleAltList
   ;

ruleAltList
   : labeledAlt (OR labeledAlt)*
   ;

labeledAlt
   : terminal
   ;
收集行走过程中遇到的节点的所有终端应导致排序
[“A”、“:”、“;”、“|”、“B”、“C”]
。(如果最初给出的不是打字错误,则发布实际的完整侦听器代码。)

收集终端时,必须注意它们在上下文子项列表中相对于其兄弟非终端的顺序


或者,可能只需将终端收集到按令牌索引排序的列表中。

谢谢@GRosenberg。将终端收集到按令牌索引排序的列表中是有效的。而且确实有个打字错误,我忘了说我在用地图
enterParserRuleSpec -> A : ;
    enterRuleBlock
       enterRuleAltList -> |
           enterLabeledAlt 
               enterTerminal -> B
           enterLabeledAlt
               enterTerminal -> C