从LISP中的ANTLR4生成的解析树中获取所需信息

时间:2016-09-14 07:59:14

标签: tsql antlr parse-tree

我使用 Antlr4 解析了以下 SQL查询 tsql_grammar

  

" SELECT DepartmentID,Name,GroupName" +" FROM   HumanResources.Department&#34 ;;

注意:查询来自MSSQL AdventureWorks2014 DB。

我已经得到了 LISP解析树输出

(tsql_file (batch (sql_clauses (sql_clause (dml_clause (select_statement (query_expression (query_specification SELECT (select_list (select_list_elem (expression (full_column_name (id (simple_id DepartmentID))))) , (select_list_elem (expression (full_column_name (id (simple_id Name))))) , (select_list_elem (expression (full_column_name (id (simple_id GroupName)))))) FROM (table_sources (table_source (table_source_item_joined (table_source_item (table_name_with_hint (table_name (id (simple_id HumanResources)) . (id (simple_id Department))))))))))))))) <EOF>)

我如何才能接触到孩子以及他们所拥有的信息?

1 个答案:

答案 0 :(得分:0)

在这种情况下,通常的做法是创建一个访问者并在返回的解析树上行走。 ANLTR4默认为您生成基本访问者(可以通过命令行参数关闭)。此访问者包含语法中每个解析器规则的输入和退出函数。因此,您只需要覆盖您感兴趣的函数。这是获取列名称的C ++示例:

class SemanticListener : public YourParserBaseListener {
public:

  virtual void exitFull_column_name(YourParser::Full_column_nameContext *ctx) override
  {
    if (ctx->id() != nullptr)
    {
      std::string columnName = ctx->id()->getText();
      //... do something with the column name
    }
  }
//...
};

执行步行的调用非常简单:

SemanticLister semanticListener;
tree::ParseTreeWalker::DEFAULT.walk(&semanticListener, _tree.get());

_tree是解析运行返回的解析树。