antlr4-获取规则上下文的左右同级



一个简单的问题,我在API文档中找不到有用的东西:有没有办法获得ParserRuleContext的左右兄弟?

假设我的.g4:中有

identifiers : identifier (',' identifier)*;

在处理IdentifierContext时,我希望获得对左侧和右侧IdentifierContext的引用。

我在这里找到了一个相关的getRightSibling()方法。

这是我的C#端口:

    /// <summary>
    /// Returns the right sibling of the parse tree node.
    /// </summary>
    /// <param name="context">A node.</param>
    /// <returns>Right sibling of a node, or null if no sibling is found.</returns>
    public static IParseTree GetRightSibling(this ParserRuleContext context)
    {
        int index = GetNodeIndex(context);
        return index >= 0 && index < context.Parent.ChildCount - 1 
            ? context.Parent.GetChild(index + 1) 
            : null;
    }
    /// <summary>
    /// Returns the node's index with in its parent's children array.
    /// </summary>
    /// <param name="context">A child node.</param>
    /// <returns>Node's index or -1 if node is null or doesn't have a parent.</returns>
    public static int GetNodeIndex(this ParserRuleContext context)
    {
        RuleContext parent = context?.Parent;
        if (parent == null)
            return -1;
        for (int i = 0; i < parent.ChildCount; i++)
        {
            if (parent.GetChild(i) == context)
                return i;
        }
        return -1;
    }

获取当前子节点的索引:

int indexOfCurrentChildNode = ctx.getParent().children.indexOf(ctx);

然后你可以通过获得它的右/左兄弟

ctx.parent.getChild(indexOfCurrentChildNode +/- 1)

[…]有没有办法得到ParserRuleContext的左右兄弟?

不,唉,在ANTLR4的核心API中没有直接的方法。

您可以使用infomehdi的答案,但在(试图)检索左侧或右侧节点时,必须防止绑定异常的索引oUt。

相关内容

  • 没有找到相关文章

最新更新