blob: ac579e7a23848fe6a5883e4c293a3bbb2215d779 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
%{
#include <string.h>
#include <stdlib.h>
#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; }
. ;
%%
|