2016-09-14 2 views
0

Je l'ai analysé la suivante requête SQL utilisant Antlr4 avec tsql_grammar:Obtenir uniquement les informations recherchées à partir d'un ANTLR4 généré analyser arbre LISP

"SELECT DepartmentID, nom, nom de groupe" + "FROM HumanResources.Department";

Remarque: la requête provient de MSSQL AdventureWorks2014 DB.

et j'ai ce LISP Parse sortie arbre:

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

Comment puis-je avoir accès aux enfants et à l'infromation qu'ils ont?

Répondre

0

L'approche habituelle dans de tels cas est de créer un visiteur et de faire une promenade sur l'arbre d'analyse retourné. ANLTR4 génère par défaut un visiteur de base (peut être désactivé via un paramètre de ligne de commande). Ce visiteur contient des fonctions d'entrée et de sortie pour chaque règle d'analyseur dans votre grammaire. Alors, il vous suffit de passer outre les fonctions qui vous intéressent Voici un l'exemple C de pour obtenir le nom d'une colonne.

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 
    } 
    } 
//... 
}; 

L'appel à lancer la marche est très simple:

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

_tree est l'arborescence d'analyse renvoyée par l'analyse.

+0

Merci beaucoup! Ça m'a aidé. –