summaryrefslogtreecommitdiff
path: root/src/lexer.l
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; }
.                               ;
%%