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: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 ====