【问题标题】:How to get values from an expression如何从表达式中获取值
【发布时间】:2014-04-15 16:49:30
【问题描述】:

我正在使用 https://github.com/antlr/grammars-v4 的语法并尝试填充 where 子句中的列名和值。我遇到的问题是如何确定 SQLiteParser.Column_nameContext 和值上下文是否是 where 的一部分。当涉及“和”时,它会变得更加复杂。

所以我想要的是在下面的sql中获取"a"/"b"(列)和"g"/"h"(值):

select * from table where a = "g" and b = "h";

【问题讨论】:

    标签: antlr4


    【解决方案1】:

    您似乎对expr 制作感兴趣。在这种情况下,您可以将基础侦听器附加到解析树并覆盖其enterExpr 方法:

    String sql = "select * from table where a = \"g\" and b = \"h\"";
    
    SQLiteLexer lexer = new SQLiteLexer(new ANTLRInputStream(sql));
    SQLiteParser parser = new SQLiteParser(new CommonTokenStream(lexer));
    ParseTree tree = parser.select_stmt();
    
    ParseTreeWalker.DEFAULT.walk(new SQLiteBaseListener(){
        @Override
        public void enterExpr(@NotNull SQLiteParser.ExprContext ctx) {
            if (ctx.children.size() == 3 && (ctx.children.get(1) instanceof TerminalNode)) {
                String leftHandSide = ctx.children.get(0).getText();
                String operator = ctx.children.get(1).getText();
                String rightHandSide = ctx.children.get(2).getText();
                System.out.printf("leftHandSide=%s, operator=%s, leftHandSide=%s\n",
                        leftHandSide, operator, rightHandSide);
            }
        }
    }, tree);
    

    这将打印以下内容:

    leftHandSide=a="g", operator=and, leftHandSide=b="h"
    leftHandSide=a,运算符==,leftHandSide="g"
    leftHandSide=b, operator==, leftHandSide="h"

    您可以(极大地)通过在语法中添加标签来改进事情,而不是执行如此丑陋的(ctx.children.size() == 3 && (ctx.children.get(1) instanceof TerminalNode))

    ANTLR 4 tree inject/rewrite operator

    还要注意语法中的运算符优先级是错误的,请看下面的拉取请求:

    https://github.com/antlr/grammars-v4/pull/47

    固定运算符优先级的语法也可以在这里找到:

    https://github.com/bkiers/sqlite-parser/blob/master/src/main/antlr4/nl/bigo/sqliteparser/SQLite.g4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 2020-07-06
      相关资源
      最近更新 更多