antlr4 - 获取规则上下文的左右兄弟
antlr4 - get left and right sibling of rule context
一个简单的问题,我在 API 文档中找不到有用的东西:有没有办法获得 ParserRuleContext
的左右兄弟?
假设我有 .g4
:
identifiers : identifier (',' identifier)*;
在处理一个IdentifierContext
的时候,我想得到一个左右的引用IdentifierContext
。
[...] is there a way to get the left and right sibling of a ParserRuleContext
?
不,唉,在 ANTLR4 的核心 API 中没有直接的方法。
您可以使用 infomehdi 的答案,但在(尝试)检索左节点或右节点时必须防止索引超出范围的异常。
我找到了相关的 getRightSibling()
方法 here。
这是我的 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);
然后您可以通过以下方式获得它的 right/left 兄弟姐妹:
ctx.parent.getChild(indexOfCurrentChildNode +/- 1)
一个简单的问题,我在 API 文档中找不到有用的东西:有没有办法获得 ParserRuleContext
的左右兄弟?
假设我有 .g4
:
identifiers : identifier (',' identifier)*;
在处理一个IdentifierContext
的时候,我想得到一个左右的引用IdentifierContext
。
[...] is there a way to get the left and right sibling of a
ParserRuleContext
?
不,唉,在 ANTLR4 的核心 API 中没有直接的方法。
您可以使用 infomehdi 的答案,但在(尝试)检索左节点或右节点时必须防止索引超出范围的异常。
我找到了相关的 getRightSibling()
方法 here。
这是我的 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);
然后您可以通过以下方式获得它的 right/left 兄弟姐妹:
ctx.parent.getChild(indexOfCurrentChildNode +/- 1)