
Создаём DSL на C#: Пишем парсер
Popou только что Создаём DSL на C#: Пишем парсер Средний 38 мин 0 .NET * C# * Программирование * Туториал Давно не было статьей, я просто хотел выпускать 1 статью в раз неделю, но не успевал, поэтому забросил и начал...
В сфере искусственного интеллекта произошло заметное событие. Popou только что Создаём DSL на C#: Пишем парсер Средний 38 мин 0 . NET * C# * Программирование * Туториал Давно не было статьей, я просто хотел выпускать 1 статью в раз неделю, но не успевал, поэтому забросил и начал поиск работы. Не давно решил продолжить, и какого было мое удивление что работы оставалось на 3 дня.
Чтож надеюсь следующую серию я выпишу быстрее. Создаём синтаксисПишем парсерСобираем blenderДобавляем семантикуДиагностикаИнтегрируем Language Server Protocol и делаем поддержку в Visual StudioГенерируем кодРабота с SourceTextМы, конечно, могли бы создать свой аналог SourceText, но в этом откровенно мало смысла. В Roslyn уже есть готовая абстракция исходного текста, и почти всё, что нам нужно для парсера, у неё уже есть: доступ к символам по индексу, длина текста, работа со строками, получение подстрок, вычисление checksum и создание текста из строки, потока или массива байтов.
Технические детали
Чем же он так полезен? Во-первых, можно меньше думать о низкоуровневой работе с кодировками. SourceText умеет хранить информацию о кодировке исходного файла, а в самом парсере мы можем работать не с байтами, а с привычными для дотнета строками и char.
Это сильно упрощает код лексера и парсера. Во-вторых, SourceText не обязательно должен быть просто одной строкой. Внутри Roslyn есть разные реализации для разных сценариев: обычный текст, большой текст, текст после изменений и композиция из сегментов.
То есть нам не нужно заранее решать, как именно хранить исходный файл в памяти. Мы можем опираться на уже готовую инфраструктуру Roslyn. Поэтому, поизучав этот вопрос, я решил не создавать копию SourceText, а использовать существующую реализацию.
Отраслевые последствия
Возможно в будущем мне это аукнется кстати, но надеюсь что нет. TextWindowНо как я упоминал ранее SourceText может состоять из сегментов текста, и доступ к конкретному символу может работать медленнее из-за дополнительных операция и проверок, поэтому что мы делаем это банально сразу запрашиваем небольшой кусок текстаusing Microsoft. Text; namespace Akbura.
Language; internal struct SlidingTextWindow { public const char InvalidCharacter = char. MaxValue; public const int DefaultWindowLength = 1024; private static readonly ObjectPool s_windowPool = new(() => new char); public SourceText private readonly int _textEnd; private int _positionInText; private ArraySegment _characterWindow; private int _characterWindowStartPositionInText; public SlidingTextWindow(SourceText text) { Text = text; _textEnd = text. Length; _characterWindow = new ArraySegment(s_windowPool.
Allocate()); ReadChunkAt(0); } private void ReadChunkAt(int position) { position = Math. Min(position, _textEnd); var amountToRead = Math. Min(_textEnd - position, DefaultWindowLength); Text.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





