Open TonitaN opened 3 months ago
Я вспомнила, в чём там дело :( Рефал-стиль для производных по префиксу => ничего не работает для эпсилон-переходов. Придётся глобально рефакторить.
Всё хуже, чем казалось... Рефал-стиль в ключах хеш-таблиц и множества привёл к мозговыносящим ошибкам компиляции библиотеки xhash при попытке перейти от set
к unordered_set
для vector<Regex>
вместо строки. Пока не удастся это починить, правки по SemDet и PumpLength откладываются.
Ну кстати рефал-стиль изгнать пока не удалось (как минимум без визирования Главного), из-за того, что нет нормальных конструкторов для Regex, которые бы принимали Symbol, а не строку. И либо через указатели нужно делать, либо (что гораздо соблазнительнее) --- через Regex(строка, полученная методом string из Symbol)
.
По-хорошему, надо это исправить + добавить хэшеры и порядок для алгебраических выражений, чтобы можно было пользоваться не только векторными структурами данных. А так, почти удалось исправить рефал-стиль, продолжаю тестировать работоспособность.
Ну Symbol приводится к строке неявно. В ардене так уже делали)
Ок, но Regex(Symbol::Epsilon)
имеет тип не eps
почему-то.
Все-таки нужно делать конструктор) Скажите, куда коммитить
Можно в ветку SemDet (тогда волью в свои неоттестированные изменения и уже по-человечески удастся избавиться от рефал-стиля), или в новую.
Ещё один вопрос: имеется ли возможность брать производные по размеченным эпсилонам? Вроде бы они имеют легальный тип символ, но почему-то не обрабатываются как обычные размеченные символы (функция производной ругается на регулярку, состоящую из размеченного эпсилона).
Пример теста, где видны коллизии типизации (специально взяла функционал без Эдгаровского, но эдгаровский тоже не может работать с эпсилонами по аналогичной причине):
A = Antimirov.Arden.Annote.Thompson {(a|b)*} !!
Возвращает автомат с единственным состоянием, потому что по размеченным эпсилонам не берётся производная.
Тест на следующую проблему (deannote, который заменяет алфавит, но ничего не меняется в регулярке):
A = DeAnnote.Arden.Annote.Thompson {(a|b)*|a*|b*} !!
Причина: в регулярке, которая может получиться только арденами из размеченного автомата, появляются ноды с заглавными размеченными эпсилонами, имеющими тип символ. Эти ноды без изменений попадают в регулярку со стёртой разметкой, и таким образом эпсилоны проникают в структуру выражений в явном виде. Без траверса, правильно типизирующего результат снятия разметки, судя по всему, не обойтись.
Исправить доделывания в ветке Эдгара и залить нормальные логи.