%union { int lcalk; char * string; } %type tekst_ascii %token LICZBA %token ASCII %token TEXT %token ALIGN %token DATA %token SKIP %token CUDZYSLOW %token TEKSTCIAGU %token ETYKIETA %token NLINIA %token PSEUDO_R %start program %{ #include #include "zmienne.h" #include "stale.h" #include "funkcje.h" %} %% program: /* pustka */ | program linia ; linia: wyrazenie | NLINIA | { yyerror("troszku nie rozumiem!"); YYABORT; } ; wyrazenie: ETYKIETA { printf("--> etykieta '%s'\n", yytext); } | wyr2 | wyrazenie wyr2 ; wyr2: dyrektywa | instrukcja ; dyrektywa: ASCII ascii | TEXT { printf("--> sekcja kodu...\n"); } | DATA { /* sekcja danych */ } | ALIGN align /* align musi mieć parametr */ | SKIP skip /* skip też */ ; ascii: CUDZYSLOW tekst_ascii CUDZYSLOW { printf("--> łańcuch `%s'\n", $2); } | { yyerror("brak ciągu"); YYABORT; } ; tekst_ascii: TEKSTCIAGU { $$ = $1; } ; align: LICZBA { int _al = $1; if (_al != 2 && _al != 4) yyerror("dozwolone wartości to 2 lub 4"); } | { yyerror("brak wartości dla ALIGN"); YYABORT; } ; skip: LICZBA { } | { yyerror("brak wartości dla SKIP"); YYABORT; } ; instrukcja: pseudorozkaz ; pseudorozkaz: PSEUDO_R { printf("--> pseudorozkaz: %s\n", yytext); } ;