2010-05-12 71 views
5

tôi muốn có được một đại diện xml của ast của java và c code. 3 tháng trước đây, tôi hỏi this question yet nhưng giải pháp là không thoải mái đối với tôiLàm thế nào để chuyển đổi mã nguồn thành biểu diễn dựa trên xml của ast?

  • srcml có vẻ là một giải pháp tốt cho vấn đề này nhưng nó không hỗ trợ số dòng và cột nhưng tôi cần tính năng đó.
  • về elsa: trích dẫn: "Có nỗ lực không ngừng để xuất AST Elsa như một tài liệu XML; chúng tôi hy vọng có thể quảng cáo điều này trong bản phát hành công khai tiếp theo".
  • dms ... không hiểu điều đó.
  • đặc biệt đối với java, có javaml hỗ trợ số dòng. nhưng sourceforge page không liệt kê bất kỳ tệp nào.

câu hỏi: có sẵn phần mềm hỗ trợ chuyển đổi ast thành xml hỗ trợ số dòng (và cột) [đặc biệt cho java và c/C++]? là có một thay thế cho javaml và srcml?

ps: tôi không wanne có trình tạo trình phân tích cú pháp. tôi hy vọng sẽ tìm thấy một công cụ có thể được sử dụng trên bàn điều khiển gõ: ./my-xml-generator Test.java [hoặc một cái gì đó tương tự] ... hoặc một thực hiện java sẽ là tuyệt vời quá.

+0

Bạn muốn làm gì, mà * yêu cầu * bạn sử dụng XML? –

+2

srcML giờ đây hỗ trợ số dòng và cột. Từ trang web: "Tệp và thư mục nhận biết được siêu dữ liệu ở cấp tệp, tức là ngôn ngữ, vị trí tệp và thông tin phiên bản". Tôi đã sử dụng srcML rộng rãi và có thể xác minh nó có số dòng và thông tin cột. –

Trả lời

1

Có GCC-XML tại http://www.gccxml.org/HTML/Index.html - báo trước; Tôi đã không thực sự sử dụng nó bản thân mình.

+1

AFAIK, GCC-XML chỉ đổ dữ liệu định nghĩa kiểu, chứ không phải mã cho phần thân của hàm. –

2

Bạn không hiểu gì về DMS?

Nó tồn tại.

Trình biên dịch có chính xác parsers/frontends for C, C++, Java, C#, COBOL (and many other languages).

Nó tự động tạo toàn bộ Cây cú pháp trừu tượng cho bất kỳ thứ gì nó phân tích cú pháp. Mỗi nút AST được đóng dấu với tệp/dòng/cột cho mã thông báo đại diện cho bắt đầu của nút đó, và cột cuối cùng có thể được tính bằng một cuộc gọi API DMS.

Nó có tùy chọn tích hợp để tạo XML từ AST, hoàn chỉnh với loại nút, vị trí nguồn (như trên) và bất kỳ giá trị văn bản có liên quan nào. Cuộc gọi dòng lệnh là:

run DMSDomainParser ++XML <path_to_your_file> 

Bạn có thể see what such an XML result looks like for Java.

Bạn có thể không thực sự muốn những gì bạn đang mong muốn. Chương trình 1000 C có thể có 100 nghìn dòng #include tệp tin. Một dòng sản xuất từ ​​5-10 nút. Đầu ra XML DMS là succint và mỗi nút chỉ có một dòng, vì vậy bạn đang xem ~~ 1 triệu dòng XML, 60 ký tự mỗi -> 60 triệu ký tự. Đó là một tập tin lớn và có thể bạn không muốn xử lý nó bằng một công cụ dựa trên XML. Bản thân DMS cung cấp một số lượng lớn cơ sở hạ tầng để thao tác các AST mà nó xây dựng: duyệt ngang, đối sánh mẫu (chống lại các mẫu được mã hóa cơ bản dưới dạng nguồn), các biến đổi nguồn-nguồn, luồng điều khiển, luồng dữ liệu, điểm-tới phân tích, biểu đồ cuộc gọi toàn cầu. Bạn sẽ thấy khó khăn khi sao chép tất cả các máy móc này, và bạn có thể cần nó để làm bất cứ điều gì thú vị.

Đạo đức: tốt hơn nhiều khi sử dụng thứ gì đó như DMS để thao tác trực tiếp AST, hơn là chiến đấu với XML.

Tiết lộ đầy đủ: Tôi là kiến ​​trúc sư đằng sau DMS.

3

hơi muộn nhưng đây là một trong: http://xmltranslator.appspot.com/sourcecodetoxml.html

Tôi đã thực hiện nó bản thân mình và nó chuyển đổi PHP và Java để XML. Hoàn toàn miễn phí!

Oana.

+0

Và đối với 1000 dòng đầu vào Java, bạn nhận được một tài liệu XML lớn như thế nào? –

0

Chỉ dành cho Java, bạn có thể sử dụng BeautyJ.

Bạn có thể khởi chạy ứng dụng này với tệp của mình bằng tùy chọn -xml. *. Ví dụ:

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

... và bạn nhận được biểu diễn XML của tệp đó (và tệp được bao gồm).

BTW: tùy chọn "-xml.out =" chỉ định tệp đầu ra. Được sử dụng theo cách đó, với dấu "=", nó xuất ra STDOUT. Nó không phải là một lỗi.

0

srcml hỗ trợ số dòng và số cột. Dưới đây là một ví dụ sử dụng một file java gọi input.java (lưu ý srcml hỗ trợ nhiều ngôn ngữ, bao gồm C/C++) có chứa những điều sau đây:

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

Sau đó chạy srcml với lệnh để cho phép theo dõi này thông tin vị trí bổ sung:

srcml input.java --position 

Nó tạo ra các AST sau trong một định dạng XML với số dòng và số cột nhúng:

<?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> 

Tham khảo: Tài liệu cho srcml v0.9.5 (xem srcml --help). Tôi cũng thường xuyên sử dụng srcml, bao gồm tính năng này để lấy thông tin vị trí.

Các vấn đề liên quan