Общее задание по основам трансляции

Необходимо реализовать программу транслятор - Транспайлер в виде приложения на JavaScript, которое будет переводить код из входного языка программирования в JavaScript (JS), согласно индивидуальному заданию студента - Индивидуальные варианты задания. В зависимости от условия задачи транспайлер должен быть реализован в виде браузерной библиотеки, либо в виде серверного модуля для NodeJS. В случае браузерного решения ваш транспайлер подключается к странице HTML в виде самозапускающегося скрипта, который ищет на странице скрипты с кодом на входном языке. Найдя их он считывает их текстовое содержимое, транслирует в JavaScript код и запускает его в рамках текущей страницы. В случае серверного решения вам предстоит написать NodeJS модуль, который будет подключаться к программе серверу (server.js). Этот модуль будет отслеживать изменение файлов, написанных на входном языке, транслировать эти файлы в один единый сборочный файл на JS. Ссылка на этот файл будет вставляться в HTML документ. Таким образом, вся трансляция происходит на стороне сервера. В браузере запускается уже сгенерированный код на JS.

Этот абзац для тех, кто после прочтения задания понял, что это его последний учебный семестр и пора поискать себе занятие попроще. Вам предоставляется готовый шаблон кода, который вы можете найти в репозитории этого проекта. Там указано конкретное место, куда вам необходимо вставить свой код с транслятором. То же самое будет и для NodeJS. Самое главное, что от вас требуется - это написание кода транслятора. По сути те же самые куча циклов и условий из которых вы так полюбили делать программы. Если что-то еще сможете попутно понять из Web, то прекрасно. Я поставил перед собой задачу показать как пишутся современные проекты. Это не требование в них уметь разбираться, а просто демонстрация как это должно быть. Проект, который выложил, тоже не обязательно использовать. Он просто поможет грамотно организовать код, автоматизировать многие рутинные операции и ускорить разработку. Если хотите, то можете использовать обычную тройку из HTML, CSS и JS, главное чтобы скрипт находил на странице скрипты с входным языком, транслировал их и сразу запускал.

Программа состоит из 3 основных модулей:
  • Лексический анализатор
  • Синтаксический анализатор
  • Генератор кода

Для каждого модуля отводится отдельная лабораторная работа. Весь проект в сборе вместе с пояснительной запиской по транслятору сдается уже как Курсовая работа. Т.е. вы делаете одну большую работу, на основе которой получаете оценки и за зачет, и за курсовую.

Список функционала, который должен успешно транслироваться:

  1. Главная функция (если она необходима для работы программы на данном языке): main()
  2. Объявление и инициализация переменных (и для типизированных, и для нетипизированных языков)
  3. Обращение к инициализированным переменным и их изменение
  4. Начало и конец блока кода {...}
  5. Простые математические выражения с использованием следующих операторов =, +, -,*, /, %, sqrt, возведение в степень (операторы необходимо транслировать с учетом особенности работы их в транслируемых языках)
  6. Операторы сравнения >, <, <=, >=, ==
  7. Условные операторы НЕ, И, ИЛИ
  8. Условные выражения в стиле if ... else if ... else (выражение else if должно быть реализовано с учетом синтаксиса языков)
  9. Сокращенное условие (тернарный оператор): (условие ? значение1 : значение2) – если есть во входном языке
  10. Условие с множественным выбором: switch ... case ...
  11. Цикл с предусловием: while
  12. Цикл for(;;) (в зависимости от синтаксиса языков)
  13. Объявление и инициализация массивов: array = [1,2,3]
  14. Обращение к инициализированным массивам по индексу: print(array[i]);
  15. Стандартные методы языка для добавления и удаления значения из массива: array.push(newValue); array.pop()
  16. Объявление и вызов функций, передача параметров в функции: function fn(name)
  17. Функция может возвращать значение: return result
  18. Стандартный ввод-вывод в консоль или через диалоговые окна
  19. Очень желательна реализация на входном языке основных функций для работы с DOM деревом (добавление/удаление элементов, поиск элементов на странице, обработка событий нажатия/изменения и обновление свойств элементов - классов, атрибутов и т.д.)
  20. Крайне приветствуется работа с классами и объектами входного языка. Если будет реализована трансляция классов, то это будет огромный плюс к работе. На выходе в JS классы должны быть реализованы в прототипном стиле

Если что-то из описанного выше функционала, отсутствует во входном языке, то реализовывать его генерацию в JS не нужно. Если, наоборот, функционал есть во входном, но отсутствует в JS, то необходимо транслировать его в аналогичный функционал на JS, но с использованием стандартных операторов JS.

При трансляции необходимо учитывать специфику того или иного функционала во входном языке и JS. Например, в типизированных языках оператор / означает целочисленное деление для целых типов, а в языках с неявной типизацией это, как правило, обычное деление. Необходимо учитывать это различие в работе операторов и транслировать в выходные конструкции с аналогичным функционалом.

Этапы выполнения лабораторных работ:

Добавить изображение из буфера обмена (Максимальный размер: 20 МБ)