使用侦听器遍历 antlr 解析树的问题
Issues with walking a anltr parse tree using a listener
我一直在使用 Antlr,试图解析和存储(antlr 中的语法).g4 文件到数据结构中,这样我就可以改变规则,然后 运行带有变异规则的 antlr 语法。我有 ANTLRv4Parser 语法,我正在尝试编写一个沿着存储标记的树向下走的侦听器。然而,这样做是有效的,但对于带有替代管道“|”的规则符号似乎已关闭。这来自 antlrv4parser 语法中的以下规则, ruleAltList : alternative (OR alternative)* 。因此,似乎我正在努力从管道之前的替代子节点获取令牌,然后在我的侦听器中的 enterRuleAltList 管道之后获取令牌,似乎 antlr 进行了预序遍历,因此它在转向替代之前获取了管道。
所以我想要的可能是在 antlr 中使用相同的侦听器模式和某种中序遍历。
这是 antlrv4parser 语法的片段
ruleAltList: labeledAlt (OR labeledAlt)* ;
anltrv4parser 语法和其他语法可以在此找到 link https://github.com/antlr/grammars-v4/tree/master/antlr4
例如,如果我有以下语法
grammar 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"]
。 (Post 如果最初给出的不是错字,则为实际的完整侦听器代码。)
enterParserRuleSpec -> A : ;
enterRuleBlock
enterRuleAltList -> |
enterLabeledAlt
enterTerminal -> B
enterLabeledAlt
enterTerminal -> C
收集终端时,必须注意它们在上下文子列表中相对于其同级非终端的顺序。
或者,可能只是将终端收集到一个按令牌索引排序的列表中。
我一直在使用 Antlr,试图解析和存储(antlr 中的语法).g4 文件到数据结构中,这样我就可以改变规则,然后 运行带有变异规则的 antlr 语法。我有 ANTLRv4Parser 语法,我正在尝试编写一个沿着存储标记的树向下走的侦听器。然而,这样做是有效的,但对于带有替代管道“|”的规则符号似乎已关闭。这来自 antlrv4parser 语法中的以下规则, ruleAltList : alternative (OR alternative)* 。因此,似乎我正在努力从管道之前的替代子节点获取令牌,然后在我的侦听器中的 enterRuleAltList 管道之后获取令牌,似乎 antlr 进行了预序遍历,因此它在转向替代之前获取了管道。
所以我想要的可能是在 antlr 中使用相同的侦听器模式和某种中序遍历。
这是 antlrv4parser 语法的片段
ruleAltList: labeledAlt (OR labeledAlt)* ;
anltrv4parser 语法和其他语法可以在此找到 link https://github.com/antlr/grammars-v4/tree/master/antlr4
例如,如果我有以下语法
grammar 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"]
。 (Post 如果最初给出的不是错字,则为实际的完整侦听器代码。)
enterParserRuleSpec -> A : ;
enterRuleBlock
enterRuleAltList -> |
enterLabeledAlt
enterTerminal -> B
enterLabeledAlt
enterTerminal -> C
收集终端时,必须注意它们在上下文子列表中相对于其同级非终端的顺序。
或者,可能只是将终端收集到一个按令牌索引排序的列表中。