2016-09-14 15 views
0

Я разобрал следующие SQL запрос использования Antlr4 с tsql_grammar:Как только разыскиваемую информации из ANTLR4 генерируется дерево разбора в LISP

"SELECT DepartmentID, имя, GroupName" + "ОТ HumanResources.Department";

Примечание: запрос получен из базы данных MSSQL AdventureWorks2014.

и я получил этот 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>) 

Как я могу получить доступ к детям, и к распространял информацию, что у них есть?

ответ

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

Большое спасибо! Это помогло мне. –