diff options
Diffstat (limited to 'src/lexer.l')
| -rw-r--r-- | src/lexer.l | 229 |
1 files changed, 208 insertions, 21 deletions
diff --git a/src/lexer.l b/src/lexer.l index ac579e7..6daaf6b 100644 --- a/src/lexer.l +++ b/src/lexer.l @@ -7,16 +7,209 @@ 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'; +\".*\" { + yylval.s_val = strdup(yytext+1); + char *const close_paren = strrchr(yylval.s_val, '"'); + if (close_paren != NULL) { + *close_paren = '\0'; } - return T_LABEL; + 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; } @@ -53,20 +246,14 @@ extern size_t line_number; %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'; +^[a-zA-Z0-9\.\_]+: { + yylval.symbol = strdup(yytext); + char *const colon = strrchr(yylval.symbol, ':'); + if (colon != NULL) { + *colon = '\0'; } - return T_STRING; + return T_LABEL; } -, { return T_COMMA; } -\( { return T_OPENPAREN; } -\) { return T_CLOSEPAREN; } -#.* ; -[ \t] ; -\n { ++line_number; return T_ENDL; } +[a-zA-Z\_\.]+[a-zA-Z0-9\_\.]* { yylval.modifier = strdup(yytext); return T_SYMBOL; } . ; %% |
