【问题标题】:Parse Java/COBOL/VB etc code using Java使用 Java 解析 Java/COBOL/VB 等代码
【发布时间】:2011-11-07 06:44:33
【问题描述】:

我要parse Java/COBOL/VB等代码收集信息like variable name, method etc

我是using javacc grammar,但我的问题是,如果出现任何异常,那么parser fails

除了JAVA,我对COBOL, VB etc使用javacc语法

我不希望解析器失败,所以我尝试逐行读取 java 代码以获得所需的结果。

有没有更好的方法在不抛出异常的情况下进行解析?

提前致谢。

【问题讨论】:

  • “异常来了”是什么意思?您是否还希望能够优雅地处理无效的 Java 代码并尽可能多地解析其余代码?
  • @Rahul 你能给我们一个抛出异常的代码示例吗?或者抛出什么类型的异常?
  • 只有当你有最简单的任务时,逐行阅读源代码才有效,如果它做错了你也不在乎。对于大多数真实语言,如果您想收集准确的数据,没有不涉及该语言的真实解析器的好的解决方案。

标签: java parsing parser-generator


【解决方案1】:

解析器(以及解析器生成器提供的机制)必须有某种手段来处理无效的源文件。因此,每个解析器(和解析器生成器)都选择了一些方法来管理语法错误。

大多数人提供的简单解决方案是在遇到此类错误时抛出异常。调用解析器的用户代码必须捕获此异常并接受中止的解析。让解析器报告语法错误,但从错误中恢复并继续解析的更复杂的解决方案;如果您还希望获得可用的树,则任何此类恢复都必须在错误点的节点上使用某种标记处理 AST 构建。大多数解析器生成器将提供某种语法恢复,但让您自己处理 AST 构建面对此类错误的情况。这种解析器恢复逻辑相对难以构建,如果您不成为解析器错误恢复方面的专家,并且对特定的解析器生成器支持代码进行自定义更改,您可能无法自己完成。

我对 JavaCC(或大多数其他解析器生成器)并不特别熟悉,所以我不知道它是否这样做。显然,检查文档。如果您想要的错误处理支持不存在,请转到另一个拥有它的生成器。

我怀疑您真正的问题实际上是获得适合您任务的语法。没有人有“Java”或“COBOL”;他们有特定的方言,例如 Java 1.5 或 IBM Enterprise COBOL 或 VB6。这些与您根据我的长期经验所期望的想象中的基本语言有更大的不同。尽管存在这些差异,但您可以希望您可以获得的此类语法能够正常工作(包括错误恢复),以使您能够解析每种方言的各种方言,但通常您会从一种方言中的代码中得到大量错误'不匹配你想要的语法。 (在具有 EBCDIC 源文件的 IBM Enterprise COBOL 代码中,您将如何处理第 72 列之后的卡号?)因此,您真的需要一个工具,该工具具有许多处理各种方言的解析器,这应该会推动您的选择恕我直言。

我认为ANTLR 有很多语言定义(比 JavaCC 更多),所以它有点合格。但是,该站点上的许多语法都是实验性的或未完成的(有些非常好),因此您会碰运气。

我们的DMS Software Reenginering Toolkita lot of grammars,我们认为我们的任务是确保这些产品质量。我们也不是完美的,但我们的语法往往已经过大量代码的测试,并且支持各种方言。错误恢复是内置的,如果错误的数量小于指定的阈值,您确实会得到一棵树(在 AST 中有错误节点)。 DMS 还处理诸如字符编码等令人讨厌的问题(我们做了各种各样的工作,包括 80 列 EBCDIC,IBM COBOL 和 JCL 的第 72 列中有卡号)。 DMS 可能不是您想要的;例如,它不是基于 Java 的。但是我们试图通过提供大量的机器来支持解析后的任务来弥补这一点,比如你想做的事情。这种机制包括对构建符号表、提取控制和数据流、匹配模式和应用源到源转换等的支持。但这是您需要做出的权衡。

【讨论】:

    【解决方案2】:

    您可以尝试修改语法,但为什么不直接使用 Eclipse 提供的 AST 呢?

    最终,这可能比您在网上找到的大多数语法更可靠。

    【讨论】:

      【解决方案3】:

      我在SableCC for Java 方面取得了巨大成功。它非常易于使用,并且提供 Java 1.5 语法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2011-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多