Java - абстрактное синтаксическое дерево - PullRequest
10 голосов
/ 05 марта 2012

В настоящее время я ищу синтаксический анализатор Java 6/7, который генерирует некоторое (возможно стандартизированное) дерево абстрактного синтаксиса форм.

Я уже обнаружил, что ANTLR имеет грамматику Java 6, но, похоже, чтоон генерирует только дерево разбора, но не синтаксическое дерево.Я также читал об API Java Compiler - но все упомянутые источники упоминают, что он перегружен и плохо документирован (и я не нашел, действительно ли он генерирует AST).

Знаете ли вы о какой-нибудь хорошей библиотеке анализатора, возможно с максимально стандартизированным выводом?

Спасибо

Ответы [ 3 ]

6 голосов
/ 05 марта 2012

В основном JavaCC и ANTLR являются лучшими инструментами на данный момент.

Вы можете найти пригодную для использования грамматику Java 6 в хранилище грамматики проекта .JavaCC немного устарела, редко обновляется, но с нее легко начать, она ориентирована на Java и генерирует AST (поиск JJTree).Это немного, ну ... странно на первый взгляд, но к этому можно привыкнуть.

Оба инструмента имеют хорошую поддержку IDE (например, плагины Eclipse),но я думаю (исходя из вашего описания), что вам нужно, это JavaCC.Попробуйте.

4 голосов
/ 22 августа 2013

Я знаю два проекта с открытым исходным кодом для создания и управления Java AST:

4 голосов
/ 05 марта 2012

Наш инструментарий реинжиниринга программного обеспечения DMS с его интерфейсом Java может обеспечить AST ( пример на SO ).

Отличительная чертаИнтересно рисовать между «необходим для семантики» (AST) и «является случайностью грамматики» («бетон» или «разбирать» дерево).Где-то требуются дополнительные усилия, чтобы отбросить информацию CST для получения AST.

Вы можете сделать это вручную, кодируя конструкцию AST как семантические действия над правилами.Это требует усилий и, вероятно, дает вам довольно хороший ответ.Но этот процесс может быть полностью автоматизирован, если учесть, что буквенные токены не нужно хранить в дереве, что унарные производственные цепочки не нужны (кроме случаев, когда унарное производство вводит семантику), и что списки могут формироваться автоматически.(Вы можете прочитать больше об этом здесь: https://stackoverflow.com/a/5732290/120163)

Это подход, принятый DMS. Вы пишете грамматику. DMS анализирует и строит AST, используя эту идею. Никаких дополнительных рабочих / семантических действий с вашей стороны.

Для устойчивой к камням грамматики, которая уже сделала это для вас, нет явного преимущества, и если все , который вы хотите, является AST, то использование JavaCC или ANTLR будет работать.грамматика может измениться, тогда это проще с подходом DMS.

Но никто не хочет просто AST. Это первый шаг в длинной серии шагов, который приводит к любому инструменту, которым вы являетесьВообще говоря, с практическими инструментами вам почти наверняка понадобятся «таблицы символов» и возможность определить, какую запись таблицы символов выбирает узел идентификатора. Возможно, вам потребуется контроль и анализ потока данных. Возможно, вам придется изменить AST, чтобывносите изменения, если ваш инструмент является «изменением», а не просто инструментом анализа, и для этого вам может потребоваться что-то, что может соответствовать / исправлять произвольные фрагментыAST, используя поверхностный синтаксис вашего языка (например, Java).Наконец, вы можете захотеть восстановить исходный код из вашего AST в виде легального, скомпилированного текста.

Это не простой механизм для создания.Мы думаем, что мы компетентные инженеры;За последние 5 лет у нас ушло несколько месяцев на то, чтобы правильно понять грамматику Java (от 1,3 до 6 и 7).На создание механизма таблиц символов для Java у нас ушло около года;как разрешаются символы намного сложнее, чем вы думаете;Прочтите стандарт языка.

DMS предоставляет все эти возможности для многих языков, включая Java, из коробки.Для языков с меньшей поддержкой в ​​нем есть синтаксический анализ, симпатичная печать, преобразования деревьев и оценка атрибутов из коробки.

Я слышал, в течение последних 20 лет, Если ятолько что был парсер ... .Мой опыт (и причина, по которой я построил DMS) заключается в том, что AST просто недостаточно, если в конечном итоге.

И я думаю, что то, что DMS обеспечивает (далеко) помимо «простого анализа», отличает его от «JavaCC и ANTLR».Я не верю, что они являются «лучшими инструментами на данный момент», если только вы не оптимизируете «бесплатно», а не «выполняете работу».(Если вам нужен бесплатный инструмент ближе к цели, рассмотрите возможность использования механизма разбора Java в Eclipse. По крайней мере, он имеет AFAIK, поиск по таблице символов).

...