Deadline etapa 1: 21 nov 2024 23:55
Schelet etapa 1 skel_lfa_2025_1.zip
Proiect
Etapa 1
Etapa 1 a proiectului consta in conversia REGEX → NFA → DFA → minDFA (folosind algoritmii prezentati la curs)/ Tema va fi implementata in Python, iar scheletul va ofera un pattern pentru implementarea functionalitatilor necesare.
Forma standard a expresiilor regulate
Forma standard a regex-urilor poate fi descrisa in forma BNF astfel:
<regex> ::= <regex><regex> |
<regex> '|' <regex> |
<regex>'*' | <regex>'+' | <regex>'?' |
'(' <regex> ')' |
"[A-Z]" |
"[a-z]" |
"[0-9]" |
"eps" | <character>
In descrierea de mai sus, elementele dintre parantezele angulare <> sunt non-terminali care trebuie generati, caracterele sunt intotdeauna plasate intre ghilimele simple, iar sirurile de caractere - intre ghilimele duble.
<character> se refera la orice caracter care nu face parte din caracterele de control (precum * sau |), sau la orice sir de lungime doi de forma \c, unde c poate fi orice caracter inclusiv de control (mai exact - caracter escapat).
“eps” reprezinta caracterul $ \epsilon$ .
Preprocesarea Regex-urilor
In descrierea de mai sus, pe langa caracterele alfa-numerice si operatiile de baza star, concat si union, veti gasi si:
- doua operatii noi:
- plus
+- expresia asupra careia este aplicat apare de 1 data sau mai multe ori. - semnul intrebarii
?- expresia asupra careia este aplicat apare o data sau niciodata.
- 3 syntactic sugars:
[a-z]- orice caracter litera mica din alfabetul englez[A-Z]- orice caracter litera mare din alfabetul englez[0-9]- orice cifra
Structura scheletului
In scheletul temei veti gasi 3 clase: Regex, NFA si DFA. In fiecare veti avea de implementate metodele necesare pentru verificarea comportamentului lor si pentru a realiza conversia ceruta de tema.
Clasa DFA
Un DFA va fi descris de urmatoarele campuri:
S - alfabetul limbajului, reprezentat ca un set de string-uri K - starile automatului, reprezentat ca un set de __STATE__ q0 - starea initiala a automatului d - functia de tranzitie, reprezentata ca un dictionar cu cheie (stare, caracter_alfabet) si alta stare ca si valoare F - starile finale ale automatului
Desi cea mai simpla modalitate de a ne referi la o stare este printr-un numar intreg, in anumite componente ale proiectului (si de la aceasta etapa, dar si de la etape viitoare) va fi mult mai convenabil sa lucram cu alte tipuri de etichete pentru stari (de exemplu, seturi de intregi sau tupluri). De aceea, parametrul STATE va permite sa utilizati ce tip doriti ca si stare a automatului, puteti nota starile automatului atat cu intregi 0,1,2,3,… cat si cu siruri de caractere s0,q1,sink,… sau alte tipuri de date (frozenset)
- In aceasta clasa veti avea de implementat obligatoriu functia
accept, functie care primeste un cuvant si ruland DFA-ul pe acel cuvant va intoarceTruedaca cuvantul este acceptat, iarFalsein caz contrar. - De asemenea, veti avea de implementat metoda
minimize, ce va returna DFA-ul minim. - Functia
remap_statesnu este obligatoriu de implementat, din moment ce nu este apelata de checker, insa este recomandata din moment ce va va usura implementarea algoritmului subset construction. Ea are ca scop transformarea setului de stari, de la un tip (spre exemplu string) la un altul (spre exemplu, integer).
Spre exemplu, daca am avea automatul de mai jos:
Am putea aplica functia x → 'q' + str(x+2), care ar creea un DFA cu urmatoarele stari:
Clasa NFA
Clasa functioneaza in aceeasi maniera cu cea a DFA-ului, cu o singura diferenta:
- Spre deosebire de reprezentarea de la curs, unde $ \Delta$ reprezenta o relatie peste $ K \times \Sigma \times K$ , in Etapa 1,
dva fi tot o functie, (codificata printr-un dictionar), care va asocia unei perechi (stare, caracter_alfabet), un set de stari succesor (in loc de o stare unica, asa cum se intampla intr-un DFA).
Alte observatii:
- Functia
epsilon_closureprimeste o stare a automatului si intoarce un set de stari, care reprezinta starile la care se poate ajunge doar prin epsilon-tranzitii de la starea initiala (fara a consuma nici-un caracter) - Functia
subset_constructionva intoarce un DFA, construit din NFA-ul curent prin algoritmul subset construction. DFA-ul intors va avea ca tip al starilorfrozenset[STATE](starile0si1dintr-un NFA vor ajunge o multime de stari{0,1}dintr-un DFA). Folosimfrozensetin loc deset, pentru ca acesta din urma nu este imutabil (seturile pot fi modificate prin efecte laterale). Avem nevoie de un obiect imutabil pentru a putea calcula un hash (mereu acelasi), si implicit pentru a putea folosi astfel de obiecte drept chei intr-un dictionar (lucru imposibil daca obiectul-cheie este mutabil). - Functia
remap_statescare are acelasi format si scop ca functia de la DFA-uri
Functiile epsilon_closure si subset_construction sunt obligatoriu de implementat, iar functia remap_states nu este.
Clasa Regex
In aceasta clasa veti avea de implementat metoda thompson, metoda care primeste un obiect de tip regex si intoarce un NFA (cu starile de tipul int ca si conventie). Regexul primit ca input va avea forma prezentata mai sus.
Concatenarea nu va fi reprezentata printr-un caracter anume, vom considera ca constructiile de forma ab se traduc automat in “caracterul a concatenat cu caracterul b”. Concatenarea oprindu-se astfel la intalnirea unei paranteze sau a unei reuniuni. Spre exemplu:
ab|cse traduce in(ab)|cabd*se traduce inab(d)*ab+se traduce ina(b)+
Hint de implementare
Pentru a va usura lucrul cu expresiile regulate, puteti creea mai multe clase care extind clasa regex (ex Character, Star, Union, Concat, etc…) iar fiecare clasa va avea propria implementare a metodei thompson.
Testare
Verificarea corectitudinii implementarii voastre se va face automat, printr-o serie de teste unitare, teste care vor verifica comportamentul fiecarei functii obligatorii de implementat si ii va testa output-ul pe o diversitate de input-uri.
Un alt check preliminar care se va face pe fiecare DFA construit va fi unul care verifica integritatea lui d.p.d.v. structural (starea initiala si starile finale sunt incluse in multima de stari, nu are tranzitii definite pe un caracter dintr-o anume stare).
Python
Versiunea de python pe care o vom folosi pentru aceasta tema este python3.12. Un ghid de instalare a acestei versiuni poate fi gasita aici
Pentru rularea testelor folositi comanda python3.12 -m unittest.
Aceasta comanda va detecta automat testele definite in folder-ul test si le va rula pe rand, afisand la final testele care au esuat, daca exista.
Structura arhivei
Veti incarca in assignment-ul de pe moodle o arhiva zip care va avea la baza folderul src din schelet si fisierul ID.txt ce contine user@stud.acs.pub.ro pe prima linie
.
└── src
├── __init__.py
├── DFA.py
├── NFA.py
├── Regex.py
... (alte surse pe care le folositi)
├── ID.txt

