[ Pobierz całość w formacie PDF ]
.Dziêki temu yacc i bison mog¹ wygenerowaæ poprawny kod umo¿liwiaj¹cyodwo³ywanie siê do sk³adników unii yylval.Typ jest oznaczany za pomoc¹ podanianazwy sk³adnika unii w nawiasach trójk¹tnych w dyrektywie %token, tak jak wponi¿szym przyk³adzie:%token tIDENTIFIER%token tNUMBERNastêpnym etapem bêdzie wykorzystanie wartoœci elementów w parserze.Dzia³ania w regu³achKa¿da regu³a w specyfikacji gramatycznej programu bison mo¿e zawieraæ fragmentykodu, podobne do stosowanych w specyfikacji skanera.Zazwyczaj umieszcza siê jew regule na koñcu ka¿dej alternatywy.Zmienimy teraz kilka regu³ gramatycznych,dodaj¹c do nich proste dzia³ania (tylko w celach pokazowych):statement: tIDENTIFIER tASSIGN expression { printf("assignment seen\n"); }| tIF expression tTHEN statement| tIF expression tTHEN statement tELSE statement| tBEGIN statements tEND;statements: statement| statement ';' statements;expression: tNUMBER { printf("number seen: %d\n", $1); }| tIDENTIFIER { printf("identifier seen: %s\n", $1); }| expression '+' expression| expression '-' expression| expression '>' expression;Zmiany polegaj¹ na tym, ¿e po rozpoznaniu instrukcji przypisania bêdziewyœwietlany komunikat.Komunikaty bêd¹ tak¿e pojawiaæ siê po wyst¹pieniuidentyfikatora lub liczby w wyra¿eniu.Wartoœæ elementu mo¿emy uzyskaæ,stosuj¹c skrótowy zapis $1, który bêdzie rozwiniêty do pe³nej postaciodnosz¹cej siê do sk³adnika unii yylval (w rzeczywistoœci jest to odniesieniedo elementu stosu wartoœci obs³ugiwanego przez parser, ale nie jest toprzedmiot naszego zainteresowania).Do pozosta³ych elementów w regule mo¿naodnosiæ siê za pomoc¹ skrótów $2, $3 itd., zgodnie z miejscem ich wystêpowaniaw regule.Np.we fragmencie regu³y:| expression '-' expressionwartoœæ semantyczna pierwszego wyra¿enia wynosi $1, a drugiego $3.Wartoœci maj¹ równie¿ niezakoñczone struktury i mo¿na zdefiniowaæ ich typypodobnie, jak w wypadku typów elementów.Do tego celu s³u¿y dyrektywa %type,która jest wstawiana w czêœæ deklaracyjn¹ w specyfikacji gramatycznej.Pisz¹cnp.program obliczeniowy (kalkulator), mo¿na ¿¹daæ obliczania wartoœciwprowadzanych wyra¿eñ.Takie wymaganie mog¹ spe³niaæ nastêpuj¹ce fragmentyregu³ gramatycznych:%type expressionstatement: tIDENTIFIER tASSIGN expression{ printf("assignment seen, value is %d\n", $3); }| tIF expression tTHEN statement| tIF expression tTHEN statement tELSE statement| tBEGIN statements tEND;expression: tNUMBER { $$ = $1; }| tIDENTIFIER { $$ = 0; /* would be lookup($1); see text */; }| expression '+' expression { $$ = $1 + $3; }| expression '-' expression { $$ = $1 - $3; }| expression '>' expression { $$ = $1 > $3; }Stwierdzamy tutaj, ¿e wyra¿enia maj¹ typ numval, czyli ¿e ich wartoœci mog¹ byæprzechowywane jako liczby ca³kowite w sk³adniku numval unii yylval.Mo¿nanastêpnie u¿yæ tej wartoœci wyra¿enia w wyœwietlanym komunikacie sygnalizuj¹cymprzypisanie, je¿eli tylko o to zadbamy.Aby takie zadanie wykonaæ, musimy byæ pewni, ¿e wszystkie alternatywy w reguleopisuj¹cej to wyra¿enie bêd¹ zwraca³y wartoœæ liczbow¹.W naszym przypadku jestto spe³nione.Do oznaczenia zwracanej wartoœci struktury niezakoñczonej u¿ywamyskrótu $$ (bêdzie to w tym konkretnym wypadku expression).Do wartoœcipodwyra¿eñ w wyra¿eniach z³o¿onych odnosimy siê tak jak poprzednio — za pomoc¹skrótów $1 i $3.W tym prostym przyk³adzie dla identyfikatorów zwracana jest wartoœæ zerowa.Wpe³nej aplikacji mo¿na by wyszukiwaæ wartoœæ zmiennej w tablicy symboli.Mo¿natak¿e przechowaæ wartoœæ elementu e, jeœli stwierdzimy, ¿e ma ona byæ u¿yta winstrukcji przypisania.W niektórych przypadkach mo¿e byæ potrzebna wartoœæ struktury niezakoñczonej,której typ nie nale¿y do grupy typów u¿ywanych dla elementów.Jako przyk³admo¿na podaæ budowê struktury danych odpowiadaj¹cej strukturze wejœciowej, anastêpnie przetwarzanie otrzymanej struktury jako ca³oœci (a nie stopniowebudowanie wyniku).Taka sytuacja mo¿e wyst¹piæ przy tworzeniu aplikacjikalkulatora
[ Pobierz całość w formacie PDF ]