%{ #include #include #include "parser.tab.h" extern int yylex(); extern size_t line_number; %} %option noyywrap %% \".*\" { 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; } 0x[0-9A-Fa-f]+ { yylval.i_val = atoi(yytext); return T_INTEGER; } -*[0-9]+ { yylval.i_val = atoi(yytext); return T_INTEGER; } lb { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } lh { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } lw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } ld { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } lbu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } lhu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } lwu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sb { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sh { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sd { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } li { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } lui { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } auipc { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } mv { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sext.b { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sext.h { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sext.w { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } zext.b { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } zext.h { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } zext.w { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } rev8 { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } czero.eqz { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } czero.nez { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } addi { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } add { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sh1add { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sh2add { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sh3add { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } add.wu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sh1add.wu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sh2add.wu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sh3add.wu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } addiw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } addw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sub { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } subw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } neg { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } negw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } mul { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } mulw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } mulh { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } mulhu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } mulhsu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } div { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } divu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } rem { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } remu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } min { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } max { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } minu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } maxu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } seqz { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } snez { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } slti { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } slt { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sltiu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sltu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } bexti { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } bext { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } andi { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } and { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } andn { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } bclri { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } bclr { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } ori { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } or { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } orn { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } bseti { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } bset { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } xori { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } xor { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } xnor { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } binvi { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } binv { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } not { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } orc.b { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } slli { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sll { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } slliw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sllw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } slli.wu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } srli { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } srl { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } srliw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } srlw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } srai { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sra { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sraiw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } sraw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } rori { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } ror { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } rol { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } roriw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } rorw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } rolw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } clz { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } clzw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } ctz { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } ctzw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } cpop { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } cpopw { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } j { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } jal { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } jr { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } jalr { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } call { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } tail { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } ret { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } beq { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } bne { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } blt { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } bgt { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } bge { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } ble { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } bltu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } bgtu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } bgeu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } bleu { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } nop { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } ecall { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } ebreak { yylval.instruction = strdup(yytext); return T_INSTRUCTION; } zero { yylval.reg = strdup(yytext); return T_REGISTER; } ra { yylval.reg = strdup(yytext); return T_REGISTER; } sp { yylval.reg = strdup(yytext); return T_REGISTER; } gp { yylval.reg = strdup(yytext); return T_REGISTER; } tp { yylval.reg = strdup(yytext); return T_REGISTER; } t0 { yylval.reg = strdup(yytext); return T_REGISTER; } t1 { yylval.reg = strdup(yytext); return T_REGISTER; } t2 { yylval.reg = strdup(yytext); return T_REGISTER; } s0 { yylval.reg = strdup(yytext); return T_REGISTER; } fp { yylval.reg = strdup(yytext); return T_REGISTER; } s1 { yylval.reg = strdup(yytext); return T_REGISTER; } a0 { yylval.reg = strdup(yytext); return T_REGISTER; } a1 { yylval.reg = strdup(yytext); return T_REGISTER; } a2 { yylval.reg = strdup(yytext); return T_REGISTER; } a3 { yylval.reg = strdup(yytext); return T_REGISTER; } a4 { yylval.reg = strdup(yytext); return T_REGISTER; } a5 { yylval.reg = strdup(yytext); return T_REGISTER; } a6 { yylval.reg = strdup(yytext); return T_REGISTER; } a7 { yylval.reg = strdup(yytext); return T_REGISTER; } s2 { yylval.reg = strdup(yytext); return T_REGISTER; } s3 { yylval.reg = strdup(yytext); return T_REGISTER; } s4 { yylval.reg = strdup(yytext); return T_REGISTER; } s5 { yylval.reg = strdup(yytext); return T_REGISTER; } s6 { yylval.reg = strdup(yytext); return T_REGISTER; } s7 { yylval.reg = strdup(yytext); return T_REGISTER; } s8 { yylval.reg = strdup(yytext); return T_REGISTER; } s9 { yylval.reg = strdup(yytext); return T_REGISTER; } s10 { yylval.reg = strdup(yytext); return T_REGISTER; } s11 { yylval.reg = strdup(yytext); return T_REGISTER; } t3 { yylval.reg = strdup(yytext); return T_REGISTER; } t4 { yylval.reg = strdup(yytext); return T_REGISTER; } t5 { yylval.reg = strdup(yytext); return T_REGISTER; } t6 { yylval.reg = strdup(yytext); return T_REGISTER; } x0 { yylval.reg = strdup(yytext); return T_REGISTER; } x1 { yylval.reg = strdup(yytext); return T_REGISTER; } x2 { yylval.reg = strdup(yytext); return T_REGISTER; } x3 { yylval.reg = strdup(yytext); return T_REGISTER; } x4 { yylval.reg = strdup(yytext); return T_REGISTER; } x5 { yylval.reg = strdup(yytext); return T_REGISTER; } x6 { yylval.reg = strdup(yytext); return T_REGISTER; } x7 { yylval.reg = strdup(yytext); return T_REGISTER; } x8 { yylval.reg = strdup(yytext); return T_REGISTER; } x9 { yylval.reg = strdup(yytext); return T_REGISTER; } x10 { yylval.reg = strdup(yytext); return T_REGISTER; } x11 { yylval.reg = strdup(yytext); return T_REGISTER; } x12 { yylval.reg = strdup(yytext); return T_REGISTER; } x13 { yylval.reg = strdup(yytext); return T_REGISTER; } x14 { yylval.reg = strdup(yytext); return T_REGISTER; } x15 { yylval.reg = strdup(yytext); return T_REGISTER; } x16 { yylval.reg = strdup(yytext); return T_REGISTER; } x17 { yylval.reg = strdup(yytext); return T_REGISTER; } x18 { yylval.reg = strdup(yytext); return T_REGISTER; } x19 { yylval.reg = strdup(yytext); return T_REGISTER; } x20 { yylval.reg = strdup(yytext); return T_REGISTER; } x21 { yylval.reg = strdup(yytext); return T_REGISTER; } x22 { yylval.reg = strdup(yytext); return T_REGISTER; } x23 { yylval.reg = strdup(yytext); return T_REGISTER; } x24 { yylval.reg = strdup(yytext); return T_REGISTER; } x25 { yylval.reg = strdup(yytext); return T_REGISTER; } x26 { yylval.reg = strdup(yytext); return T_REGISTER; } x27 { yylval.reg = strdup(yytext); return T_REGISTER; } x28 { yylval.reg = strdup(yytext); return T_REGISTER; } x29 { yylval.reg = strdup(yytext); return T_REGISTER; } x30 { yylval.reg = strdup(yytext); return T_REGISTER; } x31 { yylval.reg = strdup(yytext); return T_REGISTER; } .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-Z0-9\.\_]+: { yylval.symbol = strdup(yytext); char *const colon = strrchr(yylval.symbol, ':'); if (colon != NULL) { *colon = '\0'; } return T_LABEL; } [a-zA-Z\_\.]+[a-zA-Z0-9\_\.]* { yylval.modifier = strdup(yytext); return T_SYMBOL; } . ; %%