OnionGrief / Chipollino

преобразования регулярных выражений и конечных автоматов
Other
18 stars 4 forks source link

SemDet (#рефалстиль) #350

Open TonitaN opened 3 months ago

TonitaN commented 3 months ago

Исправить доделывания в ветке Эдгара и залить нормальные логи.

TonitaN commented 3 months ago

Я вспомнила, в чём там дело :( Рефал-стиль для производных по префиксу => ничего не работает для эпсилон-переходов. Придётся глобально рефакторить.

TonitaN commented 3 months ago

Всё хуже, чем казалось... Рефал-стиль в ключах хеш-таблиц и множества привёл к мозговыносящим ошибкам компиляции библиотеки xhash при попытке перейти от set к unordered_set для vector<Regex> вместо строки. Пока не удастся это починить, правки по SemDet и PumpLength откладываются.

TonitaN commented 3 months ago

Ну кстати рефал-стиль изгнать пока не удалось (как минимум без визирования Главного), из-за того, что нет нормальных конструкторов для Regex, которые бы принимали Symbol, а не строку. И либо через указатели нужно делать, либо (что гораздо соблазнительнее) --- через Regex(строка, полученная методом string из Symbol).

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

xendalm commented 3 months ago

Ну Symbol приводится к строке неявно. В ардене так уже делали) image

почтинерефалстиль

TonitaN commented 3 months ago

Ок, но Regex(Symbol::Epsilon) имеет тип не eps почему-то.

xendalm commented 3 months ago

Все-таки нужно делать конструктор) Скажите, куда коммитить

TonitaN commented 3 months ago

Можно в ветку SemDet (тогда волью в свои неоттестированные изменения и уже по-человечески удастся избавиться от рефал-стиля), или в новую.

TonitaN commented 3 months ago

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

TonitaN commented 3 months ago

Пример теста, где видны коллизии типизации (специально взяла функционал без Эдгаровского, но эдгаровский тоже не может работать с эпсилонами по аналогичной причине):

A = Antimirov.Arden.Annote.Thompson {(a|b)*} !!

Возвращает автомат с единственным состоянием, потому что по размеченным эпсилонам не берётся производная.

TonitaN commented 3 months ago

Тест на следующую проблему (deannote, который заменяет алфавит, но ничего не меняется в регулярке):

A = DeAnnote.Arden.Annote.Thompson {(a|b)*|a*|b*} !!

Причина: в регулярке, которая может получиться только арденами из размеченного автомата, появляются ноды с заглавными размеченными эпсилонами, имеющими тип символ. Эти ноды без изменений попадают в регулярку со стёртой разметкой, и таким образом эпсилоны проникают в структуру выражений в явном виде. Без траверса, правильно типизирующего результат снятия разметки, судя по всему, не обойтись.