【问题标题】:How can I process the LISP style tree generated by Antlr 4?如何处理 Antlr 4 生成的 LISP 样式树?
【发布时间】:2015-04-07 12:29:15
【问题描述】:

我使用 Antlr 4 语法解析了一个 SQL 查询。 tree.toStringTree() 的结果是这样的: ([] ([845] 选择 ([878 845] ([1473 878 845] ([1129 1473 878 845] ([1700 1129 1473 878 845] col1))) 作为 ([1477 878 845] a)) 从 ( [887 845] ([1487 887 845] ([1694 1487 887 845] 表1))))))

Antlr 文档告诉我这是一个 LISP 样式树。如何进一步处理 LISP 树?

【问题讨论】:

    标签: sql parsing antlr4 parse-tree s-expression


    【解决方案1】:

    如果您提供Parser 实例,对您的眼睛更友好:

    SQLiteLexer lexer = new SQLiteLexer(new ANTLRInputStream(sql));
    SQLiteParser parser = new SQLiteParser(new CommonTokenStream(lexer));
    ParseTree tree = parser.select_stmt();
    System.out.println(tree.toStringTree(parser));
    

    关于你处理这个字符串的问题:你不应该。它只是用于显示树。就像普通的toString() 一样有效。你不应该解析这个字符串,因为不能保证它在不同版本之间看起来是一样的。

    我之前建议过,但我会再次这样做:如果你想获得一个层次结构,只需使用ParseTree,它有父引用和子引用。如果这不是您想要的,请更好地解释自己。

    【讨论】:

    • 嗨@Bart - 感谢您的见解。一个非常基本的问题,Tree String 中的数字是否代表 Lexer 分配的令牌编号?
    • @user3898179,没问题。如果“数字”是指表示令牌类型的int,那么是的,它是由词法分析器分配的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多