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:proiect:etapa2 [2021/11/24 00:32]
stefan.stancu [Descrierea inputului]
lfa:proiect:etapa2 [2021/12/23 00:48] (current)
stefan.stancu [Etapa 2 - Transformarea Regex-urilor la AFD-uri]
Line 1: Line 1:
 ====== Etapa 2 - Transformarea Regex-urilor la AFD-uri ====== ====== Etapa 2 - Transformarea Regex-urilor la AFD-uri ======
 +
 +**Update legat de upload**: incarcati o arhiva ce contine **atat fisierele sursa, cat si directorul de testare tests/ si script-ul checker.py**.
 +
 +**Checker si teste**: [[lfa:​proiect:​checker|Checker proiect LFA]].
  
 Transformarea Regex-AFD ne permite operationalizarea expresiilor regulate, iar aceasta este o parte importanta atat dintr-un lexer cat si dintr-un parser. Transformarea Regex-AFD ne permite operationalizarea expresiilor regulate, iar aceasta este o parte importanta atat dintr-un lexer cat si dintr-un parser.
Line 19: Line 23:
   * Un test consta intr-un fisier ''​.in''​ ce contine o expresie regulata in forma prenex.   * Un test consta intr-un fisier ''​.in''​ ce contine o expresie regulata in forma prenex.
   * Exemple:   * Exemple:
-<​code> ​+<​code>​ 
 +UNION a b 
 +</​code>​ 
 +<​code>​
 UNION CONCAT a b STAR c UNION CONCAT a b STAR c
 +</​code>​
 +<​code>​
 +CONCAT UNION a b UNION c d
 </​code>​ </​code>​
 <​code>​ <​code>​
 CONCAT STAR UNION a b UNION b c CONCAT STAR UNION a b UNION b c
 +</​code>​
 +<​code>​
 +STAR UNION CONCAT a b CONCAT b STAR d
 +</​code>​
 +<​code>​
 +CONCAT PLUS c UNION a PLUS b 
 </​code>​ </​code>​
 ===== Cerinta si descrierea outputului ===== ===== Cerinta si descrierea outputului =====
  
-Implementarea voastra va primi un fisier de test ''<​testxy.in>'',​ va construi **AFD-ul asociat** expresiei regulate, apoi va verifica daca acesta accepta cuvintele din fisierul de test. Implementarea va scrie la output ​un fisier ''<​testxy.out>''​ ce va contine, pe cate o linie ''​ACCEPT''​ sau ''​REJECT'',​ pentru fiecare din cuvintele ​de la input. Exemplu de fisier de output pentru input-ul anterior: +Implementarea voastra va primi un fisier de input ''<​testxy.in>''​ si un fisier de output ''<​testxy.out>'',​ va construi **AFD-ul asociat** expresiei regulate, ​iar apoi va afisa automatul in fisierul de output ​conform formatului ​de mai jos:
 <​code>​ <​code>​
-REJECT +<​alfabet>​ 
-REJECT +<​numar_stari>​ 
-ACCEPT +<​stare_initiala>​ 
-ACCEPT +<​lista_stari_finale>​ 
-</​code>​+<​tranzitie_1>​ 
 +<​tranzitie_2>​ 
 +... 
 +<​tranzitie_n>​ 
 +</​code> ​
  
 **Atentie**:​ Implementarea va fi punctata doar in masura in care respecta cerinta (se construieste un AFD folosind algoritmii prezentati la curs). **Atentie**:​ Implementarea va fi punctata doar in masura in care respecta cerinta (se construieste un AFD folosind algoritmii prezentati la curs).
Line 58: Line 77:
 ===== Development si testare ===== ===== Development si testare =====
  
-Pentru a testa AFD-urile generate de voi, veti avea nevoie de o modalitate de afisare a acestora in text. Va sugeram sa adaugati la aceasta si o modalitate grafica. Atasam un script Python3 care poate fi folosit pentru a desena AFD-uri:+Pentru a testa AFD-urile generate de voi, veti avea nevoie de o modalitate de afisare a acestora in text. Va sugeram sa adaugati la aceasta si o modalitate grafica. Atasam un script Python3 ​({{:​lfa:​proiect:​draw_fa.zip|}}) ​care poate fi folosit pentru a desena AFD-uri:
   * script-ul primeste in linia de comanda un fisier CSV ce contine un AFD, si deseneaza AFD-ul respectiv.   * script-ul primeste in linia de comanda un fisier CSV ce contine un AFD, si deseneaza AFD-ul respectiv.
   * va fi necesar sa instalati anumite module pentru a rula scriptul (e.g. networkx, numpy).   * va fi necesar sa instalati anumite module pentru a rula scriptul (e.g. networkx, numpy).
Line 75: Line 94:
       * tranzitiile sunt codificate pe linii, sub forma: ''​stare initiala, caracter, stare finala''​       * tranzitiile sunt codificate pe linii, sub forma: ''​stare initiala, caracter, stare finala''​
       * pentru legibilitate,​ starile finale au fost precedate de simbolul ''​f''​       * pentru legibilitate,​ starile finale au fost precedate de simbolul ''​f''​
-  * [TODO: link catre script pe github-ul LFA] 
- 
  
  
Line 82: Line 99:
  
   * Folositi **clase** pentru reprezentarea interna a unei expresii regulate. Vom refolosi aceasta reprezentare in etapa 3.   * Folositi **clase** pentru reprezentarea interna a unei expresii regulate. Vom refolosi aceasta reprezentare in etapa 3.
-  * Alegeti o implementare pentru AFN-uri care sa permita **refolosirea** (extinderea) ei pentru situatii in care **starile** au alta structura(multimi de intregi in loc de intregi).+  * Alegeti o implementare pentru AFN-uri care sa permita **refolosirea** (extinderea) ei pentru situatii in care **starile** au alta structura (multimi de intregi in loc de intregi).
   * In procesul de parsare, instantiati cu ''​None''​ expresii a caror parsare este in curs de desfasurare. Ele vor fi modificate ulterior.   * In procesul de parsare, instantiati cu ''​None''​ expresii a caror parsare este in curs de desfasurare. Ele vor fi modificate ulterior.
  
Line 90: Line 107:
     * adaugati constructori pentru expresii a caror parsare este in curs de desfasurare. Acestia vor fi folositi doar in timpul parsarii formei prenex. Spre exemplu, pe langa ''​Concat :: Expr -> Expr -> Expr'',​ definiti ''​LConcat :: Expr -> Expr''​. Acesta va codifica faptul ca am citit doar partea din **stanga** a unei concatenari. Asemanator, ''​LRConcat :: Expr''​ va codifica faptul ca am citit o concatenare si urmeaza sa citim operanzii acesteia.     * adaugati constructori pentru expresii a caror parsare este in curs de desfasurare. Acestia vor fi folositi doar in timpul parsarii formei prenex. Spre exemplu, pe langa ''​Concat :: Expr -> Expr -> Expr'',​ definiti ''​LConcat :: Expr -> Expr''​. Acesta va codifica faptul ca am citit doar partea din **stanga** a unei concatenari. Asemanator, ''​LRConcat :: Expr''​ va codifica faptul ca am citit o concatenare si urmeaza sa citim operanzii acesteia.
     * adaugati un constructor pentru expresia regulata ''​Unknown''​ care codifica o expresie ce urmeaza sa fie calculata     * adaugati un constructor pentru expresia regulata ''​Unknown''​ care codifica o expresie ce urmeaza sa fie calculata
-----+-----------------------------------------------------------
  
   * Interactiunea cu stiva se face cel mai natural folosind **pattern matching** (si este mult mai simplu de implementat in Haskell). ​   * Interactiunea cu stiva se face cel mai natural folosind **pattern matching** (si este mult mai simplu de implementat in Haskell). ​
Line 115: Line 132:
  
  
-===== Metodologia de testare: ===== 
-  * construim un fisier mare cu expresii regulate **de mana**, peste diverse alfabete, care sa acopere cat mai multe din toate situatiile posibile, impreuna cu cuvinte acceptate sau nu. Acest fisier va trebui discutat eventual cu fiecare dintre noi. Exemplu: 
-  <​code>​ 
-  0 
-  ACCEPT 0 
-  REJECT 01 
-  REJECT 10 
-  ​ 
-  00* 
-  ACCEPT 0000000000 
-  REJECT 1 
-  REJECT ε 
-  </​code>​ 
-  * parsam expresiile cu implementarea noastra, generam forma prenex, si creem **mai multe perechi de fisiere separate, input-output** - in fiecare fisier input se va gasi o expresie si cuvintele de test. Ficare fisier de output va marca rezultatul asteptat. Exemplu: 
-   * Test0.in 
- <​code>​ 
-  0 
-  0 
-  01 
-  10 
- </​code>​ 
-   * Test0.out 
- <​code>​ 
- ​ACCEPT ​ 
- ​REJECT 
- ​REJECT 
- </​code>​ 
-   * Test1.in 
-  <​code>​ 
-  CONCAT 0 STAR 0 
-  0000000000 
-  1 
-  ε 
-  </​code>​ 
-   * Test1.out 
-  ​ 
-  <​code>​ 
-  ACCEPT 
-  REJECT 
-  REJECT 
-  </​code>​ 
- 
-  * Vom verifica, fiecare, ca outputul este corect, folosind implementarile noastre. 
- 
-===== Metodologia de testare: ===== 
- 
-Folosim acelasi fisier de input, insa generam, in locul expresiilor PRENEX, nfa-uri, din lista de referinta. 
- 
- 
- 
-Obiectivul etapei 2 este conversia unei expresii regulate la un Automat Finit Nedeterminist. Aceasta transformare este un prim pas in conversia unei **specificatii** (expresia regulata) intr-o **implementare** (AFN). 
  
 +===== Metodologia de testare =====
 +Odata generate AFD-urile de catre implementarea voastra si afisate in cadrul fisierlor de output, checker-ul etapei 2 compara rezultatele fata de o suita de AFD-uri de referinta, verificand pentru fiecare caz in parte **daca automatele accepta acelasi limbaj**. Mai multe detalii legate de checker gasiti pe pagina [[lfa:​proiect:​checker|Checker proiect LFA]].