%{ #include #include #include "parser.tab.h" extern int yylex(); extern size_t line_number; %} %option noyywrap %% 0x[0-9A-Fa-f]+ { yylval.i_val = atoi(yytext); return T_INTEGER; } -*[0-9]+ { yylval.i_val = atoi(yytext); return T_INTEGER; } ^[a-zA-Z0-9\.\_]+: { yylval.symbol = strdup(yytext); char *const colon = strrchr(yylval.symbol, ':'); if (colon != NULL) { *colon = '\0'; } return T_LABEL; } .align { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .globl { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .local { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .ident { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .section { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .size { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .text { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .data { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .rodata { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .bss { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .string { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .asciz { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .equ { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .byte { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .2byte { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .half { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .short { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .4byte { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .word { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .long { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .8byte { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .dword { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .quad { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .float { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .double { yylval.directive = strdup(yytext); return T_DIRECTIVE; } .zero { yylval.directive = strdup(yytext); return T_DIRECTIVE; } %hi { yylval.modifier = strdup(yytext); return T_MODIFIER; } %lo { yylval.modifier = strdup(yytext); return T_MODIFIER; } %pcrel_hi { yylval.modifier = strdup(yytext); return T_MODIFIER; } %pcrel_lo { yylval.modifier = strdup(yytext); return T_MODIFIER; } %tprel_hi { yylval.modifier = strdup(yytext); return T_MODIFIER; } %tprel_lo { yylval.modifier = strdup(yytext); return T_MODIFIER; } %tprel_add { yylval.modifier = strdup(yytext); return T_MODIFIER; } %tls_ie_pcrel_hi { yylval.modifier = strdup(yytext); return T_MODIFIER; } %tls_gd_pcrel_hi { yylval.modifier = strdup(yytext); return T_MODIFIER; } %got_pcrel_hi { yylval.modifier = strdup(yytext); return T_MODIFIER; } [a-zA-Z\_\.]+[a-zA-Z0-9\_\.]* { yylval.modifier = strdup(yytext); return T_SYMBOL; } \".*\" { yylval.s_val = strdup(yytext+1); char *const close_paren = strrchr(yylval.s_val, '"'); if (close_paren != NULL) { *close_paren = '\0'; } return T_STRING; } , { return T_COMMA; } \( { return T_OPENPAREN; } \) { return T_CLOSEPAREN; } #.* ; [ \t] ; \n { ++line_number; return T_ENDL; } . ; %%