summaryrefslogtreecommitdiff
path: root/src/lexer.l
diff options
context:
space:
mode:
Diffstat (limited to 'src/lexer.l')
-rw-r--r--src/lexer.l50
1 files changed, 46 insertions, 4 deletions
diff --git a/src/lexer.l b/src/lexer.l
index 26be828..ac579e7 100644
--- a/src/lexer.l
+++ b/src/lexer.l
@@ -7,11 +7,53 @@ extern size_t line_number;
%}
%option noyywrap
%%
-^[a-zA-Z]+ { yylval.symbol = strdup(yytext); return T_INSTRUCTION; }
-%*[a-zA-Z\_\-]+[a-zA-Z0-9\_\-]* { yylval.symbol = strdup(yytext); return T_SYMBOL; }
0x[0-9A-Fa-f]+ { yylval.i_val = atoi(yytext); return T_INTEGER; }
-[0-9]+ { yylval.i_val = atoi(yytext); return T_INTEGER; }
--*[0-9]*\.*[0-9]* { yylval.i_val = atof(yytext); return T_FLOAT; }
+-*[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, '"');