Вопрос по ЛР-3
TonitaN opened this issue · comments
Часть из ребят имеет хорошие заготовки проектов (контест, л.р. номер 2). Если кому-то они нравятся и вы к ним привыкли, то в рамках л.р.3 можно будет продолжить. Но для этого вы должны здесь записаться и сказать, что хотите делать дальше уже имеющийся проект.
К @Qmask26 и @stasstaf есть специальное предложение от Данилы Павловича, но это мы с ним ещё обсудим, когда он вернётся, и когда почти закончится основной групповой проект по л.р. номер 2. Возможно, будете переносить НКА на микроконтроллеры :)
P.S. - Подведение итогов по индивидуальным вариантам ЛР 2 будет, когда я у всех всё допроверю (@pugprogram, @ynastt, простите, я знаю, что вы давно ждёте, но с этими РК и прочими делами только сейчас дойдут руки). То есть завтра или послезавтра.
За специальное предложение специальные баллы полагаются?)
Точно сохранится бонус lua и добавится бонус за железо. Но пока что не предлагаю соглашаться сразу, надо сперва на ваш проект посмотреть и определиться, какие тут появятся задачи. Опять-таки, не думаю, что если кроме вас будет кто-то желающий, Данила Павлович откажется с ним работать.
@Qmask26 , вот у вас вообще море альтернативных вариантов: продолжать делать библиотеку автоматов на lua - раз, вместе с Матвеевым развивать анализатор КС-грамматик - два, или специальное предложение.
Вопрос по 3 варианту. В синтаксисе грамматики указано, что {rule} ::= {nterm}->({nterm}|{term})*
. Если правая часть пустая, то это значит, что нетерминал переходит в пустую строку (эпсилон)? Допустим, есть правило [S]->
- значит S раскрывается в пустую строку?
Да, правильно.
Вопрос, что делать, если в 0 варианте у нас в некоторый момент возникло уравнениеA = (bA)*b
(т.е. с рекурсией под звёздочкой и без других рекурсивных выходов).
Как и написано в слайде 4, итерацию нужно раскрыть, перебрав случаи, когда A
явно входит в регулярку: A = (bA)*bbA + b
(первое слагаемое соответствует непустой итерации, второе - пустой). И дальше по Ардену: A = ((bA)*bb)*b
и подставляем выход из рекурсии: A = ((bb)*bb)*b`.
Ещё один пример от @pugprogram: B->(b)*B|b|a(aB)*a
. Преобразуем в уравнение (сразу же переставляю местами константы и итерации): B = (b)*B + aa(aB)* + b
. Здесь также два случая по второму слагаемому: B = (b)*B + aaa(aB)*B + (aa + b)
. И дальше: B = (b*|aaa(aB)*)B+(aa|b)
. И дальше стандартно.
Тоже вопрос по 3 варианту. Как выводить конечные автоматы, определяющие поведение сентенциальных форм? Нужно выводить красиво, как во 2 групповой лабе? Также вопрос нужно ли строить грамматику по автоматам и приводить ее к нормальной форме? или достаточно выводить автомат после реверса, а строить грамматику, при этом используя бисимуляцию уже на доп баллы?
Грамматику строить нужно, а вот упрощать не обязательно (это доп баллы). Выводить автоматы красиво тоже не обязательно - главное, чтобы это было читаемо.
Также, если кто-то хочет записаться на доделывание индивидуальных вариантов 2 л.р., но забыл сообщить об этом, вы можете исправить ситуацию до 13 ноября.
Беру 6 вариант доработки л.р. 2
@Qmask26 , Артём и Владимир не с вами остаются?
Я бы у вас завернула в другую сторону: и заодно это на перспективу к микроконтроллерам будет (если удастся всё-таки с Посевиным договориться про 4-5 л.р) - не демонстрация теоретических конструкций, а скорость и расширение синтаксиса регулярок. Мне очень понравилась в целом скорость lua и в частности скорость работы многого из вашего функционала. REPL и перенос алгебры автоматов в интерфейс оставим, это в любом случае удобно, а остальные варианты я сейчас накидаю вам в соответствующей теме.
Синтаксис входной КС-грамматики для всех трёх вариантов приведён на слайде 10! Пожалуйста, будьте внимательны.
Вопрос по 3 варианту: я правильно понимаю, что в первом способе надо сначала устранить левую рекурсию, а потом нумеровать нетерминалы и делать подстановки (в презентации к лекции 6 как-то странно это описано, там зацикливание на подстановках получается + только удаление непосредственной левой рекурсии + введение нового нетерминала может нарушить порядок, если он уже введен, а подстановки произведены)?
Там реально пропущен рекурсивный шаг, спасибо, сейчас исправлю: нужно подстановками добиться того, чтобы для конкретного k
(начиная с k=1
) не было правил вида A_k -> A_n W
, где n<k
, при этом могут быть правила вида A_k -> A_k W
. Для последних удалить левую рекурсию и рекурсивно продолжить то же самое действие уже для k+1
.
Вопросы по 3 варианту насчет алгоритма Блюма-Коха.
-
Я правильно понимаю, что то, что выделено красным означает: И ((C_B != B_B) ИЛИ (из B_B есть стрелки в обратном автомате M_B))?
(кстати еще тут в третьем пункте в третьем подпункте по идее опечатка: должно быть <D_B, E, C_B>) -
В первом пункте из скриншота выше E означает последовательность терминалов и нетерминалов? Если это так, то на следующем слайде
S_E существует, только если E - нетерминал, это как-то странно (я написал программу и протестировал: часть нетерминалов ни во что не переписываются из-за этого). -
Насчет последнего слайда: я считаю все одинаковые нетерминалы с разными индексами (например D_B и D_C) за один нетерминал при объединении всех G_i. Верно ли это? Ведь G_i не имеют общих нетерминалов, они между собой не связаны (если различать одинаковые нетерминалы с разными индексами).
UPD: возможно будет проще, если вы скинете статью по этому алгоритму (я не смог найти)
S_B
действительно должно бытьD_B
в третьем подпункте, а вот условие правильное, и да, там "ИЛИ". По факту оно означает, что если изN_N
стрелок нет, то вход в него соответствует всегда терминальному правилу (нерекурсивен). Когда вы порождаете регулярную грамматику по автомату, и там есть конечные состояния, из которых нет переходов, то они обрабатываются точно так же: переход в них соответствует правилу без нетерминальных символов.- Нет,
Е
- это только нетерминалы, с учётом того, что в данном алгоритме исходной предполагается форма ХНФ (см. слайд 9). - Связь есть - осуществляется она в пунктах 3 и 4 последнего слайда. Т.е. если
S_E -> a A_E
, например, аD_B -> E C_B
, то по третьему правилу получаетсяD_B -> a A_E C_B
. Когда я показывала примеры, в этом случае я говорила, что нужно заменить все неразмеченныеE
на соответствующиеS_E
, а потом подставить вS_E
правила переписывания, которые точно начинаются с терминального символа.
В статье как раз написано так же, как на слайде (имхо на примерах было попроще), но я её сейчас пришлю.
Кстати, забыла: @boomb0om уже несколько дней назад сделал 2*ГНФ, см. https://github.com/boomb0om/FormalLanguageTheory
Бонусные баллы будут обязательно, но опять-таки через неделю, чтобы все успели закончить (и я успела нормально проверить).
Поскольку с дополнениями и прочим с автоматами грустная ситуация (в том числе из-за багов в детерминизации в группе @Postlog), в варианте 1 на зачёт достаточно сделать только пункт 2 (пересечение грамматики ПСП и регулярки и парсинг). Пункт 1 уходит в допбаллы (+4). ХНФ для парсинга берём у товарищей.
На 3 лабораторной каминг-аут как рефальщики сделало достаточно много народа. Поимённо перечислять не буду: они пока ещё слишком стесняются, поскольку рефал-стиль использовали не в рефале, а в языках, которые легче принимаются общественностью. Зачем же вы так, создали себе много неудобств. Быть рефальщиком и вести рефал-пропаганду пока что не запрещено законом )
Кто ещё не сдал 3 лабораторную - у вас есть ещё завтра до вечера, чтобы успеть до раздачи бонусов. Проверять буду всех тоже завтра.
Пользуясь случаем, передаю привет @maksimellian и напоминаю, что пора заводить репозиторий для курсовой работы.
Список тех, кто будет делать 5 лабораторную работу на Рефале:
- @pugprogram
- @Espenario
- @Lasadaf
- (лучше всех замаскировался, но рефальщик сразу узнает рефальщика, так что...) @N1X41
...и to be continued.
Добро пожаловать в клуб! Не бойтесь: всему научу, всё покажу ))
UPD: Ну если уж так не хочется Рефала, то последний шанс его избежать - будет вам коллективная 5 лаба на автоматическое определение рефал-стиля в программах по тфя. Но лишь в том случае, если я не обнаружу соответствующей стилистики в 4 лабе. Иначе Рефал неизбежен )
Ура! Свершилось! Появились избранные! И сразу целых две штуки, чему я очень рада, т.к. не могло же быть, чтобы в 7 семестре обошлось без кровавой жатвы. Желаю удачи, чтобы непременно дожить до него... и встретимся на курсовой :)