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

时间:2018-09-03 22:51:09

标签: antlr antlr4

我一直在与Antlr一起工作,试图解析(语法在antlr中).g4文件到一个数据结构中,这样我就可以对规则进行变异,然后在具有变异规则的garmmars上运行antlr 。我有ANTLRv4Parser语法,我试图编写一个侦听器,该侦听器在存储令牌的树上行走。但是,这样做是可行的,但对于带有替代规则的规则,管道“ |”符号似乎已关闭。这来自于antlrv4parser语法中的以下规则:ruleAltList:Alternative(或OR)。因此,似乎我在从管道之前的管道的替代节点的子节点中获取令牌,然后在我的侦听器中的enterRuleAltList中的管道之后,似乎很挣扎,似乎antlr会进行预遍历遍历,以便在到达替代节点之前获得管道。

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

这是antlrv4parser语法的摘录

ruleAltList: labeledAlt (OR labeledAlt)* ;

anltrv4parser语法和其他语法可以在此链接https://github.com/antlr/grammars-v4/tree/master/antlr4

上找到

例如,如果我具有以下语法

grammar c; A : B | C;

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

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

那么关于如何在侦听器中覆盖enterRuleAltList方法的任何想法,都可以在OR之前使用替代子节点的标记,即“ |”?

1 个答案:

答案 0 :(得分:0)

简化的语法表示形式

parserRuleSpec
   : RULE_REF COLON ruleBlock SEMI 
   ;

ruleBlock
   : ruleAltList
   ;

ruleAltList
   : labeledAlt (OR labeledAlt)*
   ;

labeledAlt
   : terminal
   ;

收集遍历过程中遇到的节点的所有终端,将导致排序["A", ":", ";", "|", "B", "C"]。 (如果最初给出的不是拼写错误,请发布实际的完整侦听器代码。)

enterParserRuleSpec -> A : ;
    enterRuleBlock
       enterRuleAltList -> |
           enterLabeledAlt 
               enterTerminal -> B
           enterLabeledAlt
               enterTerminal -> C

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

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