Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
lfa:2024:proiect:etapa2 [2024/11/21 22:33]
atoader created
lfa:2024:proiect:etapa2 [2024/11/24 19:02] (current)
atoader
Line 1: Line 1:
-{{:​lfa:​2024:​proiect:​src.zip|}}Deadline etapa 1: 22 nov 2023 23:59+Deadline etapa 1: 21 nov 2024 23:55
  
-Deadline etapa 2: dec 2023 23:59+Deadline etapa 2: dec 2024 23:55
  
 Schelet etapa 1 {{:​lfa:​2023:​lfa2024-skel-etapa1.zip|}} Schelet etapa 1 {{:​lfa:​2023:​lfa2024-skel-etapa1.zip|}}
  
 Schelet etapa 2 {{:​lfa:​2024:​proiect:​src.zip|}} Schelet etapa 2 {{:​lfa:​2024:​proiect:​src.zip|}}
 +
 +
 +===== Etapa 2 =====
 +
 +**Etapa 2** a proiectului consta in parsarea unei expresii regulate precum si in conversia Regex - NFA (folosind Algoritmul Thompson prezentat la curs)
 +
 +====Structura scheletului====
 +
 +In scheletul temei veti gasi pe langa cele 2 clase de la etapele anterioare (**NFA** si **DFA**) inca o clasa, **Regex**, si o metoda ''​parse_regex''​.
 +
 +=== Forma standard a expresiilor regulate ===
 +
 +Forma standard a regex-urilor poate fi descrisa in forma [[https://​en.wikipedia.org/​wiki/​Backus%E2%80%93Naur_form | BNF]] astfel:
 +<​code>​
 +<​regex>​ ::= <​regex><​regex>​ | 
 +            <​regex>​ '​|'​ <​regex>​ | 
 +            <​regex>'​*'​ | <​regex>'​+'​ | <​regex>'?'​ | 
 +            '​('​ <​regex>​ '​)'​ | 
 +            "​[A-Z]"​ |
 +            "​[a-z]"​ |
 +            "​[0-9]"​ |
 +            "​eps"​ | <​character> ​
 +</​code>​
 +
 +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 $math[\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
 +
 +<note important>​
 +Daca un regex contine spatii albe, acestea sunt ignorate. Pentru a nu fi ignorate, acestea vor fi precedate de un backslash "\ ".
 +Similar, pentru a nu incurca caracterele '​*',​ '​+',​ '​)',​ '​(',​ '​|',​ '?'​ care reprezinta si operatori din regex-uri, cand fac propriu zis parte din regex, ​ vor fi precedate de backslash.
 +</​note>​
 +
 +===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|c''​ se traduce in ''​(ab)|c''​
 +  - ''​abd*''​ se traduce in ''​ab(d)*''​
 +  - ''​ab+''​ se traduce in ''​a(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 [[https://​aruljohn.com/​blog/​install-python/​|aici]]
 +
 +<note important>​
 +Este recomandat sa parcurgeti [[lfa:​2023:​lab_python_extras|documentul extra]] pentru descrierea unor feature-uri folosite in schelet si a unora utile in implementarea proiectului,​ mai ales topic-urile:​
 +  * [[lfa:​2023:​lab_python_extras#​dictionaries_sets_and_hashable_objects | hashing]]
 +  * [[lfa:​2023:​lab_python_extras#​python_312_generics | genericitate in python 3.12]]
 +  * [[lfa:​2023:​lab_python_extras#​dataclasses | decoratorul dataclass]]
 +</​note>​
 +
 +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
 +<​code>​
 +.
 +└── src
 +    ├── __init__.py
 +    ├── DFA.py
 +    ├── NFA.py
 +    ├── Regex.py
 +    ... (alte surse pe care le folositi)
 +├── ID.txt
 +</​code>​
  
 ====== Proiect ====== ====== Proiect ======
Line 94: Line 188:
 Functiile ''​epsilon_closure''​ si ''​subset_construction''​ **sunt obligatoriu** de implementat,​ iar functia ''​remap_states''​ **nu** este. Functiile ''​epsilon_closure''​ si ''​subset_construction''​ **sunt obligatoriu** de implementat,​ iar functia ''​remap_states''​ **nu** este.
  
-===== Etapa 2 ===== 
- 
-**Etapa 2** a proiectului consta in conversia Regex - NFA (folosind Algoritmul Thompson prezentat la curs) 
- 
-====Structura scheletului==== 
- 
-In scheletul temei veti gasi pe langa cele 2 clase de la etapele anterioare (**NFA** si **DFA**) inca o clasa, **Regex**, si o metoda ''​parse_regex''​. 
- 
-=== Forma standard a expresiilor regulate === 
- 
-Forma standard a regex-urilor poate fi descrisa in forma [[https://​en.wikipedia.org/​wiki/​Backus%E2%80%93Naur_form | BNF]] astfel: 
-<​code>​ 
-<​regex>​ ::= <​regex><​regex>​ |  
-            <​regex>​ '​|'​ <​regex>​ |  
-            <​regex>'​*'​ | <​regex>'​+'​ | <​regex>'?'​ |  
-            '​('​ <​regex>​ '​)'​ |  
-            "​[A-Z]"​ | 
-            "​[a-z]"​ | 
-            "​[0-9]"​ | 
-            "​eps"​ | <​character> ​ 
-</​code>​ 
- 
-In descrierea de mai sus, elementele dintre parantezele angulare <> sunt **non-terminali** care trebuie generati, caracterele sunt intotdeauna plasate intre ghilimele simple, iar sirurile intre ghilimele duble. 
- 
-''<​character>''​ se refera la orice caracter obisnuit care nu face parte din caractele de //control// (precum ''​*''​ sau ''​|''​),​ sau la orice sir de lungime doi de forma ''​\c'',​ unde ''​c''​ poate fi orice caracter inclusiv de control. 
- 
-"​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 
- 
-<note important>​ 
-Daca un regex contine spatii albe, acestea sunt ignorate. Pentru a nu fi ignorate, acestea vor fi precedate de un backslash "\ ". 
-Similar, pentru a nu incurca caracterele '​*',​ '​+',​ '​)',​ '​(',​ '​|',​ '?'​ care reprezinta si operatori din regex-uri, cand fac propriu zis parte din regex, ​ vor fi precedate de backslash. 
-</​note>​ 
- 
-===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 uniuni**. Spre exemplu: 
-  - ''​ab|c''​ se traduce in ''​(ab)|c''​ 
-  - ''​abd*''​ se traduce in ''​ab(d)*''​ 
-  - ''​ab+''​ se traduce in ''​a(b)+''​ 
- 
-=== Hint de implementare === 
- 
-Pentru a va usura lucrul cu expresiile regulate, va puteti creea mai multe clase care extind din 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 [[https://​aruljohn.com/​blog/​install-python/​|aici]] 
- 
-<note important>​ 
-Este recomandat sa parcurgeti [[lfa:​2023:​lab_python_extras|documentul extra]] pentru descrierea unor feature-uri folosite in schelet si a unora utile in implementarea proiectului,​ mai ales topic-urile:​ 
-  * [[lfa:​2023:​lab_python_extras#​dictionaries_sets_and_hashable_objects | hashing]] 
-  * [[lfa:​2023:​lab_python_extras#​python_312_generics | genericitate in python 3.12]] 
-  * [[lfa:​2023:​lab_python_extras#​dataclasses | decoratorul dataclass]] 
-</​note>​ 
- 
-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 
-<​code>​ 
-. 
-└── src 
-    ├── DFA.py 
-    ├── __init__.py 
-    ├── NFA.py 
-    ├── Regex.py 
-    ... (alte surse pe care le folositi) 
-</​code>​