antlr-循环通过节点

antlr-循环通过节点,antlr,antlr4,Antlr,Antlr4,我有以下语法(简化): 我正在解析简单的前缀结构,如: and(eq(name,john),eq(location,usa)) 通过和节点的过滤器节点循环的最佳方式是什么?生成的类和context有一个函数filter(int index),但仅此而已。我想做一些类似的事情: AndContext c = ...; for (int i = 0; i < c.numberOfFilters(); ++i) { FilterContext f = c.filter(i); }

我有以下语法(简化):

我正在解析简单的前缀结构,如:

and(eq(name,john),eq(location,usa))
通过
节点的
过滤器
节点循环的最佳方式是什么?生成的类
和context
有一个函数
filter(int index)
,但仅此而已。我想做一些类似的事情:

AndContext c = ...;

for (int i = 0; i < c.numberOfFilters(); ++i) {
    FilterContext f = c.filter(i);
}
AndContext c=。。。;
对于(int i=0;i

有函数
getChildCount()
,但它返回所有节点的计数(包括表示
的终端节点等),而不仅仅是有趣的
过滤器
节点。

假设您的语法如下所示:

语法F; 等式:“等式”(“属性”、“值”); 及:"及"("过滤器","过滤器","过滤器","过滤器");; 滤波器:eq |和; 属性:“名称”|“位置”; 价值观:“约翰”|“美国”;
然后,您可以扩展生成的
FBaseListener
并覆盖其
enterAnd
,以访问
FilterContext
s:

公共类主{
公共静态void main(字符串[]args)引发异常{
FLexer lexer=新FLexer(新AntlInputStream(“和(eq(姓名,john),eq(地点,美国)))));
FParser parser=newfparser(newcommontokenstream(lexer));
ParseTreeWalker.DEFAULT.walk(newandlistener(),parser.and());
}
}
类和侦听器扩展了FBaseListener{
@凌驾
public void enterAnd(@NotNull FParser.AndContext ctx){
对于(FParser.FilterContext FilterContext:ctx.filter()){
System.out.println(“filterContext=“+filterContext.getText());
}
}
}
将打印:

filterContext=eq(姓名,john)
filterContext=eq(位置,美国)

OP遗漏的答案中的关键部分是除了问题中提到的方法
和context.filter(int)
之外,还存在
和context.filter()
。谢谢。我完全忽略了
filter()
函数。我以为只有一个
过滤器(int index)
函数。FWIW,我没有使用walker/listener的解析方式,因为我正在递归地将解析树转换为我的
pojo树
@SteveKelio,是的,我不确定你(或曾经)打算如何遍历树,所以,如果您不熟悉树侦听器,我决定发布一个小示例。很高兴听到你有一个解决方案。这是非常周到的。谢谢你的回答。
AndContext c = ...;

for (int i = 0; i < c.numberOfFilters(); ++i) {
    FilterContext f = c.filter(i);
}