从 LISP 中的 ANTLR4 生成的解析树中获取所需的信息
Getting just the wanted information from an ANTLR4 generated parse tree in LISP
我使用 Antlr4 和 tsql_grammar 解析了以下 SQL 查询 :
"SELECT DepartmentID, Name, GroupName " + "FROM
HumanResources.Department";
注:查询来自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>)
我怎样才能访问 children 和他们拥有的信息?
在这种情况下,通常的方法是创建一个访问者并遍历返回的解析树。 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
是解析运行.
返回的解析树
我使用 Antlr4 和 tsql_grammar 解析了以下 SQL 查询 :
"SELECT DepartmentID, Name, GroupName " + "FROM HumanResources.Department";
注:查询来自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>)
我怎样才能访问 children 和他们拥有的信息?
在这种情况下,通常的方法是创建一个访问者并遍历返回的解析树。 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
是解析运行.