От источника к AST к CodeDom - PullRequest
3 голосов
/ 03 июня 2010

Я читаю книгу Шаблоны языковой реализации (http://pragprog.com/book/tpdsl/language-implementation-patterns) среди нескольких других, смешанных, чтобы прояснить понятия, а также случайный веб-сайт. Я пытаюсь создать инструмент, который читает тривиальный язык программирования и выполняет его базовый анализ.

Я застреваю на этапе разработки этого инструмента. Я создал простой рукописный рекурсивный приличный парсер, который отлично проверяет исходный файл. Однако для выполнения манипуляций с исходным кодом полезно иметь дерево CodeDom.

Вопросы:

1) Являются ли логические шаги, которые выполняет такой инструмент: синтаксическим анализом и построением текстового дерева и соответствующей таблицы символов, а затем преобразовать его в CodeDom?

2) При построении текстового дерева наиболее удобным будет AST, который будет легче преобразовать в CodeDom ... но инструменты Refactoring поддерживают список всех встроенных токенов в выражении, чтобы сохранить встроенные комментарии и как они отслеживают это в своем дереве?

1 Ответ

0 голосов
/ 03 июня 2010

Вы можете создать свой собственный синтаксический анализатор, свой собственный конструктор деревьев, свой собственный обходчик деревьев, свои собственные анализаторы, свои собственные симпатичные принтеры ... но это большая работа.

Вы могли бы рассмотреть инструменты, которые предоставляют всю эту технику для вас.

Одним из таких инструментов является наш DMS Software Reengineering Toolkit .

Учитывая грамматику, DMS будет анализировать и автоматически строить дерево; да, он автоматически захватывает «микротокены», такие как комментарии, и прикрепляет их к соответствующим узлам дерева. Он может распечатать дерево обратно, до или после преобразований. Вы должны обеспечить поддержку таблиц символов, поскольку это семантическая, а не синтаксическая конструкция, но DMS предоставляет универсальные таблицы символов и инструменты управления областью действия в качестве библиотеки для построения. DMS также предоставляет полные библиотеки для управления и анализа потока данных, которые необходимы, если вы хотите выполнить серьезные преобразования или рефакторинг кода.

Одним из самых приятных свойств DMS является возможность применять преобразования, указанные с использованием синтаксиса вашей грамматики, например: «если вы видите this (на моем языке), то замените его на , что ».

Вы можете увидеть пример определения правил лексера, парсера, prettyprinter и преобразования, которые определяют алгебру 9-го класса и немного исчисления. Переписать правила используются для упрощения и вычисления символических производных по алгебраическим формулам.

...