Пример репозитория с компилятором | Дополнительные материалы | Результаты
В табличку 'Результаты' нужно записаться до 13 марта.
core- небольшой набор тестов, в котором есть (или будет) хотя бы по одному тесту на все необходимые к реализации части реализуемого языка;expressionsиdeep-expressions- много тестов на базовое подмножество языка (арифметические выражения + ввод / вывод);performance- пара тестов на сравнение эффективности компилятора с gcc.
В папках core, expressions и deep-expressions есть пачка тестов (*.expr),
входы для тестов (*.input), эталонные выводы (orig/*.log) и Makefile.
Этот репозиторий добавляется как подмодуль (submodule) в корень репозитория компилятора.
В корне также находится папка runtime, в которой по запуску make генерируется объектный
файл окружения (runtime.o). Таким образом, путь до runtime.o из подмодуля
compiler-tests - ../runtime/runtime.o.
По запуску make в корне репозитория компилятора должен создаваться бинарник самого компилятора
с именем rc. Таким образом, путь до бинарника из подмодуля - ../rc.
Интерфейс бинарника:
rc -i filename.expr- интерпретация программы из файлаfilename.expr;rc -s filename.expr- компиляция программы из файлаfilename.exprв представление стековой машины с последующей интерпретацией стековой машиной;rc -o filename.expr- компиляция программы из файлаfilename.exprв запускаемый файлfilename; Во всех случаях для ввода и вывода используются стандартные потоки ввода и вывода.
TODO
TESTS=test001 test002 test003 test004 test005 test006 test007 test008 test009 test010 test011 test012 test013 test014 test015 test016 test017 test018 test019 test020 test021 test022 test023 test024 test025 test026 test027 test028
.PHONY: check $(TESTS)
check: $(TESTS)
$(TESTS): %: %.expr
RC_RUNTIME=../runtime ../rc.native -o $< && cat $@.input | ./$@ > $@.log && diff $@.log orig/$@.log
cat $@.input | ../rc.native -i $< > $@.log && diff $@.log orig/$@.log
cat $@.input | ../rc.native -s $< > $@.log && diff $@.log orig/$@.log
clean:
rm -f test*.log *.s *~ $(TESTS)- Выражения + ввод / вывод в режиме интерпретатора (
core/test001.expr-core/test008.expr,expressions/*.expr,deep-expressions/*.expr). - Выражения + ввод / вывод в режиме стековой машины (
core/test001.expr-core/test008.expr,expressions/*.expr,deep-expressions/*.expr). - Выражения + ввод / вывод в режиме компиляции (
core/test001.expr-core/test008.expr,expressions/*.expr,deep-expressions/*.expr). - If + циклы (
core/test009.expr-core/test022.expr) в режиме интерпретатора. - If + циклы (
core/test009.expr-core/test022.expr) в режиме стековой машины. - If + циклы (
core/test009.expr-core/test022.expr) в режиме компиляции. - Функции (
core/test023.expr-core/test026.expr) в режиме интерпретатора. - Функции (
core/test023.expr-core/test026.expr) в режиме стековой машины. - Функции (
core/test023.expr-core/test026.expr) в режиме компиляции. - Строки (
core/test027.expr-core/test028.expr) в режиме интерпретатора. - Строки (
core/test027.expr-core/test028.expr) в режиме стековой машины. - Строки (
core/test027.expr-core/test028.expr) в режиме компиляции. - Массивы (
core/test029.expr-core/test030.expr) в режиме интерпретатора. - Массивы (
core/test029.expr-core/test030.expr) в режиме стековой машины. - Массивы (
core/test029.expr-core/test030.expr) в режиме компиляции.
Массивы в языке бывают двух видов: boxed, массив указателей, и unboxed, массив значений. Массивы (как и все указатели в нашем языке) начинаются с заглавной буквы, все остальные переменные - со строчной. Для реализации массивов понадобится автоматическое управление памятью. Функции работы с массивами:
- arrlen () - длина массива;
- Arrmake (, <default_value>) - выделение памяти под boxed массива;
- arrmake (, <default_value>) - выделение памяти под unboxed массива;
- operator [<element_number>] - доступ к соответствующему элементу массива.