Differences

This shows you the differences between two versions of the page.

Link to this comparison view

cpl:labs:03 [2016/10/04 14:00]
bogdan.nitulescu [Analizorul sintactic]
cpl:labs:03 [2016/10/05 23:17] (current)
bogdan.nitulescu [Introducere in LCPL]
Line 1: Line 1:
 ====== 03. Bison Advanced ====== ====== 03. Bison Advanced ======
-In acest laborator vom aprofunda cunoștințele de bison și vom incepe să discutăm despre prima temă.+În acest laborator vom aprofunda cunoștințele de bison și vom incepe să discutăm despre prima temă.
  
 ====== Bison ====== ====== Bison ======
Line 11: Line 11:
 ''​yylex()''​ citește caracterele dintr-un file pointer (FILE*) numit yyin. Dacă nu setați yyin, acesta va pointa către intrarea standard (stdin). Rezultatul este transmis către yyout, care, implicit, pointează către ieșirea standard (stdout). ​ ''​yylex()''​ citește caracterele dintr-un file pointer (FILE*) numit yyin. Dacă nu setați yyin, acesta va pointa către intrarea standard (stdin). Rezultatul este transmis către yyout, care, implicit, pointează către ieșirea standard (stdout). ​
  
-Fiecare apel către ''​yylex()''​ returnează un întreg, care reprezintă tipul token-ului (id unic). Astfel, bison-ul știe ce token a primit. Token-ul poate avea o valoare, care trebuie ​sa fie pusă în variabila ''​yylval''​.+Fiecare apel către ''​yylex()''​ returnează un întreg, care reprezintă tipul token-ului (id unic). Astfel, bison-ul știe ce token a primit. Token-ul poate avea o valoare, care trebuie ​să fie pusă în variabila ''​yylval''​.
  
 Implicit, yylval este de tip ''​int'',​ tip care, însă, se poate schimba redefinind YYSTYPE în fișierul bison. Implicit, yylval este de tip ''​int'',​ tip care, însă, se poate schimba redefinind YYSTYPE în fișierul bison.
Line 77: Line 77:
 După ce s-a recunoscut ''​ LET '​('​ var '​)'​ '',​ este executată prima acțiune. Se salvează o copie a contextului curent (lista variabilelor disponibile). Apoi, se apelează ''​declare_variable''​ care adaugă ''​var''​ la lista curentă. În acest moment s-a terminat execuția acțiunii din mijlocul regulii, și se va parsa ''​stmt''​. Această acțiune este componenta numărul 5 a regulii, iar ''​stmt''​ este componenta numărul 6. Dupa ce s-a parsat și ''​stmt''​ se execută acțiunea de la sfârșitul regulii, care scoate variabila din tabela de simboli. ​ După ce s-a recunoscut ''​ LET '​('​ var '​)'​ '',​ este executată prima acțiune. Se salvează o copie a contextului curent (lista variabilelor disponibile). Apoi, se apelează ''​declare_variable''​ care adaugă ''​var''​ la lista curentă. În acest moment s-a terminat execuția acțiunii din mijlocul regulii, și se va parsa ''​stmt''​. Această acțiune este componenta numărul 5 a regulii, iar ''​stmt''​ este componenta numărul 6. Dupa ce s-a parsat și ''​stmt''​ se execută acțiunea de la sfârșitul regulii, care scoate variabila din tabela de simboli. ​
  
-====== Introducere ​in CMake ======+====== Introducere ​în CMake ======
  
 CMake este un meta-sistem de build independent de platformă. Acesta citeste niște fișiere de configurare (''​CMakeLists.txt''​) care descriu procesul de build într-un [[https://​cmake.org/​Wiki/​CMake/​Language_Syntax|limbaj specific]], și pe baza acestora generează toate fișierele necesare pentru a face build-ul folosind un anumit tool: make, Ninja, Eclipse, Visual Studio etc. Pentru a vedea sistemele de build suportate pe o anumită platformă, puteți rula ''​cmake -help''​ (secțiunea ''​Generators''​). CMake este un meta-sistem de build independent de platformă. Acesta citeste niște fișiere de configurare (''​CMakeLists.txt''​) care descriu procesul de build într-un [[https://​cmake.org/​Wiki/​CMake/​Language_Syntax|limbaj specific]], și pe baza acestora generează toate fișierele necesare pentru a face build-ul folosind un anumit tool: make, Ninja, Eclipse, Visual Studio etc. Pentru a vedea sistemele de build suportate pe o anumită platformă, puteți rula ''​cmake -help''​ (secțiunea ''​Generators''​).
Line 95: Line 95:
  
 Fișierele generate se vor afla în directorul de unde a fost rulat CMake. Este recomandat ca acesta să fie diferit de cel în care se află sursele proiectului. Fișierele generate se vor afla în directorul de unde a fost rulat CMake. Este recomandat ca acesta să fie diferit de cel în care se află sursele proiectului.
-====== Introducere ​in LCPL ======+====== Introducere ​în LCPL ======
 În această secțiune vom prezenta un subset al limbajului LCPL, atât cât este necesar pentru rezolvarea exercițiului din laborator. Descrierea completă a limbajului o veți primi în prima temă. În această secțiune vom prezenta un subset al limbajului LCPL, atât cât este necesar pentru rezolvarea exercițiului din laborator. Descrierea completă a limbajului o veți primi în prima temă.
  
Line 238: Line 238:
     * conține un schelet al parserului     * conține un schelet al parserului
     * pentru a compila parserul intrați in directorul lcpl-parser și dați comanda ''​make''​. În urma compilării rezultă executabilul ''​lcpl-parser''​     * pentru a compila parserul intrați in directorul lcpl-parser și dați comanda ''​make''​. În urma compilării rezultă executabilul ''​lcpl-parser''​
-    * tot in acest director veți găsi două exemple ​''​simple.lcpl''​ si ''​factorial.lcpl''​, precum ​si fișierele ''​.ast''​ care corespund acestora. Pentru a genera fișierul ​simple.lcpl.ast, rulați ''​./​lcpl-parser ​simple.lcpl''​ +    * tot in acest director veți găsi două foldere, unul cu teste pentru fiecare exercițiu ​exemple, precum și rezultatul de referință. Pentru a genera fișierul .ast, rulați ''​./​lcpl-parser ​path_fisier''​ 
-    * exemplul din simple.lcpl este cel care poate fi tradus în AST în starea actuală a parser-ului +    * pentru ​ușurință puteți să folositi scriptul compare.sh, ce generează ​fișierul .ast și îl compară cu referința. (ex: ./​compare.sh basic sau ./​compare.sh all, pentru rularea tuturor testelor)
-    * pentru ​a rezolva exercițiile, trebuie să reușiți să obțineți un AST corect pe fișierul ​factorial.lcpl+
     * pe măsură ce preluați câte un exercițiu pe care trebuie să îl rezolvați, gândiți-vă la următorii pași:     * pe măsură ce preluați câte un exercițiu pe care trebuie să îl rezolvați, gândiți-vă la următorii pași:
       *  tokenii pe care trebuie să îi prelucrez sunt generați de analizorul lexical ?       *  tokenii pe care trebuie să îi prelucrez sunt generați de analizorul lexical ?
Line 283: Line 282:
  
 Pentru operatorii '​-',​ '​*',​ '<'​ și metode cu valoare de retur va trebui să adaugați reguli de parsare și noi noduri, de tipul '​BinaryOperator',​ respectiv '​Method',​ în arbore. De asemenea, adaugați regula de parsare . Urmăriți exemplul pentru operatorul '​+',​ respectiv metoda fara valoare de retur, și indicațiile marcate cu "TODO 1". Pentru operatorii '​-',​ '​*',​ '<'​ și metode cu valoare de retur va trebui să adaugați reguli de parsare și noi noduri, de tipul '​BinaryOperator',​ respectiv '​Method',​ în arbore. De asemenea, adaugați regula de parsare . Urmăriți exemplul pentru operatorul '​+',​ respectiv metoda fara valoare de retur, și indicațiile marcate cu "TODO 1".
 +
 +==== Exercițiul 2 (3p) ====
 +
 +Pentru statementul if va trebui să adaugați o nouă regulă de parsare și nodul aferent, de tipul '​IfStatement',​ în arbore. Pentru simplitate regula va trebui să evalueze doar structuri de forma: if <​cond>​ then <​expr>​ else <​expr>​ end. De asemenea va trebui să definiți tipul intors de această regulă. Urmăriți indicațiile marcate cu "TODO 2".
 +
 +==== Exercițiul 3 (4p) ====
 +
 +Adaugați reguli de parsare și nodurile aferente pentru apelul de funcție ('​Dispatch'​) de forma : [id expr1 expr2 ...], de asemenea va trebui să definiți tipul intors de aceste reguli. Urmăriți indicațiile marcate cu "TODO 3".
 +
 +==== Exercițiul bonus (4p) ====
 +
 +Extindeți exercițiul anterior, astfel încât gramatica sa accepte asignarea variabilelor și moștenirea unei clase. Urmăriți indicațiile marcate cu "TODO BONUS"​.
 +
cpl/labs/03.1475578841.txt.gz · Last modified: 2016/10/04 14:00 by bogdan.nitulescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0