OnionGrief / Chipollino

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

Слишком запоздалый Normalize #230

Open xtoter opened 1 year ago

xtoter commented 1 year ago

пытаемся получить допуск за ночь...

TonitaN commented 1 year ago

Так, если я сейчас это скачаю, можно ли будет считать, что оно готово к компромату?

xtoter commented 1 year ago

Нууу, дайте чуть волью (полчасика), там недописанно.

TonitaN commented 1 year ago

Уже не успеваю запустить. Скоро очередной экзамен, а ещё не на всех есть подробные компроматы... Придётся на экзамене добивать на вас.

TonitaN commented 1 year ago

Под виндой ветка не собирается:


\Chipollino-normalize\libs\Objects\src\Regex.cpp(449): error C4716: Regex::rewrite_normalize: должна возвращать значение

Интересный способ избегания...

TonitaN commented 1 year ago

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

Есть классная статья Сакаровича с обзором методов NFA->Regex и их классификацией относительно правил переписывания (т.е. разных применений Normalize) в алгебре регулярок. Aut_to_REGEX_methods.pdf

Эта статья полностью вписывается в тему нашего Чиполлино, и когда-нибудь мы сможем проверить все эти тождества автоматически.

TonitaN commented 1 year ago

~если не рассматривать возможные реализации переписывания на ФЯ~, наверное, самой близкой к теоретическому концепту будет реализация нормализации от Юры Петряева:

https://github.com/p0rtale/tfl-labs/tree/main/lab2

На скриптовом языке, даже lua, это, конечно, проще (я чувствую всю ту боль, которую вам приходится испытывать, когда вы пишете такие преобразования на плюсах, но увы... нужно было сразу брать другой язык или уж смириться и радоваться тем достоинствам, что есть у этого языка конкретно в рамках именно этой задачи)

P.S. - Сейчас, глядя на код нормализации в скриптах, в плюсах и в рефале, я вспомнила вашу фразу "то же плюс добавить рефал". Т.к. факту написание нормализации в чистых плюсах равносильно написанию мини-интерпретатора очень простого, но вполне себе функционального языка. Очевидно, ваши сложности связаны именно с этим, т.к. без переменных и сопоставления с образцом (в стиле мини-мини-рефала или пролога) решить эту задачу не удастся. Возможно, для экономии сил и раз уж всё равно есть расширенный парсер, действительно лучше использовать рефальский модуль (сможете быстро написать? это правда несложно), если никак иначе не получается.

xtoter commented 1 year ago

Вопрос к ̶ ̶в̶ы̶м̶и̶р̶а̶ю̶щ̶е̶м̶у̶ ̶в̶и̶д̶у̶ немногочисленным носителям рефала (@TonitaN). Я понимаю как считать правила переписывания, но вопрос к хранению. Сейчас правила переписывания захардкожены в код программы (все оказалось очень просто), но на вход как правила мы получаем по сути строку, и ее надо разобрать и как-то хранить. Если хранить как строку то мы теряем все прелести рефала и по сути уходим в рекурсию, и получаем кривой разбор. Я дошел до того что мне надо по-хорошему как-то хранить термы либо их хардкодить, но я не нашел как бы я это мог сделать. |aa* -> '|' e.1 e.1 '*' вот как это можно хранить в памяти, ибо разобрать то можно, а хранить как не нашел? Я нашел Implode_Ext но не уверен что это то что надо. Можно ли как-то хранить именно термы?

Spoiler не дооформили( ![image](https://user-images.githubusercontent.com/76103754/214477677-a2aa3b7d-0f85-4522-bdc0-ed5593e50adf.png)
TonitaN commented 1 year ago

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

xtoter commented 1 year ago

Я поражен, это просто прекрасно! Сейчас попробуем

TonitaN commented 1 year ago

Вопрос с недостающими скобками в to_str можно решить двумя способами.

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

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