Skip to content

pepegx/compiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📁 Структура проекта

compiler/
├── lexer/LexerApp/          # Лексический анализатор
├── syntaxer/SyntaxerApp/    # Парсер + семантический анализ
├── compiler/EmitBackend/    # Компилятор в .NET сборки
└── testsO/                  # Тестовые программы (22 теста)

📂 Детальное описание компонентов

🔤 lexer/LexerApp/ — Лексический анализатор

Назначение: Разбивает исходный код на токены (лексемы).

Файлы:

  • Program.cs — содержит классы Token, TokenType и Lexer
    • TokenType — перечисление типов токенов (ключевые слова, операторы, литералы)
    • Token — класс, представляющий токен с типом, значением и позицией
    • Lexer — основной класс лексического анализатора, преобразует исходный код в поток токенов

Использование: Используется как библиотека другими компонентами проекта.


🔍 syntaxer/SyntaxerApp/ — Парсер и семантический анализатор

Назначение: Парсинг токенов в AST, семантический анализ и оптимизация.

Parser/ — Синтаксический анализатор

  • Parser.cs — рекурсивный нисходящий парсер, строит AST из потока токенов
  • SyntaxError.cs — класс для представления синтаксических ошибок

AST/ — Абстрактное синтаксическое дерево

  • Node.cs — базовый класс для всех узлов AST
  • ProgramNode.cs — корневой узел программы, содержит список классов
  • ClassNode.cs — узел класса с полями, методами и конструкторами
  • MemberNodes.cs — узлы для членов класса (поля, методы, конструкторы)
  • ExprNodes.cs — узлы выражений (литералы, вызовы методов, операции, доступ к полям)
  • StmtNodes.cs — узлы операторов (присваивание, условные, циклы, return)

Analyzer/ — Семантический анализатор и оптимизатор

  • SemanticAnalyzer.cs — главный класс анализатора, координирует проверки и оптимизации
  • SemanticChecker.cs — выполняет семантические проверки (дубликаты, необъявленные идентификаторы, контекст)
  • SemanticError.cs — класс для представления семантических ошибок
  • SymbolTable.cs — таблица символов для отслеживания объявленных идентификаторов
  • ASTOptimizer.cs — оптимизатор AST (удаление неиспользуемых переменных, недостижимого кода)

Utilities/ — Утилиты

  • AstTreePrinter.cs — вывод AST в виде дерева для отладки

Compat/ — Совместимость

  • IndexRange.Net48.cs — полифил для Index/Range для .NET Framework 4.8

Основные файлы

  • Program.cs — точка входа, обрабатывает аргументы командной строки и запускает парсинг/анализ

🎯 compiler/EmitBackend/ — Компилятор в .NET сборки

Назначение: Компилирует AST в исполняемые .NET сборки (.exe) с использованием Reflection.Emit.

IL/ — Генерация IL кода

  • ILEmitter.cs — основной класс для генерации IL инструкций из AST узлов
    • Эмиссия выражений (литералы, операции, вызовы методов)
    • Эмиссия операторов (присваивание, условия, циклы)
    • Обработка встроенных типов (Integer, Real, Boolean, Array)
  • BuildContext.cs — контекст компиляции, хранит информацию о типах, методах, конструкторах
  • TypeMapper.cs — маппинг типов языка O в типы .NET

Utilities/ — Утилиты компилятора

  • Logger.cs — логирование (Info, Success, Warning, Error)
  • ErrorHandler.cs — обработка ошибок компиляции

Основные файлы

  • Compiler.cs — главный класс компилятора
    • Создание сборки и модулей
    • Создание типов классов
    • Генерация методов и конструкторов
    • Создание точки входа (entry point)
  • Program.cs — точка входа, обрабатывает аргументы и запускает компиляцию
  • EmitBackend.csproj — файл проекта

🧪 testsO/ — Тестовые программы

Назначение: Набор тестовых программ на языке O для проверки всех компонентов компилятора.

1_good_tests/ — Корректные программы (10 тестов)

  • 01_basics.o — базовые конструкции (классы, поля, методы, конструкторы)
  • 02_control_flow.o — управляющие конструкции (if, while, return)
  • 03_inheritance.o — наследование классов
  • 04_this.o — использование this
  • 05_array.o — работа с массивами
  • 06_boolean.o — логические операции
  • 07_forward.o — forward declarations
  • 08_calculator.o — пример калькулятора
  • 09_stack.o — пример стека
  • 10_math.o — математические функции (factorial, fibonacci, power)

2_semantic_errors/ — Тесты семантических ошибок (7 тестов)

  • 01_duplicates.o — дубликаты классов, методов, переменных
  • 02_undeclared_var.o — необъявленные переменные
  • 03_undeclared_class.o — необъявленные классы
  • 04_return_context.oreturn вне метода
  • 05_this_context.othis вне класса
  • 06_base_class.o — несуществующий базовый класс
  • 07_assignment.o — присваивание методу

3_optimizations/ — Тесты оптимизаций (5 тестов)

  • 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 — спецификация языка O
  • README.md — этот файл

✨ Возможности

🔍 Семантический анализатор

Проверки дубликатов:

  • Дубликаты классов
  • Дубликаты методов с одинаковой сигнатурой
  • Дубликаты конструкторов с одинаковой сигнатурой
  • Дубликаты переменных в классе
  • Дубликаты параметров в методах/конструкторах

Проверки объявлений:

  • Использование переменных до объявления
  • Использование необъявленных классов
  • Использование необъявленных идентификаторов
  • Существование базовых классов при extends
  • Обнаружение циклического наследования
  • Существование типов для параметров и возвращаемых значений
  • Существование типов элементов для Array[T] и List[T]

Валидация контекста:

  • return только внутри методов/конструкторов
  • this только внутри класса
  • Присваивание только переменным (не методам/классам)

Проверки типов:

  • Совместимость типов при присваивании (базовая проверка)
  • Условия if и while должны быть типа Boolean
  • Проверка возвращаемого значения для методов с типом возврата
  • Предупреждения о методах без типа возврата, возвращающих значение

Проверки встроенных методов:

  • Существование методов на встроенных типах (Integer, Real, Boolean, Array, List)
  • Корректное количество параметров для встроенных методов
  • Тип индекса для Array.get(), Array.set(), List.get() должен быть Integer

Предупреждения:

  • Неиспользуемые переменные (поля класса и локальные переменные)

Примечание: проверка совместимости типов реализована частично (базовые проверки для присваивания, полная проверка типов не реализована).

⚡ Оптимизатор AST

  • Удаление неиспользуемых переменных-членов класса
  • Удаление неиспользуемых локальных переменных
  • Удаление недостижимого кода после return
  • Удаление циклов while(false)
  • Упрощение if(true) и if(false) (замена на соответствующую ветку)

Все применённые оптимизации логируются строками вида OPTIMIZATION: ....

🎯 Компилятор в .NET (EmitBackend)

Основные возможности:

  • Компиляция программ на языке 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.0
  • EmitBackend использует -f net48

Синтаксический и семантический анализ (SyntaxerApp)

Из корня проекта

dotnet run -f net9.0 --project syntaxer/SyntaxerApp/SyntaxerApp.csproj -- testsO/1_good_tests/01_basics.o

Из папки SyntaxerApp

cd syntaxer/SyntaxerApp
dotnet run -f net9.0 -- ../../testsO/1_good_tests/01_basics.o

Без оптимизаций

dotnet run -f net9.0 --project syntaxer/SyntaxerApp/SyntaxerApp.csproj -- testsO/1_good_tests/01_basics.o --no-optimize

Компиляция в .NET сборку (EmitBackend)

Из папки EmitBackend

cd 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 MathUtils

🧪 Тесты

Структура тестов

testsO/
├── 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.o

Компиляция в .NET

cd 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 кода)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages