Здравствуйте, Marty, Вы писали:
M>Там цикл статей, во второй статье:
M>M>Токенизация Python достаточно сложна, поэтому я не хочу реализовывать её на правилах PEG. Например, вы должны отслеживать отступы (для этого требуется стек внутри токенизатора); интересна также и обработка новых строк в Python (они значимы, кроме заключенных в соответствующие скобки). Многие типы строк также вызывают некоторую сложность. Короче говоря, у меня нет никаких претензий к уже существующему токенизатору Python, поэтому я хочу оставить его как есть. Кстати, у CPython есть два токенизатора: внутренний, который используется парсером, он написан на C, и стандартный библиотечный, который является точной копией, реализованной на чистом Python. Это пригодится в моём проекте.
А, спасибо, посмотрю. Да, indent-based синтаксисы традиционно трудны для вообще всех грамматических парсеров. У меня есть идея, как это можно было бы изящно сделать в PEG, не встраивая в него костыли. Но её надо проверять.
S>>Ну, тут формат примитивный, для него PEG делается в несколько строчек.
M>Можно будет сравнить, если вам не лень будет этим заняться. Я, когда запилю, напомню, на таком простом примере наверное не сложно будет уделать рукопашный парсер?
Что значит "уделать"? Опередить по компактности и читаемости кода — 100%.
M>Не говно — это когда функционал LSP доступен не через пайп, а через inproc плагин.
Ну так его-то и не завезли. Собственно, за систему inproc-плагинов люди и не любили старую студию.
M>Мой токенизатор.
При отдаче результата в dev>null? Или он у вас там порождает стилизированный HTML?
M>Тут надо разбираться, как сделать плагин для какой-нибудь IDE, это самое сложное. У меня вообще в тудушке есть пункт собрать некоторые свои плюсовые проекты в вебассемблю. Может появится побочный эффект, что я смогу на плюсиках делать плагины для ВСКода, но не факт.
Во-первых, на плюсиках плагины для ВСКода и так можно делать. Их уже делают кто во что горазд.
Во-вторых, сборка в wasm упростит деплоймент, но вряд ли улучшит быстродействие. Потому что узким местом LSP всё равно является JSON-RPC.
Встроить раскраску синтаксиса во встроенный редактор можно только через LSP либо TextMate2. Если вы захотите делать inproc-раскраску, вам придётся напилить свой custom editor.
M>Не костыля, а плагина

А какой смысл тогда называть "это" токенизатором, если у него внутри полноценный парсер?
M>А насколько он хорош для плюсов?
Для разбора плюсов или для порождения плюсового кода? Для разбора — нормально; для порождения — надо смотреть на инструменты.
Есть сразу несколько библиотек с реализацией PEG для плюсов. Но я на них не смотрел — не моя специализация.
M>Вы хотели сказать, наверное, lex+yacc/flex+bison?
Наверное. Но глядя на примеры "PEG" для плюсов (
https://github.com/taocpp/PEGTL/blob/main/src/example/pegtl/calculator.cpp) я вижу, что проблема не столько в конкретном выбранном виде парсеров, сколько в твёрдом убеждении их авторов в неизбежности страданий. Типа, "нельзя просто написать грамматику с действиями и разбирать ей тексты!". Надо получить обязательную порцию унижений в виде пачки бойлерплейта. В итоге, калькулятор с 18 операциями превращается в 360 строк кода

. При этом, собственно, от грамматики в исходнике ничего не остаётся — всё размазано по вспомогательным структурам и рукопашным методам match.
Вот
этот вариант выглядит получше, но всё делает в рантайме. Из этого мы сразу выводим что
а) косяки в грамматике тоже обнаружатся в рантайме, а в компайл-тайме нам ничего не скажут. То есть "приходи, дорогой друг, завтра, когда отработают тесты найтли билда".
б) быстродействие, скорее всего, хуже чем у плюсовых регекспов и аналогов на Javascript.
В общем, беглым взглядом я ничего не нашёл. Скорее всего, можно навелосипедить приличное решение, которое умеет разбирать текст DSL, который содержит грамматику и семантические действия, и порождать код на плюсах. Вот это, собственно, и даст возможность быстро выполнять как прототипирование, так и собственно разбор текста получившимся кодом.
M>Я когда-то flex+bison тыкал, тоже не помню для чего, может те же плюсики раскрашивал. Это ужасно
Отож.