взяти визначення мавка;
взяти визначення мавка/розбирач;
взяти визначення мавка/перекладач;
простір мавка {
внутрішня дія обробити_значення(
М: *Машина,
значення: Значення,
) {
надрукувати_значення(
М,
значення,
2,
0
);
}
внутрішня дія обробити_падіння(
М: *Машина,
інформація_падіння: ІнформаціяПадіння,
) {
надрукувати_інформацію_падіння(
М,
інформація_падіння
);
}
внутрішня дія обробник_прочитання(
сирий_текст: кд,
кінець_файлу: логічне,
аргумент: адреса,
) {
змінна розмова = аргумент як *Розмова;
змінна М = розмова.М;
якщо кінець_файлу {
відпустити_середовище(М, розмова.середовище);
звільнити(М, розмова);
М.розмова = пусто;
надрукувати_кд(М, "");
вернути;
}
якщо сирий_текст.розмір == 0 {
стрибнути ще_раз;
}
змінна успіх = ні;
змінна знаки: розбирач::Знаки;
змінна помилка_розбору_на_знаки: розбирач::ПомилкаРозборуНаЗнаки;
змінна сполуки: розбирач::Сполуки;
змінна помилка_розбору_на_сполуки: розбирач::ПомилкаРозборуНаСполуки;
змінна скомпільований_код: *ПредметКоду = пусто;
змінна помилка_компілювання: перекладач::ПомилкаКомпілювання;
змінна інформація_падіння: ІнформаціяПадіння;
успіх = розбирач::розібрати_на_знаки(
М,
сирий_текст,
знаки::адреса,
помилка_розбору_на_знаки::адреса
);
якщо не успіх {
змінна рядок = розбирач::отримати_рядок_помилки_розбору_на_знаки(
М,
помилка_розбору_на_знаки
);
змінна помилка = "Не вдалось розібрати текст входу розмови.";
надрукувати_кд(М, помилка);
стрибнути ще_раз;
}
успіх = розбирач::розібрати_знаки_на_сполуки(
М,
сирий_текст,
знаки,
сполуки::адреса,
помилка_розбору_на_сполуки::адреса
);
якщо не успіх {
змінна рядок = розбирач::отримати_рядок_помилки_розбору_на_сполуки(
М,
помилка_розбору_на_сполуки
);
змінна помилка = "Не вдалось розібрати знаки входу розмови.";
надрукувати_кд(М, помилка);
стрибнути ще_раз;
}
успіх = перекласти_в_код(
М,
М.створити_текст("ввід"),
сирий_текст,
знаки,
сполуки,
скомпільований_код::адреса,
помилка_компілювання::адреса
);
якщо не успіх {
змінна помилка = "Не вдалось перекласти сполуки на код.";
надрукувати_кд(М, помилка);
стрибнути ще_раз;
}
змінна предмет_дії = створити_дію(
М,
розмова.середовище,
створити_текст(М, "розмова"),
М.пуста_послідовність,
пусто,
скомпільований_код,
М.шлях_до_теки_модулів
);
змінна розмір_історії = М.історія_здійснення.розмір;
змінна розмір_накопичувача_значень = М.накопичувач_значень.розмір;
змінна елемент_історії = покласти_в_історію_здійснення(
М,
розмова.середовище,
ПРЕДМЕТ(розмова.предмет_модуля),
предмет_дії,
Задіяні { ВидЗадіяних2, 0, пусто, 0 },
Місцезнаходження { М.створити_текст("ввід"), 0 }
);
змінна результат = виконати_код(
М,
М.накопичувач_значень::адреса,
елемент_історії.спроби::адреса,
розмова.середовище,
ПРЕДМЕТ(розмова.предмет_модуля),
скомпільований_код,
0,
предмет_дії.шлях_до_теки_модулів
);
якщо отримати_інформацію_падіння(М, інформація_падіння::адреса) {
обробити_падіння(
М,
інформація_падіння
);
знищити_інформацію_падіння(М, інформація_падіння);
вимкнути_стан_падіння(М);
} інакше {
обробити_значення(М, результат);
}
видалити_з_історії_здійснення(М, М.історія_здійснення.розмір - розмір_історії);
М.накопичувач_значень.розмір = розмір_накопичувача_значень;
ще_раз:
читати_ввід_асинхронно(
М,
розмова.перед,
обробник_прочитання,
розмова,
так
);
}
дія почати_розмову(
М: *Машина,
) {
якщо М.розмова != пусто {
вернути; // потім: помилка?
}
змінна предмет_модуля = створити_модуль(
М,
створити_текст(М, "розмова")
);
змінна середовище = створити_середовище(
М,
М.глобальне_середовище
);
середовище.кількість_запозичень += 1;
М.розмова = виділити<Розмова>(М, 1);
М.розмова.М = М;
М.розмова.перед = М.створити_текст("- ");
М.розмова.предмет_модуля = предмет_модуля;
М.розмова.середовище = середовище;
читати_ввід_асинхронно(
М,
М.розмова.перед,
обробник_прочитання,
М.розмова,
так
);
}
}