Проект был выполнен Хованским В. в рамках курса по технологиям и инструментам построения языковых процессоров кафедры «Компьютерных технологий» Университета ИТМО.
-
Арифметически выражения любой вложенности с выполнением в соответствии с уровнями старшенства
*,/,%+,-
-
Логические выражения любой вложенности с выполнением в соответствии с уровнями старшенства и операторы сравнения и проверки равенства
==,!=,>,>=,<,<=&&||,!!
-
Переменые
x := 5 * yz := x <= y
-
Операции ввода-вывода (ввод и вывод осуществляется в стандартные потоки ввода и вывода: stdin, stdout)
x := read()write(x)
-
Условия с альтернативным ветками (как конкретными, так и обобщенными)
if x >= y && z then write(x) elif z == 0 then write(y) else write(z) fi -
Циклы while
while k > 0 do res := res * n; k := k - 1 od; -
Циклы 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; -
Фукнции
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)) -
Символы
C := 'a'
-
Строки и набор предопределенных функций для работы с ними:
S := "I will remember April."- strlen - получение длины строки:
strlen(S)=>22 - strget - получение заданного символа строки:
strget(S, 2)=>w - strsub - получение подстроки, начиная с символа n, длиной в k символов:
strsub (S, 7, 8)=>remember - strdup - копирование строки:
strdup(S)=>I will remember April., - strset - задание i-го символа строки:
strset(S, 4, 'j')=>I wijl remember April., - strcat - конкатенация двух строк:
strcat(S, " It was very cold.")=>I will remember April. It was very cold., - 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 - strmake - создание строки из n повторящихся символов:
strmake (10, 'a')=>aaaaaaaaaa
- strlen - получение длины строки:
-
Массивы значений (unboxed-массивы) и набор предопределенных функций для работы с ними:
- arrmake - создание массива:
S := arrmake (5, 0)=>[0, 0, 0, 0, 0]S := arrmake (5, 123)=>[123, 123, 123, 123, 123]
- arrlen - получение длины массивы:
arrlen(S)=>5 - Присвоение значения элементу массива по индексу:
S[1] := 4=>[0, 4, 0, 0, 0] - Получение значения элемента массива по индексу:
write(S[1])=>4
- arrmake - создание массива:
-
Массивы ссылок (boxed-массивы) и набор предопределенных функций для работы с ними, а также сборщик мусора (GC):
- Arrmake - создание массива:
S := Arrmake (5, {})=>[nullptr, nullptr, nullptr, nullptr, nullptr]- Присвоение со значением по умолчанию:
S1 := arrmake (2, 1)=>[1, 1]S2 := arrmake (2, 3)=>[3, 3]S := Arrmake (2, {})S[0] = S1S[1] = S2S2[1] := 4write(S[0][1])=>1write(S[1][0])=>3write(S[1][1])=>4
- arrlen - получение длины массивы:
arrlen(S)=>5 - Присвоение ссылки элементу массива по индексу:
S[1] := S1=>[1, 1] - Получение значения элемента массива по индексу:
write(S[1][0])=>1
- Arrmake - создание массива:
-
Изменение потока выполнения.
- Метки
label_name:- создание метки, указывающей на следующую после неё строку - Оператор безусловного перехода
goto label_name- переход к определённой точке программы, обозначенной меткой - break - прерывание цикла
- 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.