Differences
This shows you the differences between two versions of the page.
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 c | + | **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> |