Как написать транслятор?

3 ноября 2014 г. Просмотров: 798
Существует множество языков программирования, обладающих своими уникальными особенностями. Но для того, чтобы программа, написанная на любом из них, заработала, нужно произвести ее трансляцию. Иногда языки программирования разрабатываются для собственных нужд (например, поддержка автоматизации в крупных приложениях) и тогда возникает необходимость написать транслятор.

Вам понадобится

  • - естественная грамматика или БНФ исходного языка;
  • - средства разработки.

Инструкция

  • Подготовьте данные для осуществления лексического анализа текста на исходном языке. Составьте список всех лексем языка. Разбейте их на категории (ключевые слова, числовые и строковые литералы, идентификаторы, пробельные символы, знаки пунктуации, и т.д.).
  • Реализуйте модуль или программу лексического разбора. На входе она должна получать «сырой» поток данных, а на выходе формировать список элементов, содержащих лексемы и идентификаторы их типов в той последовательности, в которой они встречаются в исходном тексте.Программа лексического разбора может представлять собой достаточно простой «одноуровневый» сканер. Реализация восстановления после ошибок не имеет смысла. Недопустимые символы должны обрабатываться как ошибки.
  • Подготовьте данные для осуществления синтаксического анализа. На основе естественной грамматики или БНФ исходного языка составьте его LL1 грамматику. На основе грамматики данного типа составьте схему синтаксического разбора в терминах категорий допустимых лексем и семантических конструкций языка.
  • Реализуйте модуль или программу синтаксического анализа. На входе она должна получать список лексем, подготовленный на этапе лексического разбора. Разработайте рекурсивные алгоритмы проверки синтаксиса, используя созданную на третьем шаге схему. При необходимости реализуйте механизмы восстановления после ошибок.Добавьте в алгоритмы синтаксического анализа функционал построения дерева вычисления функций, методов классов. При правильной структуре алгоритмов разбора данный функционал может быть внедрен без особых проблем. Это позволит избежать необходимости его реализации в виде отдельного модуля. Созданные структуры данных должны содержать списки инструкций в виде «плоских» последовательностей (арифметические выражения, развернутые в постфиксную форму, пригодную для вычисления на стековой машине, циклы, преобразованные в комбинации последовательностей вычислительных инструкций и условных или безусловных переходов, и т.д.).
  • Создайте модуль оптимизации, если это необходимо. Он должен обрабатывать и преобразовывать структуры данных, подготовленные на предыдущем шаге. Алгоритмы и методы оптимизации весьма разнообразны.
  • Разработайте генератор кода. Обрабатывая структуры, подготовленные на четвертом или пятом шагах, он должен просто преобразовывать последовательности абстрактных инструкций в команды для исполнения на конкретной платформе.
  • Создайте программу связывания (линкер), если это необходимо. Она должна производить формирование результирующего исполняемого модуля, осуществляя выбор расположения сегментов кода, вычисление адресов меток и т.д.
  • Оцените статью!