SynLex
SynLex - Библиотека синтаксического анализа
Обзор
SynLex - это мощная и гибкая библиотека для создания лексеров (lexer), парсеров (parser) и компиляторов для произвольных языков программирования и DSL (Domain-Specific Languages). Библиотека предоставляет полный конвейер обработки исходного кода от текста до конечного результата.
Ключевые возможности
- 🔍 Лексический анализ - преобразование текста в поток токенов с поддержкой пользовательских правил
- 🌳 Синтаксический анализ - построение абстрактного синтаксического дерева (AST) с backtracking
- ⚙️ Компиляция - преобразование AST в результирующие объекты через систему правил
- 🔄 Вариативный анализ - поддержка неоднозначных грамматик и множественных путей разбора
- 🖥️ Виртуальная машина - выполнение байт-кода с настраиваемыми инструкциями
- 📍 Точная позиция - отслеживание строк и столбцов для каждого токена
- 🛠️ Расширяемость - простое создание собственных правил через интерфейсы
Архитектура конвейера
Исходный текст (String)
↓
[Lexer] → Лексический анализ
↓
Поток токенов (Token[])
↓
[Parser] → Синтаксический анализ
↓
Абстрактное синтаксическое дерево (AST)
↓
[Evaluator<T>] → Компиляция
↓
Результат типа T
Быстрый старт
using SynLex;
using SynLex.LexicalAnalysis;
using SynLex.SyntacticAnalysis;
using SynLex.Compilation;
// 1. Создаем лексер для математических выражений
var lexer = new Lexer()
.AddRule(new SimpleSublineLexerRule(new[] { "+", "-", "*", "/" }, TOKEN_OPERATOR))
.AddRule(new RegexLexerRule("[0-9]+", TOKEN_NUMBER));
// 2. Анализируем текст
var lexResult = lexer.Analyze("2 + 3 * 4");
if (!lexResult.IsSuccess)
{
Console.WriteLine("Ошибка лексического анализа!");
return;
}
// 3. Создаем парсер
var parser = new Parser()
.AddRule(new SimpleParserRule(TOKEN_NUMBER))
.AddRule(new BinaryOperatorRule(TOKEN_OPERATOR));
// 4. Строим AST
var parseResult = parser.Analyze(lexResult.Tokens!);
if (!parseResult.IsSuccess)
{
Console.WriteLine("Ошибка синтаксического анализа!");
return;
}
// 5. Компилируем в результат
var evaluator = new Evaluator<int>()
.AddRule(new NumberEvaluatorRule())
.AddRule(new OperatorEvaluatorRule());
var evalResult = evaluator.Compile(parseResult.Ast!);
Console.WriteLine($"Результат: {evalResult.Result}"); // Результат: 14
Основные компоненты
1. Лексический анализ (Lexer)
Преобразует исходный текст в последовательность токенов:
- Lexer - основной класс лексического анализатора
- Token - структура, представляющая токен с типом, содержимым и позицией
- TextPosition - позиция в исходном коде (строка и столбец)
- ILexerRule - интерфейс для создания пользовательских правил
- SimpleSublineLexerRule - встроенное правило для точного совпадения строк
2. Синтаксический анализ (Parser)
Строит абстрактное синтаксическое дерево из потока токенов:
- Parser - парсер с поддержкой рекурсивного спуска и backtracking
- AbstractSyntaxTree - узел дерева с токеном и дочерними ветками
- ParserContext - контекст парсинга с отслеживанием позиции и ошибок
- IParserRule - интерфейс для создания правил парсера
- Вариативный парсинг - поддержка множественных путей разбора
3. Компиляция (Evaluator)
Преобразует AST в результирующие объекты:
- Evaluator
- компилятор с типизированным результатом - EvaluatorContext - контекст компиляции с доступом к подузлам
- IEvaluatorRule
- интерфейс для правил компиляции - Вариативная компиляция - генерация множественных результатов
4. Виртуальная машина (VirtualMachine)
Выполнение байт-кода с настраиваемыми инструкциями:
- VirtualMachine - интерпретатор инструкций
- Instruction - структура команды с кодом операции и операндами
- IVMExecutionRule - интерфейс для правил выполнения
- BytecodeCompiler - компиляция AST в байт-код
Новое в версии 2.0
✨ Улучшения парсера
- Backtracking - откат при неудачном применении правила
- ParserContext - явное управление позицией в потоке токенов
- Вариативный анализ - обработка неоднозначных грамматик
✨ Улучшенная обработка ошибок
- Result-паттерн - все операции возвращают результат с флагом успеха
- Детальные сообщения - ошибки содержат контекст и позицию
- Накопление ошибок - сбор всех ошибок вместо прерывания на первой
✨ Позиционирование
- TextPosition - структура вместо массива
int[] - Точное отслеживание - строка и столбец для каждого токена
✨ Виртуальная машина
- Полная реализация - вместо
NotImplementedException - Настраиваемые правила - гибкая система обработки инструкций
- Байт-код компилятор - преобразование AST в инструкции VM
Примеры использования
Калькулятор выражений
// Определяем типы токенов
const int TOKEN_NUMBER = 1;
const int TOKEN_PLUS = 2;
const int TOKEN_MULT = 3;
// Лексер
var lexer = new Lexer()
.AddRule(new RegexLexerRule(@"\d+", TOKEN_NUMBER))
.AddRule(new SimpleSublineLexerRule(new[] { "+" }, TOKEN_PLUS))
.AddRule(new SimpleSublineLexerRule(new[] { "*" }, TOKEN_MULT));
// Парсер
var parser = new Parser()
.AddRule(new ExpressionParserRule());
// Компилятор
var evaluator = new Evaluator<int>()
.AddRule(new CalculatorRule());
// Использование
var result = evaluator.Compile(
parser.Analyze(
lexer.Analyze("2 + 3 * 4").Tokens!
).Ast!
);
Console.WriteLine(result.Result); // 14
Язык разметки
// Парсинг простого DSL
var lexer = new Lexer()
.AddRule(new SimpleSublineLexerRule(new[] { "[", "]", ":" }, TOKEN_SYNTAX))
.AddRule(new RegexLexerRule(@"[a-zA-Z_]\w*", TOKEN_IDENTIFIER))
.AddRule(new RegexLexerRule(@"""[^""]*""", TOKEN_STRING));
var parser = new Parser()
.AddRule(new TagParserRule())
.AddRule(new AttributeParserRule());
var evaluator = new Evaluator<Document>()
.AddRule(new DocumentBuilderRule());
Преимущества SynLex
🎯 Простота использования
- Fluent API для конфигурации
- Встроенные правила для типичных задач
- Понятные результаты с флагами успеха
⚡ Производительность
- Эффективные структуры данных (Trie для ключевых слов)
- Минимальное копирование данных
- Оптимизированный backtracking
🔧 Гибкость
- Создание пользовательских правил через интерфейсы
- Композиция правил
- Настраиваемые обработчики ошибок
📚 Полнота
- Покрытие всего конвейера: Lexer → Parser → Evaluator
- Виртуальная машина для интерпретации
- Байт-код компилятор для оптимизации
Дальнейшее чтение
- Начало работы - установка и первые шаги
- Архитектура - детальное описание компонентов
- Лексический анализ - создание лексеров
- Синтаксический анализ - работа с парсерами
- Компиляция - преобразование AST
- Виртуальная машина - выполнение байт-кода
- Примеры - готовые решения для типичных задач
Вклад и лицензия
SynLex является частью проекта Igdrasil Engine и используется для реализации скриптовых языков и DSL в игровом движке.
Разработано для: Igdrasil Engine
Автор: Alexander Izmailov
Собственность: Igdrasil Project
Версия: 2.0
Лицензия: Proprietary License
© 2026 Alexander Izmailov. Все права защищены.
Этот программный продукт является собственностью студии Igdrasil Project.