Antlr4 ---遍历模式

Listener模式

  使用ParseTreeWalker遍历树的过程中(深度优先),每次进入和退出规则节点时,触发对应的enterRule/exitRule方法。

使用示例

//step1:创建ParseTreeWalker
	ParseTreeWalker walker = new ParseTreeWalker();
//step2:创建ParseTreeListener和ParseTree
	ParseTreeListener listener = ..., 
	ParseTree tree = ...;
//step3:遍历树
	walker.walk(listener, tree);

原理解析

Antlr4 ---遍历模式_第1张图片

Visitor模式

使用示例

//step1:创建visitor和tree
	XXXParserVisitor visitor = ...;
	ParseTree tree = ...;
//step2:遍历树
    visitor.visit(tree);

原理解析

public T visit(ParseTree tree) {
        return tree.accept(this);
    }

Antlr4 ---遍历模式_第2张图片
Antlr4 ---遍历模式_第3张图片

Antlr4 ---遍历模式_第4张图片

public T visitChildren(RuleNode node) {
        T result = this.defaultResult();
        int n = node.getChildCount();

        for(int i = 0; i < n && this.shouldVisitNextChild(node, result); ++i) {
            ParseTree c = node.getChild(i);
            T childResult = c.accept(this);
            result = this.aggregateResult(result, childResult);
        }

        return result;
    }

规则文件与Visitor对应关系

Antlr4 ---遍历模式_第5张图片
参考:

  1. https://abcdabcd987.com/notes-on-antlr4/

你可能感兴趣的:(Antlr)