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);
}