7

我想获得 java 和 c 代码的 ast 的 xml 表示。3个月前,我问过这个问题,但解决方案对我来说并不舒服

  • srcml似乎是解决此问题的好方法,但它不支持行号和列,但我需要该功能。
  • 关于elsa:引用:“正在努力将 Elsa AST 导出为 XML 文档;我们希望能够在下一个公开版本中宣传这一点。”
  • dms ...不明白这一点。
  • 特别是对于 java,有javaml支持行号。但sourceforge 页面没有列出任何文件。

问题:有可用的软件支持将 ast 转换为支持行号(和列)的 xml [特别是对于 java 和 c/c++]?有没有 javaml 和 srcml 的替代品?

ps:我不想要解析器生成器。我希望找到一个可以在控制台键入的工具:./my-xml-generator Test.java [或类似的东西]...或者java实现也会很棒。

4

5 回答 5

3

有点晚了,但这里有一个:http: //xmltranslator.appspot.com/sourcecodetoxml.html

我自己实现了它,它将 PHP 和 Java 转换为 XML。它是免费的,所以尽情享受吧!

奥纳。

于 2012-08-13T02:38:45.223 回答
2

您对DMS有什么不了解的地方?

它存在。

为 C、C++、Java、C#、COBOL(和许多其他语言)提供编译器准确的解析器/前端

它会自动为它解析的任何内容构建完整的抽象语法树。每个 AST 节点都用文件/行/列标记代表该节点的开始,最后一列可以通过 DMS API 调用计算。

它具有从 AST 生成 XML 的内置选项,包括节点类型、源位置(如上)和任何相关的文字值。命令行调用是:

 run DMSDomainParser ++XML  <path_to_your_file>

你可以看到这样的 XML 结果对于 Java 是什么样子的

你可能并不真正想要你想要的东西。一个 1000 个 C 程序可能有 100K 行 #include 文件内容。一条线产生 5-10 个节点。DMS XML 输出很简洁,每个节点只占一行,因此您正在查看 ~~ 100 万行 XML,每行 60 个字符 --> 6000 万个字符。这是一个大文件,您可能不想使用基于 XML 的工具来处理它。

DMS 本身提供了大量的基础设施来操作它所构建的 AST:遍历、模式匹配(针对基本上以源形式编码的模式)、源到源转换、控制流、数据流、指向分析、全局调用图. 你会发现复制所有这些机器非常困难,而且你很可能需要它来做任何有趣的事情。

道德:使用 DMS 之类的东西直接操作 AST 比使用 XML 好得多。

全面披露:我是 DMS 背后的架构师。

于 2010-05-14T01:36:47.210 回答
1

在http://www.gccxml.org/HTML/Index.html有 GCC-XML - 警告;我自己并没有真正使用过。

于 2010-05-12T10:28:35.567 回答
1

srcml支持行号和列号。这是一个使用名为 input.java 的 java 文件的示例(请记住,srcml 支持多种语言,包括 C/C++),其中包含以下内容:

public class HelloWorld {
    public static void main(String[] args) {
        // Prints "Hello, World" to the terminal window.
        System.out.println("Hello, World");
    }
}

然后使用命令运行 srcml 以启用跟踪此额外位置信息:

srcml input.java --position

它以 XML 格式生成以下 AST,其中嵌入了行号和列号:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<unit xmlns="http://www.srcML.org/srcML/src" xmlns:pos="http://www.srcML.org/srcML/position" revision="0.9.5" language="Java" filename="input.java" pos:tabs="8"><class><specifier pos:line="1" pos:column="1">public<pos:position pos:line="1" pos:column="7"/></specifier> class <name pos:line="1" pos:column="14">HelloWorld<pos:position pos:line="1" pos:column="24"/></name> <block pos:line="1" pos:column="25">{
    <function><specifier pos:line="2" pos:column="5">public<pos:position pos:line="2" pos:column="11"/></specifier> <specifier pos:line="2" pos:column="12">static<pos:position pos:line="2" pos:column="18"/></specifier> <type><name pos:line="2" pos:column="19">void<pos:position pos:line="2" pos:column="23"/></name></type> <name pos:line="2" pos:column="24">main<pos:position pos:line="2" pos:column="28"/></name><parameter_list pos:line="2" pos:column="28">(<parameter><decl><type><name><name pos:line="2" pos:column="29">String<pos:position pos:line="2" pos:column="35"/></name><index pos:line="2" pos:column="35">[]<pos:position pos:line="2" pos:column="37"/></index></name></type> <name pos:line="2" pos:column="38">args<pos:position pos:line="2" pos:column="42"/></name></decl></parameter>)<pos:position pos:line="2" pos:column="43"/></parameter_list> <block pos:line="2" pos:column="44">{
    <comment type="line" pos:line="3" pos:column="9">// Prints "Hello, World" to the terminal window.</comment>
    <expr_stmt><expr><call><name><name pos:line="4" pos:column="9">System<pos:position pos:line="4" pos:column="15"/></name><operator pos:line="4" pos:column="15">.<pos:position pos:line="4" pos:column="16"/></operator><name pos:line="4" pos:column="16">out<pos:position pos:line="4" pos:column="19"/></name><operator pos:line="4" pos:column="19">.<pos:position pos:line="4" pos:column="20"/></operator><name pos:line="4" pos:column="20">println<pos:position pos:line="4" pos:column="27"/></name></name><argument_list pos:line="4" pos:column="27">(<argument><expr><literal type="string" pos:line="4" pos:column="28">"Hello, World"<pos:position pos:line="4" pos:column="42"/></literal></expr></argument>)<pos:position pos:line="4" pos:column="43"/></argument_list></call></expr>;<pos:position pos:line="4" pos:column="44"/></expr_stmt>
    }<pos:position pos:line="5" pos:column="6"/></block></function>
}<pos:position pos:line="6" pos:column="2"/></block></class></unit>

参考: srcml v0.9.5 的文档(参见 srcml --help)。我也经常使用srcml,包括这个功能来获取位置信息。

于 2017-09-14T00:59:26.670 回答
0

仅对于 Java,您可以使用BeautyJ

您可以使用 -xml.* 选项针对您的文件启动它。例如:

java /your/dir/BeautyJ/lib/beautyj.jar beautyj -xml.out= -xml.doctype your_file.java

...您将获得该文件(和包含的文件)的 XML 表示形式。

顺便说一句:“-xml.out=”选项指定输出文件。以这种方式使用,带有尾随的“=”,它输出到 STDOUT。这不是错误。

于 2012-09-19T13:23:05.947 回答