Проект был выполнен Хованским В. в рамках курса по технологиям и инструментам построения языковых процессоров кафедры «Компьютерных технологий» Университета ИТМО.
-
Арифметически выражения любой вложенности с выполнением в соответствии с уровнями старшенства
*
,/
,%
+
,-
-
Логические выражения любой вложенности с выполнением в соответствии с уровнями старшенства и операторы сравнения и проверки равенства
==
,!=
,>
,>=
,<
,<=
&&
||
,!!
-
Переменые
x := 5 * y
z := 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] = S1
S[1] = S2
S2[1] := 4
write(S[0][1])
=>1
write(S[1][0])
=>3
write(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
.