【问题标题】:Parsing hundreds of pl/sql files in Java在 Java 中解析数百个 pl/sql 文件
【发布时间】:2013-11-07 09:40:12
【问题描述】:

我需要获取数百个包含存储过程、视图和函数的 pl/sql 文件,并将它们全部拆分为单独的文件。

示例:

create or replace function practice_function(hello in table.hello%type) return     varchar2 as

hello2 varchar2(6);


begin
if hello is not null then
    hello2 := "hi";
    end if;


return hello2;

end practice_function
/

这只是一个存储函数的例子。该文件可能包含 10 或 20 个带有 cmets 和块 cmets 等的文件。有人可以就我应该如何处理它以及我应该如何编写解析器给我一个高或低级别的建议。

目前,我正在使用 Java 逐行读取文件并在每一行进入时对其进行解析。例如,当我需要忽略具有块注释的代码时,这会导致问题。

任何建议都会很棒

【问题讨论】:

  • 我能给您的最好建议是发布您迄今为止尝试过的相关部分(最好是一个工作示例),告诉我们您的预期结果与实际结果有何不同,以及向我们展示您迄今为止为尝试解决问题所做的工作。

标签: java sql parsing file-io plsql


【解决方案1】:

编写 PL/SQL 或几乎任何其他解析器都是一项具有挑战性的任务。基本上你需要:

  • 创建词法分析器。这会将您的文本分解为标识符、数字、字符串文字、运算符等标记。
  • 创建解析器。这将构建您的标记树,即 AST(抽象语法树)。
  • 创建步行者。这些是tree walkers,它们将对您的AST 执行一些操作。他们甚至可能执行您的 PL/SQL 脚本,或者即删除所有 cmets。

甚至从代码中删除 cmets 的任务也可能变得非常具有挑战性。遍历这棵树并删除评论节点应该没有问题。当您想要打印新树时,可能会遇到困难,因为自然步行顺序可能与正确的文本顺序不同。

您可以尝试使用existing ANTLR parser。这将完成前两个步骤。

如何开始使用ANTLR的文章:antlr: is there a simple example?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多