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: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 18: | Line 22: | ||
* 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. | ||
- | * Exemplu: | + | * 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> | ||
+ | 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 55: | 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 72: | 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 79: | 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 87: | 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 112: | 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]]. |