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:38] stefan.stancu [Sugestii de implementare pentru Python] |
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 24: | Line 28: | ||
| <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> | ||
| Line 29: | Line 36: | ||
| </code> | </code> | ||
| <code> | <code> | ||
| - | STAR UNION CONCAT a b c CONCAT b STAR d | + | 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 ===== | ||
| Line 67: | 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 84: | 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 99: | 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 124: | 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]]. | ||