[ 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 ]