Differences

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

Link to this comparison view

cpl:labs:01 [2015/12/06 19:23]
laura.vasilescu [Secțiunea de reguli]
cpl:labs:01 [2016/10/03 21:56] (current)
bogdan.nitulescu [Introducere]
Line 1: Line 1:
 ====== 01. Introduction to Flex ====== ====== 01. Introduction to Flex ======
  
 +===== Introducere =====
 +De-a lungul acestui semestru, veți studia în cadrul cursului modul de implementare al unui compilator. La nivel conceptual, compilatorul este un program ce face translatarea dintr-un limbaj în altul. Cel mai adesea, compilatorul face translatarea dintr-un limbaj de nivel înalt (C, C++, Java), ce este scris și înteles de un programator,​ într-un limbaj low level (bytecode, limbaj asamblare, cod mașina) ce poate fi mai apoi executat de procesor (eventual după aplicarea unei noi translatări).
 +
 +Operația de compilare a unui limbaj se face în general în mai mulți pași. Fiecare pas produce ca output o translatare a datelor de intrare primite, output ce servește ca input pentru pasul următor. Principalii pași ce se disting, în mod conceptual, pentru majoritatea compilatoarelor se pot vedea în figura urmatoare, împreuna cu inputul si outputul aferent, precum și tool-urile pe care le vom folosi în cadrul laboratorului și temelor pentru implementare.
 +
 +{{ :​cpl:​labs:​lab1better.png?​600 |}}
 ===== Nice to read ===== ===== Nice to read =====
  
Line 89: Line 95:
 <​state1,​state2,​...,​stateN>​rule <​state1,​state2,​...,​stateN>​rule
 </​code>​ </​code>​
 +
 +Un exemplu [[http://​pastebin.com/​uaCe7CxS|aici]].
  
 === Secvențe de cod C în secțiunea de definiții === === Secvențe de cod C în secțiunea de definiții ===
Line 153: Line 161:
 === Variabile și macro-uri utile === === Variabile și macro-uri utile ===
  
-În această secțiune vom defini un set de variabile și macro-uri utile suportate ​de ''​flex''​. Acestea pot fi folosite în cadrul secțiunii de cod, dar și în momentul inserării de cod în cadrul secțiunii de definiții sau de reguli.+În această secțiune vom defini un set de variabile și macro-uri utile oferite ​de ''​flex''​. Acestea pot fi folosite în cadrul secțiunii de cod, dar și în momentul inserării de cod în cadrul secțiunii de definiții sau de reguli.
  
   * //char *yytext// - adresa zonei în care sunt reținute caracterele ce compun atomul curent;   * //char *yytext// - adresa zonei în care sunt reținute caracterele ce compun atomul curent;
Line 160: Line 168:
   * //FILE *yyout// - pointer către fișierul deschis în care se poate scrie cu ajutorul macro-ului ''​ECHO'';​   * //FILE *yyout// - pointer către fișierul deschis în care se poate scrie cu ajutorul macro-ului ''​ECHO'';​
   * //ECHO// - realizează scrierea conținutului ''​yytext''​ în ''​yyout'';​   * //ECHO// - realizează scrierea conținutului ''​yytext''​ în ''​yyout'';​
-  * //BEGIN start_state//​ - comută analizorul în ''​start_state'';​+  * //BEGIN(start_state)// - comută analizorul în ''​start_state'';​
   * //REJECT// - caută următoarea regulă al cărei șablon se potrivește cu atomul în curs de prelucrare (sau cu un prefix) și execută acțiunea asociată regulii găsite;   * //REJECT// - caută următoarea regulă al cărei șablon se potrivește cu atomul în curs de prelucrare (sau cu un prefix) și execută acțiunea asociată regulii găsite;
   * //​YY_START//​ - starea curentă (un număr);   * //​YY_START//​ - starea curentă (un număr);
-  * //yyerminate()// - termină procesul de analiză și returnează ​valoarea 0 către apelantul funcției ''​yylex'';​+  * //yyterminate()// - termină procesul de analiză și întoarce ​valoarea 0 către apelantul funcției ''​yylex'';​
   * //​yymore()//​ - concatenează următorul atom la atomul existent în ''​yytext'';​   * //​yymore()//​ - concatenează următorul atom la atomul existent în ''​yytext'';​
   * //​yyless(int n)// - lasă în ''​yytext''​ primele //n caractere// ale atomului curent, restituind în șirul de intrare caracterele de pe pozițiile n+1 până la sfârșit; actualizează ''​yyleng''​ la n;   * //​yyless(int n)// - lasă în ''​yytext''​ primele //n caractere// ale atomului curent, restituind în șirul de intrare caracterele de pe pozițiile n+1 până la sfârșit; actualizează ''​yyleng''​ la n;
Line 172: Line 180:
 ===== Funcția yylex ===== ===== Funcția yylex =====
  
-  * se aplică acțiunile corespunzătoare din specificație (secțiunea de reguli) care pot genera text specific în fișierul ''​yyout''​ sau pot returna ​coduri lexicale;+  * se aplică acțiunile corespunzătoare din specificație (secțiunea de reguli) care pot genera text specific în fișierul ''​yyout''​ sau pot întoarce ​coduri lexicale;
   * textul din fișierul sursă care nu se potrivește cu niciun șablon este copiat automat în ''​yyout'';​   * textul din fișierul sursă care nu se potrivește cu niciun șablon este copiat automat în ''​yyout'';​
   * dacă pentru un text se potrivesc mai multe șabloane, se alege potrivirea **cea mai lungă**;   * dacă pentru un text se potrivesc mai multe șabloane, se alege potrivirea **cea mai lungă**;
   * dacă pentru un text se potrivesc mai multe șabloane de aceeași lungime, se alege **prima potrivire în ordine textuală** din specificație;​   * dacă pentru un text se potrivesc mai multe șabloane de aceeași lungime, se alege **prima potrivire în ordine textuală** din specificație;​
   * textul corespunzător potrivirii este copiat în ''​yytext'',​ iar lungimea acestuia este reținută în ''​yyleng'';​   * textul corespunzător potrivirii este copiat în ''​yytext'',​ iar lungimea acestuia este reținută în ''​yyleng'';​
-  * când analizorul întâlnește marcajul ''​EOF'',​ verifică rezultatul funcției ''​yywrap'';​ dacă rezultatul este fals (zero), înseamnă că analiza trebuie să continue cu noul fișier desemnat de ''​yyin'';​ dacă rezultatul este nenul, analiza se termină și se returnează ​valoarea zero spre apelantul funcției ''​yylex'';​+  * când analizorul întâlnește marcajul ''​EOF'',​ verifică rezultatul funcției ''​yywrap'';​ dacă rezultatul este fals (zero), înseamnă că analiza trebuie să continue cu noul fișier desemnat de ''​yyin'';​ dacă rezultatul este nenul, analiza se termină și se întoarce ​valoarea zero spre apelantul funcției ''​yylex'';​
  
 Absența funcției ''​yywrap''​ poate fi suplinită de opțiunea ''​%option noyywrap''​ sau prin opțiunea ''​-lfl''​ la linkare. ​ Absența funcției ''​yywrap''​ poate fi suplinită de opțiunea ''​%option noyywrap''​ sau prin opțiunea ''​-lfl''​ la linkare. ​
Line 183: Line 191:
  
 În rezolvarea laboratorului folosiți arhiva de sarcini {{ :​cpl:​labs:​lab01_num_lines.zip | lab01_num_lines.zip }} În rezolvarea laboratorului folosiți arhiva de sarcini {{ :​cpl:​labs:​lab01_num_lines.zip | lab01_num_lines.zip }}
 +
 +====== Exercițiul 0 ======
 +
 +Înscrieți-vă pe [[cpl:​info:​lista-discutii | Lista de discuții de CPL]].
  
 ===== Exercițiul 1 - num lines (3p) ===== ===== Exercițiul 1 - num lines (3p) =====
Line 199: Line 211:
 ===== Exercițiul 3 - names (2p) ===== ===== Exercițiul 3 - names (2p) =====
  
-Scrieți un fișier de specificație ''​.lex''​ care identifică toate cuvintele ​dintr-un text care încep cu majusculă.+Scrieți un fișier de specificație ''​.lex''​ care identifică toate cuvintele care încep cu majusculă.
  
 ===== Exercițiul 4 - appearances (2p) ===== ===== Exercițiul 4 - appearances (2p) =====
cpl/labs/01.1449422586.txt.gz · Last modified: 2015/12/06 19:23 by laura.vasilescu
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