compiler/
├── lexer/LexerApp/ # Лексический анализатор
├── syntaxer/SyntaxerApp/ # Парсер + семантический анализ
├── compiler/EmitBackend/ # Компилятор в .NET сборки
└── testsO/ # Тестовые программы (22 теста)
Назначение: Разбивает исходный код на токены (лексемы).
Файлы:
Program.cs— содержит классыToken,TokenTypeиLexerTokenType— перечисление типов токенов (ключевые слова, операторы, литералы)Token— класс, представляющий токен с типом, значением и позициейLexer— основной класс лексического анализатора, преобразует исходный код в поток токенов
Использование: Используется как библиотека другими компонентами проекта.
Назначение: Парсинг токенов в AST, семантический анализ и оптимизация.
Parser.cs— рекурсивный нисходящий парсер, строит AST из потока токеновSyntaxError.cs— класс для представления синтаксических ошибок
Node.cs— базовый класс для всех узлов ASTProgramNode.cs— корневой узел программы, содержит список классовClassNode.cs— узел класса с полями, методами и конструкторамиMemberNodes.cs— узлы для членов класса (поля, методы, конструкторы)ExprNodes.cs— узлы выражений (литералы, вызовы методов, операции, доступ к полям)StmtNodes.cs— узлы операторов (присваивание, условные, циклы, return)
SemanticAnalyzer.cs— главный класс анализатора, координирует проверки и оптимизацииSemanticChecker.cs— выполняет семантические проверки (дубликаты, необъявленные идентификаторы, контекст)SemanticError.cs— класс для представления семантических ошибокSymbolTable.cs— таблица символов для отслеживания объявленных идентификаторовASTOptimizer.cs— оптимизатор AST (удаление неиспользуемых переменных, недостижимого кода)
AstTreePrinter.cs— вывод AST в виде дерева для отладки
IndexRange.Net48.cs— полифил для Index/Range для .NET Framework 4.8
Program.cs— точка входа, обрабатывает аргументы командной строки и запускает парсинг/анализ
Назначение: Компилирует AST в исполняемые .NET сборки (.exe) с использованием Reflection.Emit.
ILEmitter.cs— основной класс для генерации IL инструкций из AST узлов- Эмиссия выражений (литералы, операции, вызовы методов)
- Эмиссия операторов (присваивание, условия, циклы)
- Обработка встроенных типов (
Integer,Real,Boolean,Array)
BuildContext.cs— контекст компиляции, хранит информацию о типах, методах, конструкторахTypeMapper.cs— маппинг типов языка O в типы .NET
Logger.cs— логирование (Info, Success, Warning, Error)ErrorHandler.cs— обработка ошибок компиляции
Compiler.cs— главный класс компилятора- Создание сборки и модулей
- Создание типов классов
- Генерация методов и конструкторов
- Создание точки входа (entry point)
Program.cs— точка входа, обрабатывает аргументы и запускает компиляциюEmitBackend.csproj— файл проекта
Назначение: Набор тестовых программ на языке O для проверки всех компонентов компилятора.
01_basics.o— базовые конструкции (классы, поля, методы, конструкторы)02_control_flow.o— управляющие конструкции (if, while, return)03_inheritance.o— наследование классов04_this.o— использованиеthis05_array.o— работа с массивами06_boolean.o— логические операции07_forward.o— forward declarations08_calculator.o— пример калькулятора09_stack.o— пример стека10_math.o— математические функции (factorial, fibonacci, power)
01_duplicates.o— дубликаты классов, методов, переменных02_undeclared_var.o— необъявленные переменные03_undeclared_class.o— необъявленные классы04_return_context.o—returnвне метода05_this_context.o—thisвне класса06_base_class.o— несуществующий базовый класс07_assignment.o— присваивание методу
01_unused_vars.o— неиспользуемые переменные02_unreachable.o— недостижимый код03_while_false.o— циклыwhile(false)04_if_opts.o— упрощениеif(true)иif(false)05_combined.o— комбинация оптимизаций
Project-O.txt— спецификация языка OREADME.md— этот файл
Проверки дубликатов:
- Дубликаты классов
- Дубликаты методов с одинаковой сигнатурой
- Дубликаты конструкторов с одинаковой сигнатурой
- Дубликаты переменных в классе
- Дубликаты параметров в методах/конструкторах
Проверки объявлений:
- Использование переменных до объявления
- Использование необъявленных классов
- Использование необъявленных идентификаторов
- Существование базовых классов при
extends - Обнаружение циклического наследования
- Существование типов для параметров и возвращаемых значений
- Существование типов элементов для
Array[T]иList[T]
Валидация контекста:
returnтолько внутри методов/конструкторовthisтолько внутри класса- Присваивание только переменным (не методам/классам)
Проверки типов:
- Совместимость типов при присваивании (базовая проверка)
- Условия
ifиwhileдолжны быть типаBoolean - Проверка возвращаемого значения для методов с типом возврата
- Предупреждения о методах без типа возврата, возвращающих значение
Проверки встроенных методов:
- Существование методов на встроенных типах (
Integer,Real,Boolean,Array,List) - Корректное количество параметров для встроенных методов
- Тип индекса для
Array.get(),Array.set(),List.get()должен бытьInteger
Предупреждения:
- Неиспользуемые переменные (поля класса и локальные переменные)
Примечание: проверка совместимости типов реализована частично (базовые проверки для присваивания, полная проверка типов не реализована).
- Удаление неиспользуемых переменных-членов класса
- Удаление неиспользуемых локальных переменных
- Удаление недостижимого кода после
return - Удаление циклов
while(false) - Упрощение
if(true)иif(false)(замена на соответствующую ветку)
Все применённые оптимизации логируются строками вида OPTIMIZATION: ....
Основные возможности:
- Компиляция программ на языке O в исполняемые .NET сборки (.exe)
- Генерация IL кода с использованием Reflection.Emit
- Работает на .NET Framework 4.8 (net48)
Поддержка конструкций языка:
- Классы, методы, конструкторы, поля
- Наследование классов
- Арифметические операции (
Plus,Minus,Mult,Div,Rem) - Операции сравнения (
Less,Greater,Equal, и т.д.) - Условные операторы (
if-then-else) - Циклы (
while) - Массивы (
Array) и списки (List) - Встроенные типы (
Integer,Real,Boolean,String)
Особенности:
- Поддержка указания точки входа (
--start <Class>) - Автоматическое создание конструктора по умолчанию, если он не объявлен
- Поддержка перегрузки методов
- Поддержка виртуальных методов для полиморфизма
- Компилятор полагается на семантический анализатор (SyntaxerApp) для всех проверок корректности программы
Важно: Проекты поддерживают несколько фреймворков, поэтому необходимо явно указывать фреймворк с помощью флага
-f:
SyntaxerAppиспользует-f net9.0EmitBackendиспользует-f net48
dotnet run -f net9.0 --project syntaxer/SyntaxerApp/SyntaxerApp.csproj -- testsO/1_good_tests/01_basics.ocd syntaxer/SyntaxerApp
dotnet run -f net9.0 -- ../../testsO/1_good_tests/01_basics.odotnet run -f net9.0 --project syntaxer/SyntaxerApp/SyntaxerApp.csproj -- testsO/1_good_tests/01_basics.o --no-optimizecd compiler/EmitBackend
dotnet run -f net48 -- ../../tests/pos1.o --compile-net -o ../../tests/bin/Debug/net48/pos1 --start SimpleTest--compile-net- включить компиляцию в .NET сборку-o <путь>- указать путь для выходного файла (по умолчанию:<имя_файла>_output.exe)--start <Class>- указать класс точки входа (опционально)
# Компиляция базового теста
cd compiler/EmitBackend
dotnet run -f net48 -- ../../testsO/1_good_tests/01_basics.o --compile-net -o ../../tests/bin/Debug/net48/basics --start Basic
# Компиляция с массивами
dotnet run -f net48 -- ../../testsO/1_good_tests/05_array.o --compile-net -o ../../tests/bin/Debug/net48/array --start ArrTest
# Компиляция математических утилит
dotnet run -f net48 -- ../../testsO/1_good_tests/10_math.o --compile-net -o ../../tests/bin/Debug/net48/math --start MathUtilstestsO/
├── 1_good_tests/ 10 корректных программ - демонстрация языка O
├── 2_semantic_errors/ 7 тестов для проверки анализатора
└── 3_optimizations/ 5 тестов для проверки оптимизатора
Всего: 22 теста
# Демонстрация языка O
dotnet run -f net9.0 --project syntaxer/SyntaxerApp/SyntaxerApp.csproj -- testsO/1_good_tests/01_basics.o
# Проверка анализатора (семантическая ошибка)
dotnet run -f net9.0 --project syntaxer/SyntaxerApp/SyntaxerApp.csproj -- testsO/2_semantic_errors/01_duplicates.o
# Проверка оптимизатора
dotnet run -f net9.0 --project syntaxer/SyntaxerApp/SyntaxerApp.csproj -- testsO/3_optimizations/01_unused_vars.ocd compiler/EmitBackend
# Компиляция корректных программ
dotnet run -f net48 -- ../../testsO/1_good_tests/02_control_flow.o --compile-net -o ../../tests/bin/Debug/net48/control_flow --start ControlFlow
dotnet run -f net48 -- ../../testsO/1_good_tests/08_calculator.o --compile-net -o ../../tests/bin/Debug/net48/calculator --start Calculator
dotnet run -f net48 -- ../../testsO/1_good_tests/09_stack.o --compile-net -o ../../tests/bin/Debug/net48/stack --start Stack
# Тесты на семантические ошибки (должны завершаться с ошибкой)
dotnet run -f net48 -- ../../testsO/2_semantic_errors/01_duplicates.o --compile-net
dotnet run -f net48 -- ../../testsO/2_semantic_errors/02_undeclared_var.o --compile-net✅ Протестировано и работает:
- Все тесты из
1_good_tests/успешно компилируются - Все тесты из
2_semantic_errors/корректно обнаруживают ошибки - Исправлен тест
10_math.o(замененоTimesнаMultсогласно спецификации языка)
- C# .NET 9.0 (основной фреймворк)
- .NET Framework 4.8 (для компиляции в .NET сборки)
- Рекурсивный спуск (парсинг)
- AST (представление программы)
- Двухфазный анализ (проверки → оптимизации)
- Reflection.Emit (генерация IL кода)