从AST中提取信息

时间:2014-04-15 08:40:24

标签: java antlr abstract-syntax-tree

我正在尝试使用ANTLR从PLSQL文件中提取信息。我正在使用porcelli PLSQL语法,使用ANTLR在我的输入plsql文件上吐出AST。我需要阅读返回的" CommonTree" class(代表AST)并获取不同的信息 - 比如表和相关列的名称。我在想是否有必要使用访问者模式来收集有关特定表上的表和相关列的信息。例如,像这样的查询

SELECT s.name from students s, departments d WHERE d.did=10 and s.sid=d.did

将在AST中显示为

AST

在此处获取表名和相关列将涉及首先从FROM元素捕获别名,然后与SELECT_LIST中使用的列匹配。有关表和列的信息隐藏在叶节点的深处,在重复使用的元素下,例如" ANY_ELEMENT"。

那么,如何在这里使用访客模式?我最终会得到太多的访问者,因为可能有很多元素类型?访客模式是否与此相关?

修改

在考虑了一段时间之后,我接近得出结论,访客模式在这种情况下是没有意义的。鉴于需要访问的数据结构是一个树,并且可能有这么多节点类型(select,update,insert,delete,from,where,into ..),定义访问这些节点类型时会发生什么任何给定访问者的节点类型可能会导致每个访问者类数百个方法!

1 个答案:

答案 0 :(得分:0)

正如我上次编辑中更新的那样,我通过不实现访问者模式解决了这个问题,因为这样的模式需要我创建所有节点类型,而对于PL / SQL则会有太多。