Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
lfa:proiect:etapa2 [2021/11/24 00:33] 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> | ||
| + | UNION a b | ||
| + | </code> | ||
| <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]]. | ||