185 похожих чатов

Да, кстати, а какого размера грамматика, и как быстро генерится

лексер?

19 ответов

7 просмотров

В моем случае в тестовой грамматике было порядка 20-30 ключевых слов, и несколько generic правил. В том числе правило для идентификатора заданное как повторение всех известных символов этой грамматики кроме заданного набора. Это некорректное определение идентификатора, просто для тестирования такое выбрано. Каждое регулярное выражение по правилам Томпсона трансформируется в NFA. Затем каждый NFA трансформируется в минимизированный DFA алгоритмом Бжозовского. (эта операция выполняется быстро). Затем полученные автоматы объединяются в один единый NFA взятием объединения по эпсилон-переходу. Полученный автомат трансормируется в минимизированный DFA тоже алгоритмом Бжозовского. Последняя трансофрмация выполняется очень долго(порядка минуты). Её получается немного оптимизировать бинарной попарной union-редукцией автоматов, но принципиально это на производительности не отражается.

suhr- Автор вопроса
Ilya Lakhin
В моем случае в тестовой грамматике было порядка 2...

Минуты на генерацию это очень много. Даже тупая генерация с помощью производных от регулярок столько времени не занимает.

suhr
Минуты на генерацию это очень много. Даже тупая ге...

Ну, взятие производных наверное не такой тупой метод. Вообще, я думал на него перейти. А что есть лучше взятия производных?

suhr- Автор вопроса

Не знаю. Я реализовывал в стиле ехал Box через Box, но с более эффективным представлением дерева он наверное даже может достаточно быстро работать.

suhr
Не знаю. Я реализовывал в стиле ехал Box через Box...

Ну, каждая регулярка по отдельности у меня быстро трансформируется в минимальны DFA. Весь процесс меньше секунды занимает. Проблема возникает при их объединении в один единый.

suhr- Автор вопроса
Ilya Lakhin
Ну, каждая регулярка по отдельности у меня быстро ...

Так там автомат для лексера целиком генерится.

Ilya Lakhin
В моем случае в тестовой грамматике было порядка 2...

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

suhr
Минуты на генерацию это очень много. Даже тупая ге...

Даже на питоне генерация производными столько не занимает. У меня лексер для си меньше секунды генерился. Это с поддержкой ютф-8 в комментах и строках

Ilya Lakhin
То есть лучше на Хопкрофта перейти?

Можно начать с производных. Они за один проход дают хорошее приближение к минимальному автомату. Если этого покажется недостаточно, можно Хопкрофтом доминимизировать

Вообще, к слову, я с этим игрался. В смысле, я отказывался от минимизации, и просто детерминировал конечный автомат обычным взятием суперсета. Без минимизации. И скорость не сильно возросла в сравнении с Бжозовским. Не на порядок. Ну может раза в два быстрее выходило. Поэтому я бы предположил, что сам по себе алгоритм Бжозовского не настолько медленнее условного Хопкрофта. В общем, видимо все упирается в неэффективное кодирование. И надо либо деривативы брать, либо думать, как кодировать на коленке более аккуратно.

Ilya Lakhin
Вообще, к слову, я с этим игрался. В смысле, я отк...

Звучит как-то совсем печально. Может дело в том, как строится NFA? Если это делать неаккуратно, можно получить кучу лишних переходов и состояний. Если нет, значит где-то в детерминизации что-то очень сильно тормозит

Andrey
Звучит как-то совсем печально. Может дело в том, к...

Ну смотрите. Я NFA строю правилами Томпсона. И там конечно вставляются эпсилон-переходы на каждый чих. Тем не менее каждый по отдельности regex не очень большой, и детерминизация с ним справляется быстро. Ну то есть я сначала детерминирую каждый полученный автомат по отдельности, и это в целом происходит быстро, в течение сотен миллисекунд на все regex-ы(меньше секунды всего). После этого я из полученного набора автоматов конструирую один единый union просто добавляя новое входное состояние, и соединяя его эпсилон-переходом в каждый вход каждого автомата. Не более того. И уже детерминизация этого автомата растёт, скажем так, экспоненциально. Поэтому можно было бы предположить, что детерминизация узкое место. И наверное так и есть, но я не представляю, как его ускорить. Сам по себе алгоритм не может быть быстрым по определению. Я разумеется делаю некоторые разумные оптимизации. Я не строю единый кросс-продукт сразу, я строю кросс-продукты по мере необходимости. Вычилслил очередное замыкание по символу алфавита, положил его в очередь на обработку(если в очереди его ещё нет). Очередь у меня имеет хеш-таблицу, поэтому просмотр наличия замыкания в очереди относительно оптимизировано.

Ilya Lakhin
Ну смотрите. Я NFA строю правилами Томпсона. И там...

А какого размера автоматы получаются на выходе?

Andrey
А какого размера автоматы получаются на выходе?

Я сейчас не у компа, ну на вскидку сотни состояний после всех оптимизаций.

Ilya Lakhin
Я сейчас не у компа, ну на вскидку сотни состояний...

Совсем странно, у меня автоматы на десятки тысяч состояний производными прожёвывались за секунды. На питоне

Andrey
Совсем странно, у меня автоматы на десятки тысяч с...

А насколько у вас регэксы увеличивают ветвистость единого автомата?

Ilya Lakhin
А насколько у вас регэксы увеличивают ветвистость ...

Я для отдельных регекспов автоматы и не строю, сразу единый получаю, как в https://www.ccs.neu.edu/home/turon/re-deriv.pdf

Andrey
Я для отдельных регекспов автоматы и не строю, сра...

Ну да, я читал. Думаю так же попробовать.

Похожие вопросы

Обсуждают сегодня

Скажите, можно ли как-то "переместить" динамический массив из одной переменной в другую? Скажем, переместить из TList<> в TArray<>. Именно переместить, а не скопировать. Если ...
Eugene Krasnikov (ᴊɪɴ x)
37
Вот еще криповенькая штука. uMain.pas(517,3) Warning: Case statement does not handle all possible cases И ЧО? 😂
Александр (Rouse_) Багель
20
комрады, че-та лыжы не едут var tmpFont: TFont; begin tmpFont:= TFont.Create; try case rgFontColor.ItemIndex of 0: tmpFont.Color:= clWindowText; 1: tmpFo...
Ed Doc
34
Интересно, нет ли какого-то способа получить из dll не адрес самой метки, а адрес со смещением?
The Bird of Hermes
54
.model small .stack 100h .data a db 'Hello, World!', '$' ; исходная строка b db 20 dup(?) ; строка b с запасом на максимальную длину .code main: ...
Алексей -man
3
вопрос, кого посмотреть в ютубе или где почитать про указатели чтобы раз и навсегда запомнить зачем они нужны и как правильно ими пользоваться? поделитесь хорошими ресурсами, ...
-
14
М-да. Почему бы просто со stringlist не работать?
Michael Longneck
23
Is there a digital way to cut the electricity from a usb in linux? It sounds weird, but it's exactly what I need to do. I tried to simulate the unplug/replug but is not the ...
Eduard Rivas
15
Редактор листа Excel, по сути двумерный массив ячеек. Ячейка - это экземпляр класса, у нее всякие свойства, методы. Проблема в том, что количество используемых строк и колоно...
Sergey Bodrov
2
Всем привет. Подскажите пожалуйста, как решить вопрос с подсветкой синтаксиса в vscode. Уже и разные плагины установил, и пробовал пошаманить в json settings, ничего не получ...
EEv9ENN 🤖
6
Карта сайта