2009-09-01 1 views
5

Я хочу написать переводчик на двух языках, а после некоторого чтения в Интернете я решил пойти с ANTLR. Я должен был изучить его с нуля, но помимо некоторых проблем с устранением оставленной рекурсии все прошло хорошо до сих пор.ANTLR vs. Happy vs. другие генераторы парсеров

Однако сегодня какой-то парень сказал мне, чтобы проверить Happy, генератор синтаксического анализа на основе Haskell. У меня нет знаний Haskell, поэтому я мог бы использовать некоторые советы, если бы Happy действительно лучше ANTLR, и если это стоит изучить.

В частности, меня беспокоит то, что моему переводчику необходимо поддерживать макроподстановку, о которой я еще не знаю, как это сделать в ANTLR. Может быть, в Happy это легче сделать?

Или, если думаю, что другие генераторы парсеров еще лучше, я был бы рад услышать о них.

+0

Если вы в состоянии сказать, самая полезная информация, которую вы могли бы предоставить прямо сейчас, - это ответьте «Что такое исходный и целевой языки?» –

+0

@ 280Z28 Это родные языки. Они несколько похожи на Java, с той разницей, что класс может содержать определения макросов, а затем внутри методов макросы должны быть расширены. – Gabriel

+1

Между тем я понял, что моя проблема проще, чем я изначально думал. Мне удалось сделать это с ANTLR, в lexer, поэтому нет необходимости срочно изучать Happy или другой генератор. – Gabriel

ответ

5

Люди продолжают полагать, что если они просто получат парсер, они приготовят при создании языковых инструментов. Это просто неправильно. Парсеры доставят вас к предгорьям из Гималаев , затем вам нужно серьезно начать восхождение.

Если вы хотите, чтобы промышленная поддержка для создания переводчиков языка, см. Наш DMS Software Reengineering Toolkit. DMS обеспечивает

  • Unicode, основанные на лексические
  • полных контекстно-свободные парсеры (слева рекурсии? Нет проблем! Произвольное опережение? Нет проблем. Неоднозначные грамматики? Нет проблем)
  • полных передние концы для C, C#, COBOL, Java, C++, JavaScript, ... (включая полные препроцессорами для C и C++)
  • автоматического построения НРХ
  • поддержка для построения таблиц символов с произвольными правилами определения объема
  • ATTRIB тивной оценки грамматики, чтобы построить анализаторы, которые используют древовидную структуру
  • поддержка управления и анализа потока данных (а также реализация этого для полных C, Java и COBOL),
  • преобразования источника в источник с использованием синтаксиса источник и целевой язык
  • AST к исходному коду prettyprinting, чтобы воспроизвести целевой язык текста

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

В качестве примера переводчика, построенного с использованием DMS, см. Обсуждение converting JOVIAL to C for the B-2 bomber. Это 100% перевод для> 1 MSLOC жесткого реального времени. [Это может развлечь вас, чтобы знать, что нам никогда не разрешалось видеть, что переводная программа (совершенно секретная).]. И да, у JOVIAL есть препроцессор, и да, мы перевели большинство макросов JOVIAL в эквивалентные версии C.

[Haskell - классный язык программирования, но он сам по себе не делает ничего подобного. Речь идет не о том, что выражается на языке.Его выяснение того, какие механизмы необходимы для поддержки задачи манипулирования программами, и , затрачивая 100 человеко-лет на его строительство.]

+1

@ Ира Бакстер - это маленький мир, вы далеко от меня. : o –

+0

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

+1

Это потрясающе. Однако я предполагаю, что вы не можете найти ничего подобного в сообществе с открытым исходным кодом. – Gabriel