Skip to content

khovanskiy/compilers-course

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

40 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Компилятор в X86 Assembly/GAS

Проект был выполнен Хованским В. в рамках курса по технологиям и инструментам построения языковых процессоров кафедры «Компьютерных технологий» Университета ИТМО.

Синтаксис и семантика языка

  1. Арифметически выражения любой вложенности с выполнением в соответствии с уровнями старшенства

    1. *, /, %
    2. +, -
  2. Логические выражения любой вложенности с выполнением в соответствии с уровнями старшенства и операторы сравнения и проверки равенства

    1. ==, !=, >, >=, <, <=
    2. &&
    3. ||, !!
  3. Переменые

    1. x := 5 * y
    2. z := x <= y
  4. Операции ввода-вывода (ввод и вывод осуществляется в стандартные потоки ввода и вывода: stdin, stdout)

    1. x := read()
    2. write(x)
  5. Условия с альтернативным ветками (как конкретными, так и обобщенными)

    if x >= y && z then
        write(x)
    elif z == 0 then
        write(y)
    else
        write(z) fi   
    
  6. Циклы while

    while k > 0
    do
        res := res * n;
        k := k - 1
    od;
    
  7. Циклы for с поддержкой составных условий и skip в предусловии

    for c := 2, c * c <= p && f, c := c + 1
    do
        f := p % c != 0
    od;
    
    for skip, n >= 1, n := n-1
    do
        f := f * n
    od;
    
  8. Фукнции

    fun A (m, n)
    begin
        if m == 0 then return n+1
        elif m > 0 && n == 0 then return A (m-1, 1)
        else return A (m-1, A(m, n-1))
        fi
    end
    
    write (A (1, 21))
    
  9. Символы

    1. C := 'a'
  10. Строки и набор предопределенных функций для работы с ними:
    S := "I will remember April."

    1. strlen - получение длины строки:
      strlen(S) => 22
    2. strget - получение заданного символа строки:
      strget(S, 2) => w
    3. strsub - получение подстроки, начиная с символа n, длиной в k символов:
      strsub (S, 7, 8) => remember
    4. strdup - копирование строки:
      strdup(S) => I will remember April.,
    5. strset - задание i-го символа строки:
      strset(S, 4, 'j') => I wijl remember April.,
    6. strcat - конкатенация двух строк:
      strcat(S, " It was very cold.") => I will remember April. It was very cold.,
    7. strcmp - сравнение двух строк (сравнение осуществляется по кодам символов строк, слева направо):
      strcmp(S, "I wijl remember April.") => 1
      strcmp(S, "I wiz") => -1
      strcmp(S, "I will") => -1
      strcmp(S, "I will remember April.") => 0
    8. strmake - создание строки из n повторящихся символов:
      strmake (10, 'a') => aaaaaaaaaa
  11. Массивы значений (unboxed-массивы) и набор предопределенных функций для работы с ними:

    1. arrmake - создание массива:
      1. S := arrmake (5, 0) => [0, 0, 0, 0, 0]
      2. S := arrmake (5, 123) => [123, 123, 123, 123, 123]
    2. arrlen - получение длины массивы:
      arrlen(S) => 5
    3. Присвоение значения элементу массива по индексу:
      S[1] := 4 => [0, 4, 0, 0, 0]
    4. Получение значения элемента массива по индексу:
      write(S[1]) => 4
  12. Массивы ссылок (boxed-массивы) и набор предопределенных функций для работы с ними, а также сборщик мусора (GC):

    1. Arrmake - создание массива:
      1. S := Arrmake (5, {}) => [nullptr, nullptr, nullptr, nullptr, nullptr]
      2. Присвоение со значением по умолчанию:
        1. S1 := arrmake (2, 1) => [1, 1]
        2. S2 := arrmake (2, 3) => [3, 3]
        3. S := Arrmake (2, {})
        4. S[0] = S1
        5. S[1] = S2
        6. S2[1] := 4
        7. write(S[0][1]) => 1
        8. write(S[1][0]) => 3
        9. write(S[1][1]) => 4
    2. arrlen - получение длины массивы:
      arrlen(S) => 5
    3. Присвоение ссылки элементу массива по индексу:
      S[1] := S1 => [1, 1]
    4. Получение значения элемента массива по индексу:
      write(S[1][0]) => 1
  13. Изменение потока выполнения.

    1. Метки
      label_name: - создание метки, указывающей на следующую после неё строку
    2. Оператор безусловного перехода
      goto label_name - переход к определённой точке программы, обозначенной меткой
    3. break - прерывание цикла
    4. continue - прерывание текущей итерации цикла и переход к следующей

Запуск

Для запуска программы нужна Oracle JRE 8, которую нужно предварительно установить с сайта http://www.oracle.com/technetwork/java/javase/downloads/index.html и убедиться, что она работает:

java -version

Сборка

Сборка осуществляется с помощью утилиты https://maven.apache.org/ следующей командой:

mvn clean package -DskipTests

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

Для тестирования требуется актуальный набор тестов, которые можно скачать, выполнив:

git submodule init && git submodule update

После этого автоматические тесты можно запустить следующей командой:

mvn test

При выполнении тестов будет происходить компиляция с помощью утилиты gcc. Для этого на некоторых системах должен быть установлен пакет g++multilib.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published