OnionGrief / Chipollino

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

Rewriting automata #318

Open Robby-the-paladin opened 7 months ago

Robby-the-paladin commented 7 months ago

Написать модуль для загрузки автоматов в интерактивный конвертер:

Robby-the-paladin commented 7 months ago

Пример автомата для FA:

FA {
    ab label = baobab terminal initial_state;
    aba terminal
    ...
    aba bab v;
    bab ab o;
    ab aba c
}

Пример автомата для MFA:

MFA {
    ab label = baobab terminal initial_state;
    aba terminal
    ...
    aba bab v 12 o;
    bab ab eps 12 c;
    ab aba &12
}
Robby-the-paladin commented 7 months ago

Грамматика:

  1. production -> "MFA" MFA | "FA" FA
  2. MFA -> "{" states MFA_edges "}"
  3. FA -> "{" states FA_edges "}"
  4. states -> state_description "..." | states state_description "..."
  5. state_description -> node_id variants
  6. variants -> "label" "=" node_id | "terminal" | "initial_state"
  7. MFA_edges -> MFA_edge MFA_edges | ε
  8. FA_edges -> FA_edge FA_edges | ε
  9. MFA_edge -> stmt memory_lists
  10. FA_edge -> stmt
  11. stmt -> node_id node_id transition
  12. memory_lists -> memory_cell memory_lists | ε
  13. memory_cell -> cell_id memory_state
  14. memory_state -> "o" | "c"
  15. node_id -> (любая строка)
  16. cell_id -> (любое число)
  17. transition -> "eps" | (любая буква или цифра) | "&" cell_id
TonitaN commented 7 months ago

Так, а где интеграция в генератор случайных объектов? Причём на базе вашего же языка теперь уж надо. И метод Verify должен уметь обращаться к генератору по типу, причём к каждому типу автомата привязана инстанциация грамматики, по которой и делается генерация. Хардкодить грамматику ещё и в генераторе нельзя.

Robby-the-paladin commented 6 months ago

https://github.com/OnionGrief/Chipollino/issues/318#issuecomment-1920621658 Отдельный от парсера генератор уже залит в main. В последнем коммите(https://github.com/OnionGrief/Chipollino/commit/4d699605ccde3c1c9a2d8dfb1a7cfa70f388319b) сделал встроенный в лексер, но я не уверен, что это архитектурно правильно. Генерировать напрямую из правил lexy не получится, так что в последнем коммите я просто добавил методы generate для структур грамматики.

TonitaN commented 6 months ago

Мне вот вообще не видно по коду, что генератор генерирует только корректные MFA (т.е. те, у которых нет записи внутри той же ячейки или чтения внутри записи в ячейку). И такие условия негоже хардкодить, а нужно привязывать к типу и вызывать по нему для каждого из классов автоматов как метод для графа (выбирающий, можно ли построить выбранный вами переход, или ограничивающий возможные метки на переходах некоторым собственным пулом значений для выбора). И так для DFA проверять детерминизм, а для MFA как минимум корректность обработки памяти.

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