我想获得java和c代码的xml表示。 3个月前,我问this question yet,但解决方案对我来说不舒服
问题:有可用的软件支持将ast转换为xml,它支持行号(和列)[特别是对于java和c / c ++]?是否有javaml和srcml的替代品?
ps:我不喜欢解析器生成器。我希望找到一个可以在控制台上输入的工具:./ my-xml-generator Test.java [或类似的东西] ...或者java实现也很棒。
答案 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,包括这个功能来获取位置信息。