Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lfa:2023:proiect_e2 [2023/11/03 16:29]
mihai.calitescu adaugat enunt
lfa:2023:proiect_e2 [2023/11/08 14:23] (current)
tpruteanu
Line 1: Line 1:
-Deadline etapa 1: 20 nov 2023 23:59+Deadline etapa 1: 22 nov 2023 23:59 
 + 
 +Deadline etapa 2: 6 dec 2023 23:59
  
 Schelet etapa 1 {{:​lfa:​2023:​lfa_2023-skel-1.zip|}} Schelet etapa 1 {{:​lfa:​2023:​lfa_2023-skel-1.zip|}}
 +
 +Schelet etapa 2 {{:​lfa:​2023:​lfa_2023-skel-2.zip|}}
 ====== Proiect ====== ====== Proiect ======
  
Line 37: Line 41:
 In scheletul temei veti gasi 2 clase: **NFA** si **DFA**. In fiecare veti avea de implementate metodele necesare pentru verificarea comportamentului lor si pentru a realiza conversia ceruta de tema. In scheletul temei veti gasi 2 clase: **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===+=== Clasa DFA ===
  
 Un DFA va fi descris de urmatoarele campuri: Un DFA va fi descris de urmatoarele campuri:
Line 91: Line 95:
 ===== Etapa 2 ===== ===== Etapa 2 =====
  
-**Etapa 2** a proiectului consta in conversia Regex - NFA (folosind Algoritmul Thompson prezentat la +**Etapa 2** a proiectului consta in conversia Regex - NFA (folosind Algoritmul Thompson prezentat la curs)
-urs)+
  
 ====Structura scheletului==== ====Structura scheletului====
Line 98: Line 101:
 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''​. 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''​.
  
-===Clasa Regex===+=== Forma standard a expresiilor regulate ​===
  
-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 putea avea unul din urmatoarele caractere:+Forma standard a regex-urilor poate fi descrisa in forma [[https://​en.wikipedia.org/​wiki/​Backus%E2%80%93Naur_form | BNF]] astfel:
 <​code>​ <​code>​
-character - un caracter din alfabet +<​regex>​ ::= <​regex><​regex>​ |  
-* - kleene star +            <​regex>​ '​|'​ <​regex> ​|  
-- union +            <​regex>​'*' | <​regex>​'​+' ​| <​regex>​'?' ​|  
-(,) - paranteze +            ​'(' ​<​regex> ​')' |  
-+ - unul sau mai multe (''​a+'' ​este echivalentul la ''​aa*''​) +            "​[A-Z]" | 
-unul sau niciunul (''​a?''​ face match fie pe sirul gol, fie pe caracterul ''​a''​)+            "[a-z]" | 
 +            "​[0-9]"​ | 
 +            "​eps"​ | <​character> ​
 </​code>​ </​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 trei 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
 +
 +===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: 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:
Line 118: Line 144:
  
 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''​. 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''​.
-tie). 
  
 ===== Testare ===== ===== Testare =====
Line 129: Line 154:
  
 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]] 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''​. Pentru rularea testelor folositi comanda ''​python3.12 -m unittest''​.
Line 142: Line 174:
     ├── __init__.py     ├── __init__.py
     ├── NFA.py     ├── NFA.py
 +    ├── Regex.py
     ... (alte surse pe care le folositi)     ... (alte surse pe care le folositi)
 </​code>​ </​code>​