如何将源代码转换为基于xml的ast表示?

时间:2010-05-12 10:26:39

标签: xml abstract-syntax-tree code-conversion

我想获得java和c代码的xml表示。 3个月前,我问this question yet,但解决方案对我来说不舒服

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

瓦娜。

答案 1 :(得分:2)

您对DMS有何了解?

它存在。

编译器准确parsers/frontends for C, C++, Java, C#, COBOL (and many other languages)

它会自动构建完整的抽象语法树,无论它解析什么。每个AST节点都标有文件/行/列,代表该节点的开头, 最后一列可以通过DMS API调用来计算。

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

 run DMSDomainParser ++XML  <path_to_your_file>

你可以 see what such an XML result looks like for Java

你可能并不真正想要你想要的东西。 1000 C程序可能有100K行的#include文件。一条线产生5-10个节点。 DMS XML输出是succint,每个节点只占一行,所以你看的是~~ 100万行XML,每行60个字符 - &gt; 6000万字符。这是一个大文件,您可能不希望使用基于XML的工具来处理它。

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

道德:使用像DMS这样的东西来直接操纵AST要好得多,而不是用XML来对抗。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

仅限Java,您可以使用BeautyJ

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

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

...并且您获得该文件的XML表示(以及包含的文件)。

BTW:“ - xml.out =”选项指定输出文件。以这种方式使用,尾随“=”,它输出到STDOUT。这不是错误。

答案 4 :(得分:0)

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,包括这个功能来获取位置信息。