blob: ea1e0526f86eb39ed794807a644aa0ebfe0fa136 (
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
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
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
|
%{
#include <stdio.h>
#include "sass_parser.hpp"
#include <string.h>
/* Not sure if this is needed*/
#define YY_NEVER_INTERACTIVE 1
#define yylval sass_lval
void sass_error(const char*);
%}
%option noyywrap
%option yylineno
/*Regular expresions go here*/
alpha [a-zA-Z]
numeric [0-9]
hexalpha [A-Fa-f]
alphanum ({alpha}|{numeric})
hexdigit ({numeric}|{hexalpha})
whitespace [ \t]
newline [\n]
anycharbutnewline [^\n]
anychar ({newline}|{anycharbutnewline})
pipe \|
identifier ({alpha}({alphanum}|["_$"])*)|([_$%]({alphanum}|["_$"])+)
hexliteral 0[xX]{hexdigit}+U?
octliteral 0[0-7]+U?
binliteral 0[bB][01]+U?
decliteral ([1-9][0-9]*U?)|0U?
fltliteral [0-9]+\.[0-9]+
%%
/*Translation rules*/
/*Compiler directives*/
/*constant memory directives*/
/*guard predicate*/
/*label*/
"[" yylval.string_value = strdup(yytext); return OSQBRACKET;
"]" yylval.string_value = strdup(yytext); return CSQBRACKET;
/*base instructions*/
"BAR.ARV.WAIT b0, 0xfff" yylval.string_value = strdup(yytext); return BAR;
ADA yylval.string_value = strdup(yytext); return ADA;
BRA yylval.string_value = strdup(yytext); return BRA;
CAL yylval.string_value = strdup(yytext); return CAL;
COS yylval.string_value = strdup(yytext); return COS;
DADD yylval.string_value = strdup(yytext); return DADD;
DFMA yylval.string_value = strdup(yytext); return DFMA;
DMUL yylval.string_value = strdup(yytext); return DMUL;
EX2 yylval.string_value = strdup(yytext); return EX2;
F2F yylval.string_value = strdup(yytext); return F2F;
F2I yylval.string_value = strdup(yytext); return F2I;
FADD yylval.string_value = strdup(yytext); return FADD;
FADD32 yylval.string_value = strdup(yytext); return FADD32;
FADD32I yylval.string_value = strdup(yytext); return FADD32I;
FMAD yylval.string_value = strdup(yytext); return FMAD;
FMAD32I yylval.string_value = strdup(yytext); return FMAD32I;
FMUL yylval.string_value = strdup(yytext); return FMUL;
FMUL32 yylval.string_value = strdup(yytext); return FMUL32;
FMUL32I yylval.string_value = strdup(yytext); return FMUL32I;
FSET yylval.string_value = strdup(yytext); return FSET;
G2R yylval.string_value = strdup(yytext); return G2R;
GLD yylval.string_value = strdup(yytext); return GLD;
GST yylval.string_value = strdup(yytext); return GST;
I2F yylval.string_value = strdup(yytext); return I2F;
I2I yylval.string_value = strdup(yytext); return I2I;
S2R yylval.string_value = strdup(yytext); return S2R;
STS yylval.string_value = strdup(yytext); return STS;
LD yylval.string_value = strdup(yytext); return SASS_LD;
ST yylval.string_value = strdup(yytext); return SASS_ST;
IADD yylval.string_value = strdup(yytext); return IADD;
IADD32 yylval.string_value = strdup(yytext); return IADD32;
IADD32I yylval.string_value = strdup(yytext); return IADD32I;
IMAD yylval.string_value = strdup(yytext); return IMAD;
IMAD\.U24 yylval.string_value = strdup(yytext); return IMAD24;
IMAD\.S24 yylval.string_value = strdup(yytext); return IMAD24;
IMAD32 yylval.string_value = strdup(yytext); return IMAD32;
IMAD32I yylval.string_value = strdup(yytext); return IMAD32I;
IMUL yylval.string_value = strdup(yytext); return IMUL;
IMUL\.U24\.U24 yylval.string_value = strdup(yytext); return IMUL24;
IMUL\.S24\.S24 yylval.string_value = strdup(yytext); return IMULS24;
IMUL32 yylval.string_value = strdup(yytext); return IMUL32;
IMUL32\.S24\.S24 yylval.string_value = strdup(yytext); return IMUL32S24;
IMUL32\.U24\.U24 yylval.string_value = strdup(yytext); return IMUL32U24;
IMUL32I\.S24\.S24 yylval.string_value = strdup(yytext); return IMUL32IS24;
IMUL32I yylval.string_value = strdup(yytext); return IMUL32I;
IMUL32I\.U24\.U24 yylval.string_value = strdup(yytext); return IMUL32I24;
ISET yylval.string_value = strdup(yytext); return ISET;
LG2 yylval.string_value = strdup(yytext); return LG2;
LLD yylval.string_value = strdup(yytext); return LLD;
LOP\.AND yylval.string_value = strdup(yytext); return AND;
LOP\.OR yylval.string_value = strdup(yytext); return OR;
LOP\.PASS_B yylval.string_value = strdup(yytext); return NOT;
LOP\.XOR yylval.string_value = strdup(yytext); return XOR;
LOP\.S\.AND yylval.string_value = strdup(yytext); return ANDS;
LOP\.S\.OR yylval.string_value = strdup(yytext); return ORS;
LOP\.S\.PASS_B yylval.string_value = strdup(yytext); return NOTS;
LOP\.S\.XOR yylval.string_value = strdup(yytext); return XORS;
LST yylval.string_value = strdup(yytext); return LST;
MOV yylval.string_value = strdup(yytext); return MOV;
MOV32 yylval.string_value = strdup(yytext); return MOV32;
MVC yylval.string_value = strdup(yytext); return MVC;
MVI yylval.string_value = strdup(yytext); return MVI;
NOP yylval.string_value = strdup(yytext); return NOP;
R2A yylval.string_value = strdup(yytext); return R2A;
R2G yylval.string_value = strdup(yytext); return R2G;
R2G.U16.U8 yylval.string_value = strdup(yytext); return R2GU16U8;
RCP yylval.string_value = strdup(yytext); return RCP;
RCP32 yylval.string_value = strdup(yytext); return RCP32;
RET yylval.string_value = strdup(yytext); return RET;
RRO yylval.string_value = strdup(yytext); return RRO;
RSQ yylval.string_value = strdup(yytext); return RSQ;
SIN yylval.string_value = strdup(yytext); return SIN;
SHL yylval.string_value = strdup(yytext); return SHL;
SHR yylval.string_value = strdup(yytext); return SHR;
SSY yylval.string_value = strdup(yytext); return SSY;
BAR yylval.string_value = strdup(yytext); return BAR;
LDS yylval.string_value = strdup(yytext); return LDS;
IMIN yylval.string_value = strdup(yytext); return IMIN;
IMAX yylval.string_value = strdup(yytext); return IMAX;
FMAX yylval.string_value = strdup(yytext); return FMAX;
FMIN yylval.string_value = strdup(yytext); return FMIN;
C2R yylval.string_value = strdup(yytext); return C2R;
R2C yylval.string_value = strdup(yytext); return R2C;
A2R yylval.string_value = strdup(yytext); return A2R;
TEX yylval.string_value = strdup(yytext); return TEX;
TEX32 yylval.string_value = strdup(yytext); return TEX32;
EXIT yylval.string_value = strdup(yytext); return EXIT;
GRED yylval.string_value = strdup(yytext); return GRED;
GATOM yylval.string_value = strdup(yytext); return GATOM;
PBK yylval.string_value = strdup(yytext); return PBK;
BRK yylval.string_value = strdup(yytext); return BRK;
/*instruction modifiers*/
EQ yylval.string_value = strdup(yytext); return EQ;
EQU yylval.string_value = strdup(yytext); return EQU;
GE yylval.string_value = strdup(yytext); return GE;
GEU yylval.string_value = strdup(yytext); return GEU;
GT yylval.string_value = strdup(yytext); return GT;
GTU yylval.string_value = strdup(yytext); return GTU;
LE yylval.string_value = strdup(yytext); return LE;
LEU yylval.string_value = strdup(yytext); return LEU;
LT yylval.string_value = strdup(yytext); return LT;
LTU yylval.string_value = strdup(yytext); return LTU;
NE yylval.string_value = strdup(yytext); return NE;
NEU yylval.string_value = strdup(yytext); return NEU;
\.BEXT yylval.string_value = strdup(yytext); return DOTBEXT;
\.S yylval.string_value = strdup(yytext); return DOTS;
\.SFU yylval.string_value = strdup(yytext); return DOTSFU;
\.TRUNC yylval.string_value = strdup(yytext); return DOTTRUNC;
\.IR yylval.string_value = strdup(yytext); /*return DOTIR;*/
\.UN yylval.string_value = strdup(yytext); return DOTUN;
\.NODEP yylval.string_value = strdup(yytext); return DOTNODEP;
\.CARRY0 yylval.string_value = strdup(yytext); return DOTCARRY0;
\.SAT yylval.string_value = strdup(yytext);
/* comparison operators */
\.EQ yylval.string_value = strdup(yytext); return DOTEQ;
\.EQU yylval.string_value = strdup(yytext); return DOTEQU;
\.GE yylval.string_value = strdup(yytext); return DOTGE;
\.GEU yylval.string_value = strdup(yytext); return DOTGEU;
\.GT yylval.string_value = strdup(yytext); return DOTGT;
\.GTU yylval.string_value = strdup(yytext); return DOTGTU;
\.LE yylval.string_value = strdup(yytext); return DOTLE;
\.LEU yylval.string_value = strdup(yytext); return DOTLEU;
\.LT yylval.string_value = strdup(yytext); return DOTLT;
\.LTU yylval.string_value = strdup(yytext); return DOTLTU;
\.NE yylval.string_value = strdup(yytext); return DOTNE;
\.NEU yylval.string_value = strdup(yytext); return DOTNEU;
\.NOT_SIGN yylval.string_value = strdup(yytext); return DOTNSF;
\.SIGN yylval.string_value = strdup(yytext); return DOTSF;
\.CARRY yylval.string_value = strdup(yytext); return DOTCARRY;
\.CC yylval.string_value = strdup(yytext); return DOTCC;
\.X yylval.string_value = strdup(yytext); return DOTX;
\.E yylval.string_value = strdup(yytext); return DOTE;
\.RED yylval.string_value = strdup(yytext); return DOTRED;
\.POPC yylval.string_value = strdup(yytext); return DOTPOPC;
/*operand types*/
\.F16 yylval.string_value = strdup(yytext); return DOTF16;
\.F32 yylval.string_value = strdup(yytext); return DOTF32;
\.F64 yylval.string_value = strdup(yytext); return DOTF64;
\.S8 yylval.string_value = strdup(yytext); return DOTS8;
\.S16 yylval.string_value = strdup(yytext); return DOTS16;
\.S32 yylval.string_value = strdup(yytext); return DOTS32;
\.S64 yylval.string_value = strdup(yytext); return DOTS64;
\.S128 yylval.string_value = strdup(yytext); return DOTS128;
\.U8 yylval.string_value = strdup(yytext); return DOTU8;
\.U16 yylval.string_value = strdup(yytext); return DOTU16;
\.U32 yylval.string_value = strdup(yytext); return DOTU32;
\.U24 yylval.string_value = strdup(yytext); return DOTU24;
\.U64 yylval.string_value = strdup(yytext); return DOTU64;
\.HI yylval.string_value = strdup(yytext); return DOTHI;
\.NOINC yylval.string_value = strdup(yytext); return DOTNOINC;
/*geometries*/
/*register operands*/
[\-]?R{numeric}+ yylval.string_value = strdup(yytext); return REGISTER;
[\-]?R{numeric}+L yylval.string_value = strdup(yytext); return REGISTERLO;
[\-]?R{numeric}+H yylval.string_value = strdup(yytext); return REGISTERHI;
A{numeric}+ yylval.string_value = strdup(yytext); return OFFSETREGISTER;
\.C{numeric} yylval.string_value = strdup(yytext); return PREDREGISTER;
"o ["{hexliteral}\] yylval.string_value = strdup(yytext); return PREDREGISTER2;
C{numeric} yylval.string_value = strdup(yytext); return PREDREGISTER3;
"SR_"[^\.; \t]+ yylval.string_value = strdup(yytext); return SREGISTER;
/*tex operand*/
/*vector operands*/
/*special registers*/
/* cuobjdump header */
"Fatbin ptx code:" yylval.string_value = strdup(yytext); return PTXHEADER;
"Fatbin elf code:" yylval.string_value = strdup(yytext); return ELFHEADER;
"================"
"arch = " yylval.string_value = strdup(yytext); return INFOARCHVERSION;
"code version = " yylval.string_value = strdup(yytext); return INFOCODEVERSION_HEADER;
\[{numeric},{numeric}\] yylval.string_value = strdup(yytext); return INFOCODEVERSION;
"producer = " yylval.string_value = strdup(yytext); return INFOPRODUCER;
"host = " yylval.string_value = strdup(yytext); return INFOHOST;
{numeric}{numeric}"bit" yylval.string_value = strdup(yytext); return INFOCOMPILESIZE;
"compile_size = " yylval.string_value = strdup(yytext); return INFOCOMPILESIZE_HEADER;
"identifier = " yylval.string_value = strdup(yytext); return INFOIDENTIFIER;
"code for " yylval.string_value = strdup(yytext); return VERSIONHEADER;
"Function : " yylval.string_value = strdup(yytext); return FUNCTIONHEADER;
"/*"{hexliteral}{whitespace}*"*/" yylval.string_value = strdup(yytext); return INSTHEX;
"." yylval.string_value = strdup(yytext); return DOT;
/*memory location operands*/
[\-]?"|g| ["{hexliteral}"]"".U16"? yylval.string_value = strdup(yytext); return ABSSMEMLOCATION;
[\-]?"|g| [R"{numeric}+\]".U16"? yylval.string_value = strdup(yytext); return ABSSMEMLOCATION;
[\-]?"|g| [A"{numeric}+\+{hexliteral}\]".U16"? yylval.string_value = strdup(yytext); return ABSSMEMLOCATION;
[\-]?"|g| [A"{numeric}+\+\+\+{hexliteral}\]".U16"? yylval.string_value = strdup(yytext); return ABSSMEMLOCATION;
[\-]?"g ["{hexliteral}"]"".U16"? yylval.string_value = strdup(yytext); return SMEMLOCATION;
[\-]?"g [R"{numeric}+\]".U16"? yylval.string_value = strdup(yytext); return SMEMLOCATION;
[\-]?"g [A"{numeric}+\+{hexliteral}\]".U16"? yylval.string_value = strdup(yytext); return SMEMLOCATION;
[\-]?"g [A"{numeric}+\+\+\+{hexliteral}\]".U16"? yylval.string_value = strdup(yytext); return SMEMLOCATION;
[\-]?"global14 ["{hexliteral}"]"".U16"? yylval.string_value = strdup(yytext); return GMEMLOCATION;
[\-]?"global14 [R"{numeric}+\]".U16"? yylval.string_value = strdup(yytext); return GMEMLOCATION;
[\-]?"global14 [A"{numeric}+\+{hexliteral}\]".U16"? yylval.string_value = strdup(yytext); return GMEMLOCATION;
[\-]?"global14 [A"{numeric}+\+\+\+{hexliteral}\]".U16"? yylval.string_value = strdup(yytext); return GMEMLOCATION;
[\-]?"c ["{hexliteral}"] ["{hexliteral}"]"".U16"? yylval.string_value = strdup(yytext); return CMEMLOCATION;
[\-]?"c ["{hexliteral}"] [R"{numeric}+\]".U16"? yylval.string_value = strdup(yytext); return CMEMLOCATION;
[\-]?"c ["{hexliteral}"] [A"{numeric}+\+{hexliteral}\]".U16"? yylval.string_value = strdup(yytext); return CMEMLOCATION;
[\-]?"c ["{hexliteral}"] [A"{numeric}+\+\+\+{hexliteral}\]".U16"? yylval.string_value = strdup(yytext); return CMEMLOCATION;
[\-]?"local ["{hexliteral}"]"".U16"? yylval.string_value = strdup(yytext); return LMEMLOCATION;
[\-]?"local [R"{numeric}+\]".U16"? yylval.string_value = strdup(yytext); return LMEMLOCATION;
[\-]?"local [A"{numeric}+\+{hexliteral}\]".U16"? yylval.string_value = strdup(yytext); return LMEMLOCATION;
[\-]?"local [A"{numeric}+\+\+\+{hexliteral}\]".U16"? yylval.string_value = strdup(yytext); return LMEMLOCATION;
/*identifier + literals*/
{identifier} yylval.string_value = strdup(yytext); return IDENTIFIER;
[\-]?{hexliteral} yylval.string_value = strdup(yytext); return HEXLITERAL; //change to int later?
/*label ends*/
"/*" yylval.string_value = strdup(yytext); return LABELSTART;
"*/" yylval.string_value = strdup(yytext); return LABELEND;
{hexdigit}{hexdigit}{hexdigit}{hexdigit} yylval.string_value = strdup(yytext); return LABEL;
/*braces*/
/*brackets*/
\( yylval.string_value = strdup(yytext); return LEFTBRACKET;
\) yylval.string_value = strdup(yytext); return RIGHTBRACKET;
/* pound sign*/
/* comma*/
"," /*yylval.string_value = strdup(yytext); return COMMA;*/
/* underscore sign*/
/* pipe*/
"|" yylval.string_value = strdup(yytext); return PIPE;
"~" yylval.string_value = strdup(yytext); return TILDE;
/*Need to create to newline tokens*/
{newline}+ return NEWLINE;
/* semicolon */
; return SEMICOLON;
/*discard whitespace*/
{whitespace}+
/*discard comments*/
"//"{anycharbutnewline}*
/*discard dividers*/
"-----"[\-]+
"....."[\.]+
/*reached end of file*/
<<EOF>> return 0;
/*None of the rules matched. Throw error*/
. sass_error("Invalid token");
%%
void sass_error(const char* message)
{
printf(" "); printf(message); printf(" near \""); printf(yytext); printf("\"");
printf(" on line ");
char line[5]; sprintf(line, "%i", yylineno); printf(line);
printf("\n");
exit(1);
}
|