crypt of decay - January 16th, 2022 [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

January 16th, 2022

редактор и синтаксис-в-красках (несемантический) [Jan. 16th, 2022|06:56 am]
сразу отделим «семантическую» раскраску, и выкинем. «семантическая» — это когда редактор парзит текст в нечто наподобие AST, и красит по нему. хотя этот подход и позволяет много крутых штук, но реализовывать его муторно: надо делать полную грамматику языка, и парзер, устойчивый к коду с ошибками. это, конечно, решаемо, и даже библиотеки есть — но как по мне, то трудозатраты не стоят результата. поэтому я такое делать не буду.

остаётся обычная раскраска по ключевым словам. обычно её делают регэкспами, но так через жопу, что плакать хочется. то есть, берут — и тупо применяют какую-то библиотеку регэкспов. во-первых, надеясь, что у нас есть текст в плоском линейном буфере, а во-вторых, что универсальный движок регэкспов для этого хорош. оба предположения, само собой, полная хуйня.

как это делать правильно? тоже регулярками, конечно. но специализированым движком, который на выходе даёт DFA. прелесть DFA в том, что этот автомат всегда ровно в одном состоянии, и спокойно адвансится по символу за раз. поскольку нам не надо знать позиции субматчей, то мы можем просто сконструировать DFA напрямую из регулярки.

чем это лучше, чем универсальный движок? тем, что не надо тащить большую библиотеку (которую сначала надо найти, потому что в основном библиотеки регэкспов не имеют пошагового API), и тем, что можно потратить некоторое время, чтобы создать и оптимизировать DFA: это надо сделать один раз, у нас жёстко фиксированый набор регулярок. неважно, будет ли построитель суперэффективным: простота кода здесь важнее. к тому же DFA обычно больше, чем NFA, поэтому даже если существующая библиотека и использует внутри DFA — то обычно DFA строится на лету из NFA, и то не полностью. в нашем же случае эти оптимизации только мешают.

где-то на этом месте я вспомнил, что совершенно забыл, как компилировать регэксп в DFA. кажется, это было в Драконьей Книге, и где-то у Томпсона. придётся идти и читать всё заново. заодно искать, есть ли алгоритм, который позволяет добавить регэксп в уже существующий DFA: с точки зрения API удобней добавлять по одному регэкспу на токен. конечно, их можно на лету собирать в один огромный регэксп, и потом его скомпилировать, но у меня есть подозрение, что инкрементальное построение проще и эффективней.

чёрт, уже десятка, наверное, два лет этим не занимался, а регулярки всегда делал виртуалкой по томпсону-пайку. в прошлом редакторе DFA использовался только для кейвордов, а числа и прочее посложнее парзились явно. не хочу так, хочу красивый DFA.
Link21 meows|meow!

navigation
[ viewing | January 16th, 2022 ]
[ go | Previous Day|Next Day ]