blob: cf63cfe83a068bd52be04bee6df4abd17cc6dbf5 (
plain) (
blame)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
|
/* SPDX-License-Identifier: copyleft-next-0.3.1 */
/* Copyright 2023 Kim Kuparinen < kimi.h.kuparinen@gmail.com > */
%option reentrant noyywrap nounput noinput nodefault
%{
#define FROM_LEXER
#include <tasm/parser.h>
static void update_yylloc(struct parser *parser, YYLTYPE *lloc, const char *text)
{
(void)parser;
lloc->first_line = lloc->last_line;
lloc->first_column = lloc->last_column;
for (size_t i = 0; text[i] != 0; ++i) {
if (text[i] == '\n') {
lloc->last_line++;
/* flex uses 1 based indexing */
lloc->last_column = 1;
} else {
lloc->last_column++;
}
}
}
#define YY_USER_ACTION update_yylloc(parser, yylloc, yytext);
%}
%x SC_COMMENT
id [_a-zA-Z][_a-zA-Z0-9]*
label {id}[[:space:]]*:
dec -?[0-9]+
tri 0t[01i]+
hept 0h[0-9A-HKMNPRTVXZa-hkmnprtvxz]+
imm {tri}|{hept}|{dec}
str \"(\\.|[^"\\])*\"
%%
{label} {
/* strip trailing ':' */
char *s = yytext + strlen(yytext);
s[-1] = '\0';
yylval->str = yytext;
return label;
}
{imm} {
yylval->tri = parse_imm(yytext);
return imm;
}
{str} {
/* strip leading and trailing " */
char *s = yytext + strlen(yytext);
s[-1] = '\0';
yylval->str = yytext + 1;
return str;
}
".set" {return set;}
".include" {return include;}
"x0" {return x0;}
"x1" {return x1;}
"x2" {return x2;}
"x3" {return x3;}
"x4" {return x4;}
"x5" {return x5;}
"x6" {return x6;}
"x7" {return x7;}
"x8" {return x8;}
"x9" {return x9;}
"x10" {return x10;}
"x11" {return x11;}
"x12" {return x12;}
"x13" {return x13;}
"x14" {return x14;}
"x15" {return x15;}
"x16" {return x16;}
"x17" {return x17;}
"x18" {return x18;}
"x19" {return x19;}
"x20" {return x20;}
"x21" {return x21;}
"x22" {return x22;}
"x23" {return x23;}
"x24" {return x24;}
"x25" {return x25;}
"x26" {return x26;}
"x27" {return x27;}
"x28" {return x28;}
"x29" {return x29;}
"x30" {return x30;}
"x31" {return x31;}
"x32" {return x32;}
"x33" {return x33;}
"x34" {return x34;}
"x35" {return x35;}
"x36" {return x36;}
"x37" {return x37;}
"x38" {return x38;}
"x39" {return x39;}
"x40" {return x40;}
"x41" {return x41;}
"x42" {return x42;}
"x43" {return x43;}
"x44" {return x44;}
"x45" {return x45;}
"x46" {return x46;}
"x47" {return x47;}
"x48" {return x48;}
"x49" {return x49;}
"x50" {return x50;}
"x51" {return x51;}
"x52" {return x52;}
"x53" {return x53;}
"x54" {return x54;}
"x55" {return x55;}
"x56" {return x56;}
"x57" {return x57;}
"x58" {return x58;}
"x59" {return x59;}
"x60" {return x60;}
"x61" {return x61;}
"x62" {return x62;}
"x63" {return x63;}
"x64" {return x64;}
"x65" {return x65;}
"x66" {return x66;}
"x67" {return x67;}
"x68" {return x68;}
"x69" {return x69;}
"x70" {return x70;}
"x71" {return x71;}
"x72" {return x72;}
"x73" {return x73;}
"x74" {return x74;}
"x75" {return x75;}
"x76" {return x76;}
"x77" {return x77;}
"x78" {return x78;}
"x79" {return x79;}
"x80" {return x80;}
"addi" {return addi; /* i */}
"slti" {return slti;}
"sgei" {return sgei;}
"seqi" {return seqi;}
"snei" {return snei;}
"unop" {return unop;}
"diop" {return diop;}
"slli" {return slli;}
"srli" {return srli;}
"sll" {return sll;}
"srl" {return srl;}
"add" {return add;}
"sub" {return sub;}
"slt" {return slt;}
"sge" {return sge;}
"seq" {return seq;}
"sne" {return sne;}
"lui" {return lui;}
"auipc" {return auipc;}
"jal" {return jal;}
"jalr" {return jalr;}
"beq" {return beq;}
"bne" {return bne;}
"blt" {return blt;}
"bge" {return bge;}
"ld" {return ld;}
"st" {return st;}
"ecall" {return ecall;}
"ebreak" {return ebreak;}
"pcall" {return pcall;}
"fence" {return fence;}
"nop" {return nop; /* meta */}
"mv" {return mv;}
"li" {return li;}
"la" {return la;}
"mul" {return mul; /* m */}
"div" {return diV;}
"rem" {return rem;}
"stt" {return stt; /* a */}
"cst" {return cst;}
"ent" {return ent;}
"cat" {return cat;}
"csrrw" {return csrrw; /* Zcsr */}
"csrrs" {return csrrs;}
"csrrc" {return csrrc;}
"//".* {/* skip line comments */}
"/*" {BEGIN(SC_COMMENT);}
<SC_COMMENT>{
"/*" {++parser->comment_nesting;}
"*"+"/" {
if (parser->comment_nesting)
--parser->comment_nesting;
else
BEGIN(INITIAL);
}
"*"+ {}
[^/*\n]+ {}
[/] {}
\n {}
}
{id} {
yylval->str = yytext;
return id;
}
"(" {return LPAREN;}
")" {return RPAREN;}
"," {return COMMA;}
[[:space:]]+ {/* skip whitespace */}
. {
struct src_issue issue;
issue.loc = to_src_loc(yylloc);
issue.fctx.fbuf = parser->buf;
issue.fctx.fname = parser->fname;
src_issue(issue, "unexpected token: %s", yytext);
parser->failed = true;
}
%%
|