%option noyywrap %x ascii_string ascii_koniec _SPACJE [ \t] _KOMENTARZ [!;] _ETYKIETA [a-zA-Z][a-zA-Z0-9_]* _LICZBA [0-9]+|"0x"[0-9]+ _ASCII ".ascii" _TEXT ".text" _ALIGN ".align" _DATA ".data" _SKIP ".skip" _PSEUDOR mov|cmp|tst|not|neg|inc|dec|clr|restore|ret|jmp|skipz|skipnz|set|nop %{ #include "zmienne.h" #include "stale.h" #include "funkcje.h" #include #include "spasm.tab.h" %} %% ^{_SPACJE}+ /* wcinamy spacje */ ^{_SPACJE}*{_KOMENTARZ}+.*[^\n] /* ...i komentarze */ {_ETYKIETA}":" return (ETYKIETA); {_PSEUDOR} return (PSEUDO_R); {_LICZBA} yylval.lcalk = strtol(yytext, NULL, 0); return (LICZBA); "'" { /* ciągi po ".ascii" muszą się zawierać w cudzysłowach '' */ BEGIN(ascii_string); if (buforZnakowy) CzyscBufor(&buforZnakowy, DLUGOSCBUFORA); return (CUDZYSLOW); } \n { yyerror("brak zamykającego cudzysłowu"); } "\\'" { /* dodajemy sam znak ' */ Dopisz(&buforZnakowy, "'"); } "\\"[^\'] { /* \b \n \r \t -- lub sam znaczek */ char *znak = yytext+1; switch (*znak) { case 'b': case 'B': Dopisz(&buforZnakowy,"\b"); break; case 'n': case 'N': Dopisz(&buforZnakowy,"\n"); break; case 'r': case 'R': Dopisz(&buforZnakowy,"\r"); break; case 't': case 'T': Dopisz(&buforZnakowy,"\t"); break; default: Dopisz(&buforZnakowy,znak); } } [^\'] { //jedna literka różna od ' Dopisz(&buforZnakowy, yytext); } "'" { /* koniec '...' */ BEGIN(ascii_koniec); yylval.string = buforZnakowy; //odkładamy ' z powrotem, żeby // następna regułka mogła go złapać // i odesłać CUDZYSLOW unput('\''); return(TEKSTCIAGU); } "'" { BEGIN(INITIAL); return(CUDZYSLOW); } {_ASCII} return (ASCII); {_TEXT} return (TEXT); {_ALIGN} return (ALIGN); {_DATA} return (DATA); {_SKIP} return (SKIP); {_KOMENTARZ}+.*[^\n] /* komentarze po jakiejś komendzie/dyrektywie... */ {_SPACJE}+ /* zbędne spacje */ \n ++numerLinii; return (NLINIA); . { yyerror("ze co??"); exit(1); }