gpt4 book ai didi

java - JSqlParser 如何拆分一个表达式

转载 作者:行者123 更新时间:2023-11-29 05:25:21 32 4
gpt4 key购买 nike

假设我有一个格式表达式

a>10 and b>20 and c>30

我想得到如下的表达式列表

a>10
b>20
c>30

如果我使用表达式访问者模式,对于 AndExpression 访问者,我写了类似的东西

public void visit(AndExpression andExpression) {
andExpression.getLeftExpression().accept(this);
andExpression.getRightExpression().accept(this);
}

但是这会递归地运行并进入每个其他访问者模式方法。如何在获得较小的表达式时停止?

如果我只使用 getLeftExpressions() 和 getRightExpression(),我在第一次运行中得到的是左侧的“a>10”和右侧的“b>20 和 c>30”。

最佳答案

JSqlParser 以这种方式解析你的表达式:

AndExpression
AndExpression
a>10
b>20
c>30

我很好奇你使用的是哪个版本,递归是否确实在右边而不是左边。我用 JSqlParser 0.9-SNAPSHOT .尽管如此,在我的 JSqlParser 版本中(我认为总的来说,因为它是一个 LL 解析器),在其他答案评论中提出了代码块

while(ex.getLeftExpression() != null) {
list.add(ex.getLeftExpression());
ex = ex.getRightExpression();
}

将不起作用。它发现(或收集):

a > 10 AND b > 20

这是一个 AndExpression 并且在 ex = ex.getRightExpression(); 上失败,因为右永远不会是 AndExpression。这就是 JSqlParser 的工作原理。 AndExpression 递归将在 leftExpression 中。

所以这是一个解决方案和围绕它的小测试,使用 JSqlParser V0.9-SNAPSHOT,它使用递归方式访问这些 AndExpressions 并打印出发现表达。我没有将它添加到 List 中。请原谅我。

public class JSqlParser1 {

public static void main(String[] args) throws JSQLParserException {
Expression expr = CCJSqlParserUtil.parseCondExpression("a>10 and b>20 and c>30");
expr.accept(new ExpressionVisitorAdapter() {

@Override
public void visit(AndExpression expr) {
if (expr.getLeftExpression() instanceof AndExpression) {
expr.getLeftExpression().accept(this);
} else {
System.out.println(expr.getLeftExpression());
}

System.out.println(expr.getRightExpression());
}

});
}
}

这一个打印:

a > 10
b > 20
c > 30

关于java - JSqlParser 如何拆分一个表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22883289/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com