2015:用于分析 Java 源代码的标记语言(JavaML 不起作用)

2015: Markup Language for Analyzing Java Source Code (JavaML not working)

问题: 您是否知道有一种工具可以在没有太多兼容性问题的情况下工作,可以在 Java 源代码上进行标记并保持程序的大部分完整性,或者您知道如何制作 JavaML/JavaML 2.0工作?
理想情况下,该工具应该能够处理许多项目或编写脚本来处理许多项目。

解释: 我正在尝试对大量 Java 源代码(大约 20.000 个项目)进行研究。本质上,为了让我的研究能够给出任何类型的结果,我需要能够识别源代码中的注释和代码的不同部分,例如,我需要能够区分函数声明、函数调用、变量声明、变量使用, if 块等等。 - 其核心:JavaML(Java 标记语言)的作用。

示例:

import java.applet.*;   // do not forget this import statement!
import java.awt.*;      // Or this one for the graphics!


public class FirstApplet extends Applet {
  // this method displays the applet.
  // the Graphics class is how you do all the drawing in Java
  public void paint(Graphics g) {
    g.drawString("FirstApplet", 25, 50);
  }
}

变为:

<java-source-program>
    <java-class-file name="FirstApplet.java">
        <import module="java.applet.*"/>
        <import module="java.awt.*"/>
        <class name="FirstApplet" visibility="public" line="5" col="0" end-line="11" end-col="0" comment="// do not forget this import statement!// Or this one for the graphics!">
            <superclass name="Applet"/>
            <method name="paint" visibility="public" id="FirstApplet:mth-15" line="8" col="2" end-line="10" end-col="2" comment="// this method displays the applet.// the Graphics class is how you do all the drawing in Java">
                <type name="void" primitive="true"/>
                <formal-arguments>
                    <formal-argument name="g" id="FirstApplet:frm-13">
                        <type name="Graphics"/>
                    </formal-argument>
                </formal-arguments>
                <block line="8" col="32" end-line="10" end-col="2" comment="// do not forget this import statement!// Or this one for the graphics!// this method displays the applet.// the Graphics class is how you do all the drawing in Java">
                    <send message="drawString">
                        <target>
                            <var-ref name="g" idref="FirstApplet:frm-13"/>
                        </target>
                        <arguments>
                            <literal-string value="FirstApplet"/>
                            <literal-number kind="integer" value="25"/>
                            <literal-number kind="integer" value="50"/>
                        </arguments>
                    </send>
                </block>
            </method>
        </class>
    </java-class-file>
</java-source-program>

但是问题来了。我一直在努力让 JavaML and JavaML 2.0 工作。但是存在一些相当明显的兼容性问题。我已经为 JavaML 尝试了 运行ning 新旧 ubuntu 实现的虚拟机(10.04、12.04 和 14.04),试图按照 [=66= 的指示编译源代码]ML 的网站,对于我在配置时不断遇到的所有版本,JavaML 中使用的 Jikes 版本似乎存在问题,这会触发 g++ 编译器的问题。 - 使用较新版本的 Jikes 会使来自 JavaML 的补丁变得毫无价值,因此无法编译 JavaML。

对于 JavaML 2.0,它带有一个 .exe 文件,可以 运行 在 windows 上。您只需要使用 Java 安装的正确路径进行设置(有关说明,请参见下文)。然而,这也给我带来了问题。使用最新的 Java (1.8.0_40) 它会告诉我:'chaos: CODE "15" is an invalid tag !!!' 当我使用 Java 版本设置它时: 1.5.0_14 、 1.5.0_12 、 1.5.0 、 1.4.2_19 和 1.3.1_28 。 exe 文件会崩溃,但首先会生成一个 .tok 文件和一个空的 .xml 文件。

JavaML 2.0

说明
  1. 下载 JavaML 2.0 项目
  2. 提取到某处
  3. 启动您的 cmd(命令提示符)
  4. 导航到您放置 JavaML 2.0 项目的文件夹
  5. 找到您的 Java 实现(通常存储在:C:\Program Files (x86)\Java)
  6. 找到您的 rt.jar 文件(通常存储在:C:\Program Files (x86)\Java\jre1.8.0_40\lib\rt.jar)
  7. 在您的 cmd 中写入以下行

s*

set CLASSPATH=.;C:\Program Files (x86)\Java\jre1.8.0_40\lib\rt.jar 
jikes +B +L +c +T=3 +ulx FirstTest.java

如果有人仍在寻找这个问题,我想确保有某种答案。

在我的研究中,我找不到充当 JavaML 的工具,而且我无法让 JavaML 在任何较新的系统上工作。相反,我在 Java 中创建了自己的工具,这让我很头疼,而且它肯定不值得发布。手工创建这样一个工具花了我大约 30 个工时。

如果你真的需要一个类似JavaML的工具,我建议你自定义一个解析器,immibis也建议。

朋友叫我去看看OpenJDK compiler, and customize it. There is a guide to customization of the compiler found here。 - 然而,对于深入了解语言、语法和编译器的人来说,这是一项任务。

祝你好运。

使用 JavaCC 创建自定义解析器。他们已经有分析 Java 代码的示例。