Интерактивный тренажер: Компилятор C++ → LMC

Редактор кода C++
Блок 1. Лексический анализ

Очищенный код

int main() {
    int x = 4;
    int y = 2;
    int unused = 100;
    int z = 4 * y - 2;

    if (x % 2 == 0) {
        cout << z;
    }

    return 0;
}

Таблица токенов

№ Лексема Тип
1 int Ключевое слово (Keyword)
2 main Идентификатор (Identifier)
3 ( Разделитель (Punctuation)
4 ) Разделитель (Punctuation)
5 { Разделитель (Punctuation)
6 int Ключевое слово (Keyword)
7 x Идентификатор (Identifier)
8 = Оператор (Operator)
9 4 Числовая константа (Literal)
10 ; Разделитель (Punctuation)
11 int Ключевое слово (Keyword)
12 y Идентификатор (Identifier)
13 = Оператор (Operator)
14 2 Числовая константа (Literal)
15 ; Разделитель (Punctuation)
16 int Ключевое слово (Keyword)
17 unused Идентификатор (Identifier)
18 = Оператор (Operator)
19 100 Числовая константа (Literal)
20 ; Разделитель (Punctuation)
21 int Ключевое слово (Keyword)
22 z Идентификатор (Identifier)
23 = Оператор (Operator)
24 4 Числовая константа (Literal)
25 * Оператор (Operator)
26 y Идентификатор (Identifier)
27 - Оператор (Operator)
28 2 Числовая константа (Literal)
29 ; Разделитель (Punctuation)
30 if Ключевое слово (Keyword)
31 ( Разделитель (Punctuation)
32 x Идентификатор (Identifier)
33 % Оператор (Operator)
34 2 Числовая константа (Literal)
35 == Оператор (Operator)
36 0 Числовая константа (Literal)
37 ) Разделитель (Punctuation)
38 { Разделитель (Punctuation)
39 cout Идентификатор (Identifier)
40 << Оператор (Operator)
41 z Идентификатор (Identifier)
42 ; Разделитель (Punctuation)
43 } Разделитель (Punctuation)
44 return Ключевое слово (Keyword)
45 0 Числовая константа (Literal)
46 ; Разделитель (Punctuation)
47 } Разделитель (Punctuation)
Блок 2. Синтаксический анализ (AST)
✓ Код полностью валиден. Лексических, синтаксических и семантических ошибок нет.
Принцип построения дерева: оператор является узлом, его операнды являются дочерними узлами.

Например: int x = 3 * 4 - y;

корень: =  →  слева переменная x с типом int  →  справа -  →  слева * с операндами 3 и 4  →  справа y.
ProgramFunction mainParametersBlock=xint4=yint2=unusedint100=zint-*4y2if==%x20Block<<coutzreturn0
Блок 3. Оптимизация
Оптимизация выполняется непосредственно над AST. Оптимизированный текст программы и второе дерево намеренно не выводятся. После оптимизации именно изменённое AST передаётся генератору LMC.

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

Constant Folding: константное выражение '4 * 2' вычислено заранее.
Constant Folding: константное выражение '8 - 2' вычислено заранее.
Constant Folding: константное выражение '4 % 2' вычислено заранее.
Constant Folding: константное выражение '0 == 0' вычислено заранее.
Control Flow Simplification: условие if известно как истинное.
Dead Code Elimination: удалена неиспользуемая переменная 'x'.
Dead Code Elimination: удалена неиспользуемая переменная 'y'.
Dead Code Elimination: удалена неиспользуемая переменная 'unused'.
Dead Code Elimination: удалена неиспользуемая переменная 'z'.
Блок 4. Генерация кода (LMC & x86-64)

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

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

// --- Память данных (DAT) ---
050 DAT 0     // Ноль
051 DAT 1     // Единица
052 DAT 6     // Константа 6
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