【问题标题】:How do I check if the generated Java code adheres to the Java language specification?如何检查生成的 Java 代码是否符合 Java 语言规范?
【发布时间】:2018-05-13 13:16:54
【问题描述】:

我正在从事一个学校项目,我需要生成符合 Java 语言规范的 Java 代码。到目前为止,我已经能够随机生成具有不遵循语言规则的有效语法的 Java 代码。

接下来,我必须能够检查生成的代码是否遵守语言规则。遵循这一点的最佳方法是什么?我应该编写检查语言规则是否得到遵守的代码吗?是否有可用的 API(Prolog?)允许我对这些规则进行编码并将它们应用到代码中?

我认为我不能使用 Java 编译器 API,因为它违背了作业的目的。您将如何实现这一目标?

编辑:该项目不需要我考虑整个 Java 语言规范。我可以考虑规则的一个子集。

【问题讨论】:

  • 根据定义,验证 Java 代码的唯一方法是实现该语言的解析器。这是一项从头开始开发的艰巨任务。
  • Jim Garrison 请阅读我的编辑。
  • 请展示一个“具有有效语法”但不“遵循语言规则”的程序示例?您必须定义“语言规则”的含义。如果您所说的“语言规则”与程序语义有关,那么您就进入了 NP-Complete 领域。
  • 我的意思是生成的代码包含 Java 语言结构。代码是使用 Java BNF 生成的。但是,JLS 有一些规则,例如:最终变量不能重新初始化。此类规则需要在生成的代码中检查。
  • 这涉及到编译器所做的相同的流分析。您需要为您选择的任何语言子集编写编译器。您正在寻找一种不存在的神奇简单解决方案。

标签: java prolog java-compiler-api


【解决方案1】:

让编译器编译您的文件。 您的作业可能不需要您编写 Java 解析器,甚至不需要编写 Java 的子集。

如果你真的想这样做,你可以寻找替代的 java 解析器,比如这个:https://github.com/antlrjavaparser/antlr-java-parser

【讨论】:

  • 他说“我认为我不能使用 Java 编译器 API,因为它违背了作业的目的。”
  • 我知道。 '他想...'。他很可能是错的。告诉他他错了可能比试图让他编写自己的 java 解析器更好。
  • 一般来说,是的,但在这里他们似乎被指示编写代码作为家庭作业。如果你阅读其他 cmets,他似乎是在说他已经掌握了代码的语法部分。
【解决方案2】:

我相当确定,没有比从现有代码开始更简单的解决方案了,它检查/生成语法,并添加验证您提到的其他约束的 Prolog 代码。 Prolog 是处理这类事情的好语言。

【讨论】:

    猜你喜欢
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多