User Tools

Site Tools


gram:case-017

This is an old revision of the document!


Кейс 017: Полноценный мини-язык программирования (gram:case-017)

Общая информация

Уровень сложности 🔴 Эксперт
Рекомендуемые языки C++, Rust
Основные инструменты ANTLR4, LLVM, Flex/Bison (опционально)
Требуемые знания Продвинутое программирование, системы типов, управление памятью

Описание кейса

Разработка полноценного статически типизированного языка программирования с поддержкой:

  1. функций и рекурсии
  2. пользовательских типов данных
  3. системы модулей
  4. базовых структур управления
  5. сборки мусора или ручного управления памятью

Грамматика языка

Лексические токены

// Ключевые слова
LET       : 'let'
FUNC      : 'func'
STRUCT    : 'struct'
IMPORT    : 'import'
IF        : 'if'
ELSE      : 'else'
WHILE     : 'while'
RETURN    : 'return'
TRUE      : 'true'
FALSE     : 'false'

// Типы
INT_TYPE  : 'int'
FLOAT_TYPE: 'float'
BOOL_TYPE : 'bool'
STRING_TYPE: 'string'
VOID_TYPE : 'void'

// Идентификаторы и литералы
ID        : [a-zA-Z_][a-zA-Z_0-9]*
INT_LIT   : [0-9]+
FLOAT_LIT : [0-9]+ '.' [0-9]+
STRING_LIT: '"' (~["\\] | '\\' .)* '"'

// Операторы и разделители
PLUS      : '+'
MINUS     : '-'  
MUL       : '*'
DIV       : '/'
ASSIGN    : '='
EQ        : '=='
NEQ       : '!='
LT        : '<'
GT        : '>'
LEQ       : '<='
GEQ       : '>='
AND       : '&&'
OR        : '||'
NOT       : '!'

LPAREN    : '('
RPAREN    : ')'
LBRACE    : '{'
RBRACE    : '}'
LBRACKET  : '['
RBRACKET  : ']'
COMMA     : ','
COLON     : ':'
SEMI      : ';'
ARROW     : '->'

WS        : [ \t\r\n]+ -> skip
COMMENT   : '//' ~[\r\n]* -> skip
BLOCK_COMMENT: '/*' .*? '*/' -> skip

Синтаксические правила

program     : (import_stmt | struct_def | func_def)* EOF

import_stmt : IMPORT STRING_LIT SEMI

struct_def  : STRUCT ID LBRACE (field_decl SEMI)* RBRACE
field_decl  : ID COLON type

func_def    : FUNC ID LPAREN params? RPAREN (ARROW type)? block
params      : param (COMMA param)*
param       : ID COLON type
type        : base_type | struct_type | array_type
base_type   : INT_TYPE | FLOAT_TYPE | BOOL_TYPE | STRING_TYPE | VOID_TYPE
struct_type : ID
array_type  : base_type LBRACKET RBRACKET

block       : LBRACE statement* RBRACE
statement   : var_decl | assignment | if_stmt | while_stmt | return_stmt | expr SEMI

var_decl    : LET ID (COLON type)? ASSIGN expr SEMI
assignment  : ID ASSIGN expr SEMI
if_stmt     : IF expr block (ELSE (if_stmt | block))?
while_stmt  : WHILE expr block
return_stmt : RETURN expr? SEMI

expr        : logic_or
logic_or    : logic_and (OR logic_and)*
logic_and   : equality (AND equality)*  
equality    : comparison ((EQ | NEQ) comparison)*
comparison  : term ((LT | GT | LEQ | GEQ) term)*
term        : factor ((PLUS | MINUS) factor)*
factor      : unary ((MUL | DIV) unary)*
unary       : (NOT | MINUS)? primary
primary     : literal | ID | call_expr | field_access | index_expr | LPAREN expr RPAREN

literal     : INT_LIT | FLOAT_LIT | STRING_LIT | TRUE | FALSE
call_expr   : ID LPAREN (expr (COMMA expr)*)? RPAREN
field_access: primary '.' ID
index_expr  : primary LBRACKET expr RBRACKET

План лабораторных работ

Лабораторная 1: Лексический и базовый синтаксический анализ

Задачи:

  1. Реализовать полную грамматику токенов
  2. Создать лексический анализатор с поддержкой комментариев
  3. Реализовать парсер для объявлений функций и структур
  4. Обработать вложенные блоки и выражения

Тестовые примеры:

struct Point {
    x: int;
    y: int;
}

func distance(p1: Point, p2: Point) -> float {
    let dx = p1.x - p2.x;
    let dy = p1.y - p2.y;
    return sqrt(dx*dx + dy*dy);
}

Результат: Парсер, способный разбирать сложные конструкции языка.

Лабораторная 2: Построение AST и семантический анализ

Задачи:

  1. Спроектировать иерархию классов AST
  2. Реализовать построение полного AST
  3. Создать систему символов (таблицы символов)
  4. Реализовать проверку типов для всех конструкций

Функции проверки:

  1. Контроль областей видимости
  2. Вывод и проверка типов выражений
  3. Валидация вызовов функций
  4. Проверка соответствия возвращаемых типов

Результат: Семантически проверенное AST с полной информацией о типах.

Лабораторная 3: Промежуточное представление и оптимизации

Задачи:

  1. Спроектировать промежуточное представление (IR)
  2. Реализовать трансляцию AST в IR
  3. Внедрить базовые оптимизации:
    1. удаление мертвого кода
    2. постоянное свертывание
    3. inline простых функций
  4. Реализовать управление памятью (стек/куча)

Результат: Оптимизированное промежуточное представление программы.

Лабораторная 4: Генерация машинного кода и runtime

Задачи:

  1. Интеграция с LLVM для генерации кода
  2. Реализация runtime-библиотеки
  3. Поддержка системных вызовов и ввода-вывода
  4. Создание системы сборки и пакетного менеджера

Особенности реализации:

  1. Генерация эффективного машинного кода
  2. Поддержка вызовов внешних функций (FFI)
  3. Реализация базовой стандартной библиотеки

Результат: Полноценный компилятор, способный компилировать и исполнять программы.

Расширенные возможности

Для достижения экспертного уровня рекомендуется реализовать:

  1. Система типов: дженерики, алгебраические типы данных, type inference
  2. Метапрограммирование: макросы, шаблоны, compile-time вычисления
  3. Параллелизм: async/await, корутины, модель акторов
  4. Инструменты: отладчик, профилировщик, REPL-окружение
  5. Оптимизации: автоматическая векторизация, межпроцедурный анализ

Примеры реализации

Архитектура проекта

minilang/
├── src/
│   ├── compiler/
│   │   ├── lexer/           // Лексический анализ
│   │   ├── parser/          // Синтаксический анализ
│   │   ├── ast/             // Абстрактное синтаксическое дерево
│   │   ├── semantic/        // Семантический анализ
│   │   ├── ir/              // Промежуточное представление
│   │   └── codegen/         // Генерация кода
│   ├── runtime/             // Runtime-библиотека
│   │   ├── gc/              // Сборка мусора
│   │   ├── stdlib/          // Стандартная библиотека
│   │   └── ffi/             // Внешние интерфейсы
│   └── tools/
│       ├── debugger/        // Отладчик
│       ├── repl/            // Интерактивная среда
│       └── package/         // Менеджер пакетов
├── grammar/
│   ├── MiniLangLexer.g4
│   └── MiniLangParser.g4
├── tests/
│   ├── unit/               // Модульные тесты
│   ├── integration/        // Интеграционные тесты
│   └── benchmarks/         // Бенчмарки производительности
└── examples/               // Примеры программ

Рекомендуемые ресурсы

Критерии оценки

Критерий Базовый уровень Экспертный уровень
Лексический анализ Поддержка базовых токенов Полная грамматика с комментариями и директивами
Синтаксический анализ Разбор простых конструкций Полный парсер с обработкой ошибок и восстановлением
Семантический анализ Базовая проверка типов Полная система типов с выводом и полиморфизмом
Промежуточное представление Простое IR Многоуровневое IR с оптимизациями
Генерация кода Базовый машинный код Оптимизированный native-код с поддержкой платформ
Инструменты Базовый компилятор Полный toolchain с отладчиком и пакетным менеджером

Пример программы

// Модуль для работы с геометрией
import "math";

struct Circle {
    center: Point;
    radius: float;
}

struct Point {
    x: float;
    y: float;
}

func area(c: Circle) -> float {
    return math::PI * c.radius * c.radius;
}

func main() -> int {
    let center = Point { x: 0.0, y: 0.0 };
    let circle = Circle { center: center, radius: 5.0 };
    
    let a = area(circle);
    print("Area: ", a);
    
    return 0;
}

← К списку лабораторных | На главную | ← Кейс 016

gram/case-017.1763089681.txt.gz · Last modified: by eugeneai