This shows you the differences between two versions of the page.
cpl:labs:02 [2016/10/04 12:32] bogdan.nitulescu [Exercițiul 3 (bonus) - (3p)] |
cpl:labs:02 [2016/10/05 23:18] (current) bogdan.nitulescu [Secțiunea de declarații Bison] |
||
---|---|---|---|
Line 14: | Line 14: | ||
* LALR(1) - Look Ahead Left to Right with a one-token lookahead | * LALR(1) - Look Ahead Left to Right with a one-token lookahead | ||
* GLR - Generalized Left to Right | * GLR - Generalized Left to Right | ||
- | Majoritatea parserelor folosesc LALR(1), care are mai putine capabilitati, insa este semnificativ mai rapid si mai usor de folosit decat GLR. Si noi, vom genera tot parsere LALR. | + | Majoritatea parserelor folosesc LALR(1), care are mai putine capabilitati, insa este semnificativ mai rapid si mai usor de folosit decat GLR. Si noi vom genera tot parsere LALR. |
''Bison'' este varianta GNU a ''yacc'' (Yet Another Compiler-Compiler). | ''Bison'' este varianta GNU a ''yacc'' (Yet Another Compiler-Compiler). | ||
Line 72: | Line 72: | ||
* simbolul de start al gramaticii (opțional) | * simbolul de start al gramaticii (opțional) | ||
<code C> | <code C> | ||
- | %start <tip> nume1 nume2 | + | %start <tip> nume |
</code> | </code> | ||
Line 98: | Line 98: | ||
%type <int_value> exp | %type <int_value> exp | ||
</code> | </code> | ||
- | Dacă este suficient să întroarcem valori de tip int, și nu definim un union de tipuri, atunci ''<token_type>'' este omis în declararea tokenilor. | + | Dacă este suficient să întoarcem valori de tip int, și nu definim un union de tipuri, atunci ''<token_type>'' este omis în declararea tokenilor. |
* Precedența %left. Aceasta va fi detaliată intr-un subcapitol ulterior. | * Precedența %left. Aceasta va fi detaliată intr-un subcapitol ulterior. | ||
- | O listă completă cu simbolii ''bison'' găsiți [[http://www.gnu.org/software/bison/manual/html_node/Table-of-Symbols.html|aici]] | + | O listă completă cu simbolurile ''bison'' găsiți [[http://www.gnu.org/software/bison/manual/html_node/Table-of-Symbols.html|aici]] |
| | ||
==== Secțiunea de reguli gramaticale ==== | ==== Secțiunea de reguli gramaticale ==== | ||
Line 134: | Line 134: | ||
{C statements} | {C statements} | ||
</code> | </code> | ||
- | <note>Bison nu verifica corectitudinea codului C din acțiuni ci doar îl copiaza în fișierul .c al parserului, unde va fi verificat de compilatorul de C. Așadar erorile de C vor fi raportate abia la compilarea parserului.</note> | + | <note>Bison nu verifică corectitudinea codului C din acțiuni ci doar îl copiaza în fișierul .c al parserului, unde va fi verificat de compilatorul de C. Așadar erorile de C vor fi raportate abia la compilarea parserului.</note> |
Acțiunea poate fi plasată la sfârșitul unei alternative sau chiar în interiorul acesteia. | Acțiunea poate fi plasată la sfârșitul unei alternative sau chiar în interiorul acesteia. | ||
* ''$$'' reprezinta rezultatul, adica valoarea ce va fi atribuită neterminaului de la stânga regulii, cel la care se va reduce regula. | * ''$$'' reprezinta rezultatul, adica valoarea ce va fi atribuită neterminaului de la stânga regulii, cel la care se va reduce regula. | ||
* ''$n'' este al n-lea termen din regula sintactica. | * ''$n'' este al n-lea termen din regula sintactica. | ||
- | Acțiunile definite în mijlocul unei reguli se folosesc numai în anumite situații, pot folosi doar simbolii anteriori acesteia (fiindcă se execută înainte ca simbolii următori regulii să fie parsați) și sunt o sursă de conflicte. Vom reveni asupra acestora în laboratorul urmator. | + | Acțiunile definite în mijlocul unei reguli se folosesc numai în anumite situații, pot folosi doar simboluri anterioare acesteia (fiindcă se execută înainte ca simbolurile următoare regulii să fie parsați) și sunt o sursă de conflicte. Vom reveni asupra acestora în laboratorul următor. |
==== Secțiunea de cod C ==== | ==== Secțiunea de cod C ==== | ||
Secțiunea de cod C trebuie să conțină: | Secțiunea de cod C trebuie să conțină: | ||
Line 232: | Line 232: | ||
- | Gramatica devine mai stufoasă, dar neambigua. Metoda explicită presupune folosirea explicită a regulilor de precedență suportate de Bison. | + | Gramatica devine mai stufoasă, dar neambiguă. Metoda explicită presupune folosirea explicită a regulilor de precedență suportate de Bison. |
- | **Asociativitatea** și **precedența** pot fi specificate în urmatorul mod: | + | **Asociativitatea** și **precedența** pot fi specificate în următorul mod: |
* Pentru asociativitate se pot folosi: ''%left'', ''%right'', ''%nonassoc'' | * Pentru asociativitate se pot folosi: ''%left'', ''%right'', ''%nonassoc'' | ||
* Precedența operatorilor binari: | * Precedența operatorilor binari: | ||
* Se specifică asociativitatea folosind ''%left'' | * Se specifică asociativitatea folosind ''%left'' | ||
* Operatorii din același grup au aceeași precedență, iar între grupuri, precedența crește în jos. | * Operatorii din același grup au aceeași precedență, iar între grupuri, precedența crește în jos. | ||
- | * Pentru a stabili precedența operatorilor unari se foloseste ''%prec''. Acesta schimbă precedența unei reguli la precedența tokenului urmator. | + | * Pentru a stabili precedența operatorilor unari se foloseste ''%prec''. Acesta schimbă precedența unei reguli la precedența tokenului următor. |
<code C> | <code C> | ||
%left ’+’ ’-’ | %left ’+’ ’-’ | ||
Line 264: | Line 264: | ||
</code> | </code> | ||
- | ====== Exerciții de laborator (10p) ====== | + | ====== Exerciții de laborator (13p) ====== |
În rezolvarea laboratorului folosiți arhiva de sarcini {{ :cpl:labs:lab02_simple_ops.zip | lab02_simple_ops.zip }} | În rezolvarea laboratorului folosiți arhiva de sarcini {{ :cpl:labs:lab02_simple_ops.zip | lab02_simple_ops.zip }} |