Программа на Guu состоит из набора процедур. Каждая процедура начинается со строки sub и завершается объявлением другой процедуры (или концом файла, если процедура в файле последняя). Исполнение начинается с sub main.

Тело процедуры – набор инструкций, каждая из которых находится на отдельной строке. В начале строки могут встречаться незначимые символы табуляции или пробелы. Пустые строки игнорируются. Комментариев в Guu нет.

В Guu есть лишь три оператора:

  • set <varname> <new value> – задание нового целочисленного значения переменной.
  • call <subname> – вызов процедуры. Вызовы могут быть рекурсивными.
  • print <varname> – печать значения переменной на экран.

Переменные в Guu имеют глобальную область видимости. Программа ниже выведет на экран строку a = 2.

sub main
    set a 1
    call foo
    print a

sub foo
    set a 2

А вот простейшая программа с бесконечной рекурсией:

sub main
   call main

Необходимо написать пошаговый интерпретатор для Guu. При его запуске отладчик должен останавливаться на строчке с первой инструкцией в sub main и ждать команд от пользователя. Минимально необходимый набор команд отладчика:

  • istep into, отладчик заходит внутрь call <subname>.
  • ostep over, отладчик не заходит внутрь call.
  • traceпечать stack trace исполнения с номерами строк, начиная с main..
  • varпечать значений всех объявлённых переменных.
  • save - сохраняет стек на момент вызова функции

Интерпретатор написано на языке программирования Kotlin

Версия компилятора - Kotlin version 1.3.31-release-197 (JRE 11.0.2+9)