Как построить AST для проприетарного языка? - PullRequest
2 голосов
/ 18 декабря 2010

Я пытаюсь понять, как построить AST для проприетарного языка.Мне нужно построить AST, чтобы я мог ввести свои правила и рекомендации, чтобы проверить возможные ошибки в исходном коде.

Как можно построить AST?Есть ли книги, статьи, которые могут помочь мне начать.Поможет ли книга драконов о компиляторах?

Обратите внимание, что я не из CS.

Спасибо

Ответы [ 2 ]

2 голосов
/ 18 декабря 2010

Это довольно большой вопрос.Я чувствую твою боль, так как я также решил эту проблему из не-CS фона.Это заставило меня ценить CS гораздо больше.

Одна вещь, которую вы, вероятно, увидите в своих исследованиях, это расширенная форма Бэкус-Наура (EBNF).Это в основном способ описания вашего языка.Создание EBNF для вашего языка поможет вам обдумать, что потребуется компьютеру для его синтаксического анализа, и поможет.

Возвращаясь к проблеме: вы, вероятно, будете использовать лексер /синтаксический анализатор для построения вашего дерева.

Традиционные инструменты, используемые для этого - lex и yacc, или их несколько более современные кузены flex и bison.

Более новый подход - Antlr .Настоятельно рекомендуется, но у меня над головой.

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

* Имеется множество примеров , доступных для pyparsing, что помогло.Самым полезным при создании моего парсера я нашел SimpleCalc .Тем не менее, он основан на довольно старой версии pyparsing и является более сложным, чем это необходимо для некоторых из мощных операций, которые позже реализовал pyparsing. SimpleArith - похожая, но более новая версия.

Одна вещь, которую я еще не выполнил с помощью pyparsing, - это правильный анализ синтаксических ошибок.Похоже, что он предоставляет необходимые инструменты для этого, однако.

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

1 голос
/ 20 декабря 2010

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

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

Я думаю о восхождении на Эверест в качестве аналогии. Получение ASTs походит на получение в 10 000-футовом базовом лагере. Любой ком может сделать это, просто поднявшись по склону, используя базовые технологии (походные ботинки). Восхождение на последние 17 000 футов требует совершенно другой технологии, преданности делу и плана, и большинство людей, пройдя первые 10000 футов, просто не готовы к остальной части поездки. (У меня есть некоторый опыт здесь, проверьте мою биографию).

Это все довольно подробные темы, и ваше отсутствие CS-опыта сделает ваш путь довольно трудным. (Однако все мы начинаем где-то, так что это действительно амбиции). Книга Дракона - отличный ресурс, который поможет вам понять, что делает этот механизм и зачем он вам нужен; существует много других хороших книг по компиляторам, которые, как правило, также будут полезны Но вы должны быть готовы к серьезному чтению.

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

ANTLR (уже упоминавшийся, сделанный довольно хорошим профессором CS) является своего рода тем, что он предоставляет возможности синтаксического анализа, позволяет вам определить, как создаются AST, и как процедурно пролезать через получившиеся AST. Но это не дает многого другого, что вам нужно для вашей задачи.

Наш инструментарий реинжиниринга программного обеспечения DMS предоставляет все средства, которые я упомянул в первом абзаце, а затем и некоторые. Одно из первых отличий, которое вы заметите при работе с DMS, заключается в том, что вам нужно предоставить только грамматику; он будет создавать AST без дополнительной помощи от вас.

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

«Настоящее» приложение DMS, которое проанализировало ваш проприетарный язык, будет значительно сложнее.

...