i582 / compiler_new_programming_language_22_03

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Конвертер языка С+- в С++

Задание

Есть некоторый новый язык С+-, он состоит из переменных, констант, литералов (строковых и числовых), функции вывода "print", функции ввода "input".

В языке используется неявная динамическая типизация: переменные могут хранить значения разных типов. Всего есть 3 основных типа:

  • Int (8 байт)
  • String
  • Float (8 байт)

Также язык поддерживает арифметические операторы "+" и "-" и оператор присваивания "=". Все доступные типы могут стоять по обе стороны от арифметических действий.

При этом правила конвертации следующие (порядок аргументов не важен):

  • String + Int/Float → число преобразуется в строку.
  • String - Int/Float → строка преобразуется в целое или дробное число, а если строка не является числовой (2) то будто бы она "0" .
  • Float (+, -) Int → целое число преобразуется в дробное.

В качестве входных данных — только один файл, в котором пишется весь код. Разделения на функции нет.

Пример кода:

var str = "Hello"; // переменная задаётся через var
str = str + "!"; // переменные можно изменять
print(str); // функция print принимает один параметр
str = 21 + 2 + 18; // можно записать в ту же переменную число
print(str); // -> 42
val worldString = "World"; // константа задёется через val
val answerNumber = 42;
print(worldString + answerNumber); // -> World42
print(worldString - answerNumber); // -> -42

val pi = 3.14;
print(pi + answerNumber); // -> 45.14

print(pi + answerNumber); // > 45.14
val numberString = "134";
print(numberString - answerNumber); // -> 92
print(numberString + answerNumber); // -> 13442
val name = input("Name: "); // выводит "Name: " и ждёт ввода
print("Your name is " + name);

Необходимо:

  1. Написать парсер любым удобным способом (генераторы или вручную)
  2. Написать проверку того, что константы не перезаписываются
  3. Написать проверку того, что используемые переменные существуют
  4. Сгенерировать код на С++ для полученного после парсинга AST
  5. Написать на С++ рантайм, который будет управлять всеми операциями ввода, вывода, сложения, умножения и т.д.
  6. Скомпилировать полученный С++ вместе с рантаймом в готовый бинарный файл

Примечания:

  1. Пишем на языке C++.
  2. Обратите внимание, что вы не должны пытаться вывести типы для переменных и сделать всё статически типизированным: вам нужно написать некоторый тип Mixed, который умеет хранить числа/строки и умеет в операции с другим Mixed .
  3. Числовой строкой является строка, состоящая только из цифр и одной опциональной точки. В итоге вы должны получить программу, которая на вход принимает файл с кодом, а на выходе даёт готовый бинарный файл.

Запуск программы

Программа собирается с помощью cmake и с помощью Makefile.

Для сборки с помощью Makefile достаточно ввести в консоль make.

Полученные объектный файл converter.out запускается командой ./convetret.out <input file>. В качестве единственного аргумента передаётся название файла, который надо конвертировать. Очистить область от объектных файлов можно командой make clean.

Программа распарсит файл, запишет получившийся код на языке С++ в файл m.cpp в папке result/. В этой папке уже лежат необходимые для компиляции m.cpp:

  • mixed.h
  • mixed.cpp
  • Makefile

В конце работы программа скомпилирует весь код в бинарный файл program в папке result/.

Этот файл можно запустить командой ./program.

Тестирование

Файлы для ручного тестирования лежат в папке /test/test_files. Полноценное тестирование я просто не успела написать(

Но, надо заметить, что в задании об обязательности наличия тестирования сказано не было.

About


Languages

Language:C++ 91.4%Language:Makefile 6.5%Language:CMake 2.1%