SynLex

SynLex - Библиотека синтаксического анализа

Обзор

SynLex - это мощная и гибкая библиотека для создания лексеров (lexer), парсеров (parser) и компиляторов для произвольных языков программирования и DSL (Domain-Specific Languages). Библиотека предоставляет полный конвейер обработки исходного кода от текста до конечного результата.

Ключевые возможности

Архитектура конвейера

Исходный текст (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)

Преобразует исходный текст в последовательность токенов:

2. Синтаксический анализ (Parser)

Строит абстрактное синтаксическое дерево из потока токенов:

3. Компиляция (Evaluator)

Преобразует AST в результирующие объекты:

4. Виртуальная машина (VirtualMachine)

Выполнение байт-кода с настраиваемыми инструкциями:

Новое в версии 2.0

✨ Улучшения парсера

✨ Улучшенная обработка ошибок

✨ Позиционирование

✨ Виртуальная машина

Примеры использования

Калькулятор выражений

// Определяем типы токенов
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

🎯 Простота использования

⚡ Производительность

🔧 Гибкость

📚 Полнота

Дальнейшее чтение

Вклад и лицензия

SynLex является частью проекта Igdrasil Engine и используется для реализации скриптовых языков и DSL в игровом движке.


Разработано для: Igdrasil Engine
Автор: Alexander Izmailov
Собственность: Igdrasil Project
Версия: 2.0
Лицензия: Proprietary License

© 2026 Alexander Izmailov. Все права защищены.
Этот программный продукт является собственностью студии Igdrasil Project.