Я хочу написать переводчик между двумя языками, и после некоторого чтения в Интернете я решил использовать ANTLR. Пришлось изучать его с нуля, но, если не считать проблем с устранением левой рекурсии, до сих пор все шло нормально.
Однако сегодня какой-то парень посоветовал мне проверить Happy, генератор синтаксических анализаторов на основе Haskell. У меня нет знаний Haskell, поэтому я мог бы воспользоваться некоторыми советами, действительно ли Happy лучше, чем ANTLR, и стоит ли его изучать.
В частности, меня беспокоит то, что мой переводчик должен поддерживать замену макросов, что я пока не знаю, как это сделать в ANTLR. Может в Хэппи это сделать проще?
Или, если вы считаете, что другие генераторы парсеров еще лучше, я был бы рад услышать о них.
Ответ 1 · рейтинг 6 · Ira Baxter
Люди продолжают верить, что если они просто получат синтаксический анализатор, они сделают это при создании языковых инструментов. Это просто неправильно. Парсеры доставят вас к предгорьям Гималаев, тогда вам нужно серьезно заняться альпинизмом.
Если вам нужна промышленная поддержка для создания языковых переводчиков, см. наш DMS Software Reengineering Toolkit а>. DMS обеспечивает
- Лексеры на основе Unicode
- полные контекстно-свободные синтаксические анализаторы (левая рекурсия? Нет проблем! Произвольный просмотр вперед? Нет проблем. Неоднозначные грамматики? Нет проблем)
- полный интерфейс для C, C#, COBOL, Java, C++, JavaScript, ... (включая полные препроцессоры для C и C++)
- автоматическое построение AST
- поддержка построения таблиц символов с произвольными правилами области видимости
- оценка грамматики атрибутов для создания анализаторов, использующих древовидную структуру
- поддержка управления и анализа потока данных (а также реализация этого для полного C, Java и COBOL),
- преобразование источника в источник с использованием синтаксиса исходного И целевого языка
- AST для красивой печати исходного кода, для воспроизведения текста на целевом языке
Что касается запроса OP на обработку макросов: наши внешние интерфейсы C, COBOL и C++ обрабатывают соответствующую предварительную обработку языка с помощью а) традиционного метода полного расширения или б) без расширения (где это целесообразно), чтобы обеспечить преобразование самих макросов после синтаксического анализа. . Хотя DMS как основа специально не реализует обработку макросов, она может поддерживать их создание и преобразование.
В качестве примера транслятора, созданного с помощью DMS, см. обсуждение преобразования JOVIAL в C для Бомбардировщик Б-2. Это 100% перевод для > 1 MSLOC кода жесткого реального времени. [Вас может позабавить тот факт, что нам никогда не позволяли увидеть реальную программу в переводе (совершенно секретно).]. И да, у JOVIAL есть препроцессор, и да, мы перевели большинство макросов JOVIAL в эквивалентные версии C.
[Haskell - классный язык программирования, но сам по себе он ничего подобного не делает. Дело не в том, что можно выразить языком. Речь идет о том, чтобы выяснить, какое оборудование требуется для поддержки задачи управления программами, и потратить 100 человеко-лет на его создание.]