Интерактивный тренажер: Компилятор C++ → LMC | КАК РЕШАТЬ?

🎯 Учебное задание: разбор C++ по этапам компиляции Уровень 1 / 4 · Вариант #429920
Исходный C++ генерируется автоматически. Обучение идёт от простого к сложному: одна переменная → две переменные → if → цикл for. Ваша задача — определить тип каждой лексемы и восстановить название каждого узла AST. После проверки система покажет ошибки, но не подставит правильные ответы.

Сгенерированный C++

int main() {
    int x = 10;
    int result = x * 4;
    cout << result;
    return 0;
}

Управление вариантом

«Новый вариант» меняет программу, но оставляет тот же уровень сложности. «Следующий уровень» открывает следующую конструкцию C++. Все варианты проходят через тот же реальный Lexer → Parser → Semantic Analyzer → Optimizer → LMC.

Блок 1. Лексический анализ — классификация лексем Ответьте для каждой лексемы
Выберите тип лексемы. Правильный тип не показывается до проверки. Используется именно классификация, которую возвращает существующий Lexer приложения.
№ Лексема Ваш ответ — тип токена Результат
1 int —
2 main —
3 ( —
4 ) —
5 { —
6 int —
7 x —
8 = —
9 10 —
10 ; —
11 int —
12 result —
13 = —
14 x —
15 * —
16 4 —
17 ; —
18 cout —
19 << —
20 result —
21 ; —
22 return —
23 0 —
24 ; —
25 } —

Блок 2. Синтаксический анализ — восстановите AST

Структура дерева уже построена настоящим Parser. В каждом поле введите название соответствующей лексемы/узла точно так, как оно представлено в AST.

№ 1№ 2№ 3№ 4№ 5№ 6№ 7№ 8№ 9№ 10№ 11№ 12№ 13№ 14№ 15№ 16№ 17№ 18№ 19
№ — номер ответа Введите оператор, идентификатор, число или другое имя узла
Блок 3. Проверка компиляции
✓ Сгенерированный код прошёл Lexer, Syntax Analyzer и Semantic Analyzer без ошибок.
Эти результаты получены независимо от ответов ученика. Проверка задания не подменяет работу исходного компилятора.
Блок 4. Оптимизация
Оптимизация выполняется над AST исходного компилятора. После неё изменённое дерево передаётся тому же генератору LMC.

Журнал оптимизатора:

Constant Folding: константное выражение '10 * 4' вычислено заранее.
Dead Code Elimination: удалена неиспользуемая переменная 'x'.
Dead Code Elimination: удалена неиспользуемая переменная 'result'.
Блок 5. Генерация кода — LMC & x86-64

Архитектура Little Man Computer (LMC)

// --- Академический ассемблерный код LMC ---
    LDA 52     // константа 40
    OUT 02     // числовой вывод LMC
    LDA 53     // константа 0
    BRA L_program_end
    HLT

// --- Память данных (DAT) ---
050 DAT 0     // Ноль
051 DAT 1     // Единица
052 DAT 40     // Константа 40
053 DAT 0     // Константа 0

Учебное представление машинного кода x86-64

Это учебное представление машинного кода, а не готовый ELF/PE бинарник.
55 48 89 E5 48 83 EC 20 C7 45 FC 05 00 00 00 8B 45 FC 48 83 C4 20 5D C3