2016-09-14 5 views
0

のツリーを解析し、生成にあたって私は tsql_grammar Antlr4を使用して、次のSQLクエリを解析されました:がちょうどANTLR4から希望の情報は、LISP

"のDepartmentID、名前、GroupNameの選択します" + "FROM HumanResources.Department";

注:クエリはMSSQL AdventureWorks2014 DBからのものです。

と私は、このLISPの構文解析ツリー出力持っている:どのように私は子供たちに、彼らが持っているのinfromationへのアクセスを得ることができ

(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>) 

を?

答えて

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は、解析実行によって返される解析ツリーです。

+0

ありがとうございました!それは私を助けた。 –

関連する問題