This shows you the differences between two versions of the page.
cpl:labs:02 [2016/10/05 23:10] bogdan.nitulescu [Secțiunea de reguli gramaticale] |
cpl:labs:02 [2016/10/05 23:18] (current) bogdan.nitulescu [Secțiunea de declarații Bison] |
||
---|---|---|---|
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 138: | Line 138: | ||
* ''$$'' 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 ’+’ ’-’ |