GithubHelp home page GithubHelp logo

compiler-tests's Introduction

Репозиторий с тестами для учебного компилятора

Пример репозитория с компилятором | Дополнительные материалы | Результаты

В табличку 'Результаты' нужно записаться до 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; Во всех случаях для ввода и вывода используются стандартные потоки ввода и вывода.

Описание корневого Makefile

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)

Задания

  1. Выражения + ввод / вывод в режиме интерпретатора (core/test001.expr - core/test008.expr, expressions/*.expr, deep-expressions/*.expr).
  2. Выражения + ввод / вывод в режиме стековой машины (core/test001.expr - core/test008.expr, expressions/*.expr, deep-expressions/*.expr).
  3. Выражения + ввод / вывод в режиме компиляции (core/test001.expr - core/test008.expr, expressions/*.expr, deep-expressions/*.expr).
  4. If + циклы (core/test009.expr - core/test022.expr) в режиме интерпретатора.
  5. If + циклы (core/test009.expr - core/test022.expr) в режиме стековой машины.
  6. If + циклы (core/test009.expr - core/test022.expr) в режиме компиляции.
  7. Функции (core/test023.expr - core/test026.expr) в режиме интерпретатора.
  8. Функции (core/test023.expr - core/test026.expr) в режиме стековой машины.
  9. Функции (core/test023.expr - core/test026.expr) в режиме компиляции.
  10. Строки (core/test027.expr - core/test028.expr) в режиме интерпретатора.
  11. Строки (core/test027.expr - core/test028.expr) в режиме стековой машины.
  12. Строки (core/test027.expr - core/test028.expr) в режиме компиляции.
  13. Массивы (core/test029.expr - core/test030.expr) в режиме интерпретатора.
  14. Массивы (core/test029.expr - core/test030.expr) в режиме стековой машины.
  15. Массивы (core/test029.expr - core/test030.expr) в режиме компиляции.

Замечания

Массивы в языке бывают двух видов: bodex, массив указателей, и unboxed, массив значений. Массивы (как и все указатели в нашем языке) начинаются с заглавной буквы, все остальные переменные - со строчной. Для реализации массивов понадобится автоматическое управление памятью. Функции работы с массивами:

  • arrlen () - длина массива;
  • Arrmake (, <default_value>) - выделение памяти под boxed массива;
  • arrmake (, <default_value>) - выделение памяти под unboxed массива;
  • operator [<element_number>] - доступ к соответствующему элементу массива.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.