我一直在与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之前使用替代子节点的标记,即“ |”?
答案 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
在收集终端时,必须注意上下文子项列表中它们相对于同级非终端的顺序。
或者,可能只是将终端收集到按令牌索引排序的列表中。