diff options
| author | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-03-15 20:03:26 -0400 |
|---|---|---|
| committer | Jacob McDonnell <jacob@jacobmcdonnell.com> | 2026-03-15 20:03:26 -0400 |
| commit | efb0a239c4aaee370d97caf216859a724d7f72bd (patch) | |
| tree | d13e9523103fab6c7c2eebbc654847f4924ea603 /src/lexer.l | |
| parent | 68b9f87bc3b6bd6ccb3773641578b0d914e61104 (diff) | |
feat: Parsing modifiers and directives
Support added for parsing a limited set of directives and for all access
modifiers.
Diffstat (limited to 'src/lexer.l')
| -rw-r--r-- | src/lexer.l | 50 |
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, '"'); |
