在Listener ANTLR4中跳过子树

时间:2017-08-20 18:07:28

标签: listener antlr4

有没有办法在使用enter或exit方法在ANTLR4中使用Listener时跳过特定块的解析。 我已阅读link here但无法使其正常运行。 谢谢!

1 个答案:

答案 0 :(得分:0)

当您将Listener模式与您自己的Listener类一起使用时,输入已经被正确理解和解析。因此,你的问题的答案是否定的。当你使用听众时,你通常只是在解析后走树。

这是否意味着所有人都失去了?当然不是。您所要做的就是不为那些您想要“忽略”的构造编写EnterExit事件代码。就这么简单。

对于if-else语句,我总是使用这样的访问者模式实现它们:

至于如何编写if语句,我会告诉你他们实现它们的方式:

    public override MuValue VisitIfstmt(LISBASICParser.IfstmtContext context)
    {
        LISBASICParser.Condition_blockContext[] conditions = context.condition_block();
        bool evaluatedBlock = false;
        foreach (LISBASICParser.Condition_blockContext condition in conditions)
        {
            MuValue evaluated = Visit(condition.expr());
            if (evaluated.AsBoolean())
            {
                evaluatedBlock = true;
                Visit(condition.stmt_block());
                break;
            }
        }
        if (!evaluatedBlock && context.stmt_block() != null)
        {
            Visit(context.stmt_block());
        }
        return MuValue.Void;
    }

当然,这可能在上下文中没有多大意义,但请放心,它确实有效。要在完整的背景下看到这一点,请访问Bart Kiers以获得语法和实现的绝佳示例。