This shows you the differences between two versions of the page.
cpl:labs:03 [2016/10/04 14:23] bogdan.nitulescu [Exercițiul 1 (3p)] |
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 ? |