Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
lfa:proiect:etapa3 [2021/12/14 18:00] stefan.stancu [Input] |
lfa:proiect:etapa3 [2021/12/29 02:02] (current) stefan.stancu [Input] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Etapa 3 - Lexer complet si Limbajul Imperative ====== | ====== Etapa 3 - Lexer complet si Limbajul Imperative ====== | ||
+ | |||
+ | **Checker si teste**: [[lfa:proiect:checker|Checker proiect LFA]]. | ||
Etapa 3 consta la randul ei in trei parti, dintre care ultima este bonus. | Etapa 3 consta la randul ei in trei parti, dintre care ultima este bonus. | ||
- | ==== Punctaj (pls revise) ==== | + | ==== Punctaj ==== |
* Punctajul pentru 3.1. este de **0.7p** (din totalul de 1p al etapei) | * Punctajul pentru 3.1. este de **0.7p** (din totalul de 1p al etapei) | ||
* Punctajul pentru 3.2. este de **0.3p** (din totalul de 1p al etapei) | * Punctajul pentru 3.2. este de **0.3p** (din totalul de 1p al etapei) | ||
Line 18: | Line 20: | ||
Daca nu ati citit pana acum cerinta de la [[lfa:proiect:etapa1 | Etapa 1]], este bine sa o faceti pentru a intelege mai bine Etapa 3. | Daca nu ati citit pana acum cerinta de la [[lfa:proiect:etapa1 | Etapa 1]], este bine sa o faceti pentru a intelege mai bine Etapa 3. | ||
- | ==== Structura fisierului cu tokens (Ioana, Stefan, pls revise) ==== | + | ==== Structura fisierului cu tokens ==== |
Fisierul va contine un **token** si expresia lui regulata, cate una pe fiecare linie, sub urmatoarea forma: | Fisierul va contine un **token** si expresia lui regulata, cate una pe fiecare linie, sub urmatoarea forma: | ||
Line 39: | Line 41: | ||
[a-z]+ | # alias pt expresia a | b | c ... | z, avand numai caractere alfabetice lowercase | [a-z]+ | # alias pt expresia a | b | c ... | z, avand numai caractere alfabetice lowercase | ||
[0-9]+ | # alias pt expresia 0 | 1 | 2 | ... | 9 | [0-9]+ | # alias pt expresia 0 | 1 | 2 | ... | 9 | ||
- | <c> | # orice caracter alfabetic | + | <c> | # orice caracter alfanumeric |
'<any_c>' # orice caracter ASCII, nu doar unul alfabetic | '<any_c>' # orice caracter ASCII, nu doar unul alfabetic | ||
</code> | </code> | ||
Line 69: | Line 71: | ||
unde fiecare pereche ''<token,lexem>'' se afla pe cate o linie separata, iar intre fiecare ''token'' si ''lexem'' se afla cate un singur spatiu alb (**neincluzand spatiile albe ce se pot afla in compozitia lexemului**). | unde fiecare pereche ''<token,lexem>'' se afla pe cate o linie separata, iar intre fiecare ''token'' si ''lexem'' se afla cate un singur spatiu alb (**neincluzand spatiile albe ce se pot afla in compozitia lexemului**). | ||
- | Testarea va fi efectuata intr-o maniera identica ca cea din cadrul [[lfa:proiect:etapa1|Etapei 1]], prin compararea output-ului generat de voi cu cel aflat in fisierele de referinta. Mai multe detalii legate de script-ul de testare si cum sa il rulati veti gasi in curand pe pagina dedicata [[lfa:proiect:checker|Checker-ului]]. | + | Testarea va fi efectuata intr-o maniera identica ca cea din cadrul [[lfa:proiect:etapa1|Etapei 1]], prin compararea output-ului generat de voi cu cel aflat in fisierele de referinta. Mai multe detalii legate de script-ul de testare si cum sa il rulati gasiti pe pagina dedicata [[lfa:proiect:checker|Checker-ului]]. |
==== Sugestii de implementare pt Lexer complet ==== | ==== Sugestii de implementare pt Lexer complet ==== | ||
Line 80: | Line 82: | ||
Folosind lexer-ul scris de voi, implementati un parser simplu pentru limbajul **Imperative** descris mai jos. | Folosind lexer-ul scris de voi, implementati un parser simplu pentru limbajul **Imperative** descris mai jos. | ||
Folositi aceeasi abordare ca in implementarea parserului pentru expresii regulate. | Folositi aceeasi abordare ca in implementarea parserului pentru expresii regulate. | ||
+ | } | ||
==== Input ==== | ==== Input ==== | ||
Input-ul va fi un program a carui descriere sintactica se regaseste mai jos (**//Limbajul Imperative//**): | Input-ul va fi un program a carui descriere sintactica se regaseste mai jos (**//Limbajul Imperative//**): | ||
<code> | <code> | ||
- | <prog> ::= <variable> '=' <expr>; | | + | <prog> ::= <variable> '=' <expr> |
- | begin <instruction_list> end | | + | | begin <instruction_list> end |
- | while (<expr>) do <prog> od | | + | | while (<expr>) do <prog> od |
- | if (<expr>) then <prog> else <prog> fi | + | | if (<expr>) then <prog> else <prog> fi |
- | <instruction_list> ::= <prog> | <prog> ; <instruction_list> | + | <instruction_list> ::= <prog> | <prog> '\n' <instruction_list> |
- | <expr> ::= <expr> '+' <expr> | <expr> '>' <expr> | <expr> '==' <expr> | <variable> | <integer> | + | <expr> ::= <expr> '+' <expr> | <expr> '-' <expr> | <expr> '*' <expr> | <expr> '>' <expr> | <expr> '==' <expr> | <variable> | <integer> |
</code> | </code> | ||
* Urmariti structura fisierelor de test pentru a intelege mai bine gramatica precum si semnificatia **variabilelor** si a **intregilor**. | * Urmariti structura fisierelor de test pentru a intelege mai bine gramatica precum si semnificatia **variabilelor** si a **intregilor**. | ||
- | * Acordati atentie modului in care sunt folosite '';'' in sintaxa limbajului. | + | * Acordati atentie modului in care sunt folosite ''\n'' in sintaxa limbajului (atunci cand delimiteaza intre instructiuni si atunci cand doar formateaza). |
Pentru implementare, trebuie sa: | Pentru implementare, trebuie sa: | ||
* scrieti o specificatie pentru analiza lexicala a programelor; | * scrieti o specificatie pentru analiza lexicala a programelor; | ||
- | * folosind prima parte a etapei 3, implementati un parser pentru programe **Imperative**. Scopul vostru este sa realizati o parsare corecta si o afisare a acesteia. Pentru aceasta din urma, puteti folosi urmatorul schelet de clase, care vor reprezenta AST (Abstract Syntax Tree-ul) pentru programe **Imperative** si care au deja implementata pentru voi procedura de afisare: | + | * folosind prima parte a etapei 3, implementati un parser pentru programe **Imperative**. Scopul vostru este sa realizati o parsare corecta si o afisare a acesteia. Pentru aceasta din urma, puteti folosi urmatorul schelet de clase, care vor reprezenta AST (Abstract Syntax Tree-ul) pentru programe **Imperative** si care au deja implementata pentru voi procedura de afisare: {{:lfa:proiect:ast.zip|ast.zip}} |
- | <code> | + | ==== Output ==== |
- | TODO: Schelet, prezentat ca link-uri catre fisiere. | + | |
- | </code> | + | |
+ | Output-ul va fi redat sub forma unui fisier ce contine AST-ul rezultat in urma parsarii programului. Un exemplu de instantiere si afisare se gaseste in comentariile din scheletul de clase ''ast.py'' (atentie: **subblocurile sunt identate cu cate doua spatii** fata de blocurile parinte). | ||
===== 3.3. Interpretor pentru limbajul Imperative ===== | ===== 3.3. Interpretor pentru limbajul Imperative ===== | ||
Line 119: | Line 120: | ||
* Output-ul unui interpretor va fi continutul store-ului final, mai exact, maparea ce contine toate variabilele folosite in program alaturi de valorile lor. | * Output-ul unui interpretor va fi continutul store-ului final, mai exact, maparea ce contine toate variabilele folosite in program alaturi de valorile lor. | ||
+ | Mai jos aveti un exemplu de actualizare a unui **store** in timpul interpretarii unui program scurt (**store-ul** este reprezentat in comentarii drept un **dictionar** ce retine maparile dintre o variabila si valorea sa curenta): | ||
+ | <code> | ||
+ | begin // {} - store vid | ||
+ | a = 1; // {a : 1} - s-a adaugat o mapare in store | ||
+ | r = 0; // {a : 1, r : 0} | ||
+ | if (a == 2) then // {a : 1, r : 0} - expresiile booleene nu modifica store-ul | ||
+ | r = a + 3; // nu se ajunge aici | ||
+ | else | ||
+ | r = a; // {a : 1, r : 1} - valoarea lui r a fost actualizata | ||
+ | fi | ||
+ | end | ||
+ | </code> | ||
==== Sugestii de implementare pentru limbajul Python ==== | ==== Sugestii de implementare pentru limbajul Python ==== | ||