Как преобразовать исходный код в представление Ast на основе XML? - PullRequest
6 голосов
/ 12 мая 2010

Я хочу получить представление XML кода Java и C в формате XML. 3 месяца назад я задал этот вопрос еще но решения мне не понравились

  • srcml кажется хорошим решением этой проблемы, но он не поддерживает номера строк и столбцов, но мне нужна эта функция.
  • about elsa : cite: "В настоящее время предпринимаются попытки экспортировать Elsa AST в виде XML-документа; мы ожидаем, что сможем объявить об этом в следующем общедоступном выпуске."
  • дмс ... не понял этого.
  • специально для Java, есть javaml , который поддерживает номера строк. но на странице sourceforge нет файлов.

вопрос: есть ли программное обеспечение, которое поддерживает преобразование ast в xml, которое поддерживает номера строк (и столбцы) [особенно для java и c / c ++]? есть ли альтернатива javaml и srcml?

ps: я не хочу иметь генераторы парсера. я надеюсь найти инструмент, который можно использовать на консоли, набрав: ./my-xml-generator Test.java [или что-то в этом роде] ... или реализация java была бы тоже великолепна.

Ответы [ 5 ]

3 голосов
/ 13 августа 2012

немного поздно, но вот один: http://xmltranslator.appspot.com/sourcecodetoxml.html

Я реализовал это сам, и он конвертирует PHP и Java в XML. Это бесплатно, так что наслаждайтесь!

Oana.

2 голосов
/ 14 мая 2010

Что вы не поняли о DMS ?

Существует.

Имеет точный компилятор парсеры / интерфейсы для C, C ++, Java, C #, COBOL (и многих других языков) .

Он автоматически создает полные деревья абстрактного синтаксиса для всего, что анализирует. Каждый узел AST помечается файлом / строкой / столбцом для токена, который представляет начало этого узла, и последний столбец может быть вычислен с помощью вызова API DMS.

Он имеет встроенную опцию для генерации XML из AST с указанием типа узла, исходного положения (как указано выше) и любого связанного литерального значения. Вызов командной строки:

 run DMSDomainParser ++XML  <path_to_your_file>

Вы можете посмотреть, как выглядит такой результат XML для Java .

Вы, вероятно, на самом деле не хотите, чего вы хотите. Программа на 1000 C может содержать 100 тысяч строк файла #include. Линия производит от 5 до 10 узлов. Выходные данные XML DMS являются краткими, и каждый узел занимает только одну строку, поэтому вы смотрите ~ ~ 1 миллион строк XML, по 60 символов в каждой -> 60 миллионов символов. Это большой файл, и вы, вероятно, не хотите обрабатывать его с помощью инструмента на основе XML.

Сама DMS предоставляет обширную инфраструктуру для управления создаваемыми AST: обход, сопоставление с образцом (с образцами, закодированными по существу в исходной форме), преобразования от источника к источнику, поток управления, поток данных, анализ точек, глобальные графы вызовов. Вам будет удивительно трудно воспроизвести все эти механизмы, и вам, вероятно, понадобится сделать что-нибудь интересное.

Мораль: гораздо лучше использовать что-то вроде DMS для непосредственного управления AST, чем для борьбы с XML.

Полное раскрытие: я архитектор DMS.

1 голос
/ 12 мая 2010

GCC-XML существует в http://www.gccxml.org/HTML/Index.html - предостережение; Я на самом деле не использовал его сам.

0 голосов
/ 14 сентября 2017

srcml поддерживает номер строки и номер столбца . Вот пример использования файла Java с именем input.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

Создает следующий AST в формате XML со встроенными номером строки и номером столбца:

<?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, включая эту функцию, для получения информации о местоположении.

0 голосов
/ 19 сентября 2012

Только для Java, вы можете использовать BeautyJ .

Вы можете запустить его для своего файла с опциями -xml. *. Например:

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

... и вы получите XML-представление этого файла (и включенных в него).

Кстати: параметры "-xml.out =" определяют выходной файл. При таком использовании с трейлингом "=" он выводится в STDOUT. Это не ошибка.

...