Skip to content

Latest commit

 

History

History
231 lines (205 loc) · 7.36 KB

mojoshader_lexer.re

File metadata and controls

231 lines (205 loc) · 7.36 KB
 
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
/**
* MojoShader; generate shader programs from bytecode of compiled
* Direct3D shaders.
*
* Please see the file LICENSE.txt in the source's root directory.
*
* This file written by Ryan C. Gordon.
*/
// This was originally based on examples/pp-c.re from re2c: http://re2c.org/
// re2c is public domain code.
//
// You build mojoshader_lexer_preprocessor.c from the .re file with re2c...
// re2c -is -o mojoshader_lexer_preprocessor.c mojoshader_lexer_preprocessor.re
//
// Changes to the lexer are done to the .re file, not the C code!
//
// Please note that this isn't a perfect C lexer, since it is used for both
// HLSL and shader assembly language, and follows the quirks of Microsoft's
// tools.
#define __MOJOSHADER_INTERNAL__ 1
#include "mojoshader_internal.h"
typedef unsigned char uchar;
Feb 17, 2009
Feb 17, 2009
27
/*!max:re2c */
Feb 18, 2009
Feb 18, 2009
28
#define RET(t) do { return update_state(s, eoi, cursor, token, t); } while (0)
29
30
31
32
#define YYCTYPE uchar
#define YYCURSOR cursor
#define YYLIMIT limit
#define YYMARKER s->lexer_marker
Feb 17, 2009
Feb 17, 2009
33
#define YYFILL(n) { if ((n) == 1) { cursor = sentinel; limit = cursor + YYMAXFILL; eoi = 1; } }
Feb 17, 2009
Feb 17, 2009
35
36
static uchar sentinel[YYMAXFILL];
Feb 18, 2009
Feb 18, 2009
37
38
static Token update_state(IncludeState *s, int eoi, const uchar *cur,
const uchar *tok, const Token val)
Feb 17, 2009
Feb 17, 2009
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
if (eoi)
{
s->bytes_left = 0;
s->source = (const char *) s->source_base + s->orig_length;
if ( (tok >= sentinel) && (tok < (sentinel+YYMAXFILL)) )
s->token = s->source;
else
s->token = (const char *) tok;
} // if
else
{
s->bytes_left -= (unsigned int) (cur - ((const uchar *) s->source));
s->source = (const char *) cur;
s->token = (const char *) tok;
} // else
Feb 18, 2009
Feb 18, 2009
55
s->tokenlen = (unsigned int) (s->source - s->token);
Feb 18, 2009
Feb 18, 2009
56
57
s->tokenval = val;
return val;
58
59
} // update_state
Feb 18, 2009
Feb 18, 2009
60
Token preprocessor_lexer(IncludeState *s)
61
62
63
{
const uchar *cursor = (const uchar *) s->source;
const uchar *token;
Feb 13, 2009
Feb 13, 2009
64
const uchar *matchptr;
65
const uchar *limit = cursor + s->bytes_left;
Feb 17, 2009
Feb 17, 2009
66
int eoi = 0;
Feb 12, 2009
Feb 12, 2009
67
int saw_newline = 0;
68
69
scanner_loop:
Feb 17, 2009
Feb 17, 2009
70
if (YYLIMIT == YYCURSOR) YYFILL(1);
71
72
73
token = cursor;
/*!re2c
Feb 13, 2009
Feb 13, 2009
74
ANY = [\000-\377];
Feb 13, 2009
Feb 13, 2009
75
ANYLEGAL = [a-zA-Z0-9_/'*=+%^&|!#<>()[{}.,~^:;? \t\v\f\r\n\-\]\\];
76
77
78
79
80
81
82
83
84
O = [0-7];
D = [0-9];
L = [a-zA-Z_];
H = [a-fA-F0-9];
E = [Ee] [+-]? D+;
FS = [fFlL];
IS = [uUlL]*;
ESC = [\\] ([abfnrtv?'"\\] | "x" H+ | O+);
PP = "#" [ \t]*;
Feb 13, 2009
Feb 13, 2009
85
NEWLINE = ("\r\n" | "\r" | "\n");
86
87
88
89
WHITESPACE = [ \t\v\f]+;
*/
/*!re2c
Feb 15, 2009
Feb 15, 2009
90
91
"\\" [ \t\v\f]* NEWLINE { s->line++; goto scanner_loop; }
92
93
94
95
96
97
"/*" { goto multilinecomment; }
"//" { goto singlelinecomment; }
L (L|D)* { RET(TOKEN_IDENTIFIER); }
("0" [xX] H+ IS?) | ("0" D+ IS?) | (D+ IS?) |
Feb 13, 2009
Feb 13, 2009
98
(['] (ESC|ANY\[\r\n\\'])* ['])
99
100
101
102
103
{ RET(TOKEN_INT_LITERAL); }
(D+ E FS?) | (D* "." D+ E? FS?) | (D+ "." D* E? FS?)
{ RET(TOKEN_FLOAT_LITERAL); }
Feb 13, 2009
Feb 13, 2009
104
(["] (ESC|ANY\[\r\n\\"])* ["])
105
{ RET(TOKEN_STRING_LITERAL); }
Feb 15, 2009
Feb 15, 2009
106
Feb 12, 2009
Feb 12, 2009
107
108
109
110
111
112
113
114
115
116
117
118
">>=" { RET(TOKEN_RSHIFTASSIGN); }
"<<=" { RET(TOKEN_LSHIFTASSIGN); }
"+=" { RET(TOKEN_ADDASSIGN); }
"-=" { RET(TOKEN_SUBASSIGN); }
"*=" { RET(TOKEN_MULTASSIGN); }
"/=" { RET(TOKEN_DIVASSIGN); }
"%=" { RET(TOKEN_MODASSIGN); }
"^=" { RET(TOKEN_XORASSIGN); }
"&=" { RET(TOKEN_ANDASSIGN); }
"|=" { RET(TOKEN_ORASSIGN); }
"++" { RET(TOKEN_INCREMENT); }
"--" { RET(TOKEN_DECREMENT); }
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
">>" { RET(TOKEN_RSHIFT); }
"<<" { RET(TOKEN_LSHIFT); }
"&&" { RET(TOKEN_ANDAND); }
"||" { RET(TOKEN_OROR); }
"<=" { RET(TOKEN_LEQ); }
">=" { RET(TOKEN_GEQ); }
"==" { RET(TOKEN_EQL); }
"!=" { RET(TOKEN_NEQ); }
"##" { RET(TOKEN_HASHHASH); }
"(" { RET('('); }
")" { RET(')'); }
"[" { RET('['); }
"]" { RET(']'); }
"." { RET('.'); }
"," { RET(','); }
"&" { RET('&'); }
"!" { RET('!'); }
"~" { RET('~'); }
"-" { RET('-'); }
"+" { RET('+'); }
"*" { RET('*'); }
"/" { RET('/'); }
"%" { RET('%'); }
"<" { RET('<'); }
">" { RET('>'); }
"^" { RET('^'); }
"|" { RET('|'); }
":" { RET(':'); }
";" { RET(';'); }
"{" { RET('{'); }
"}" { RET('}'); }
"=" { RET('='); }
"?" { RET('?'); }
Feb 17, 2009
Feb 17, 2009
153
154
"\000" { if (eoi) { RET(TOKEN_EOI); } goto bad_chars; }
155
156
157
158
159
160
161
162
163
164
165
166
PP "include" { RET(TOKEN_PP_INCLUDE); }
PP "line" { RET(TOKEN_PP_LINE); }
PP "define" { RET(TOKEN_PP_DEFINE); }
PP "undef" { RET(TOKEN_PP_UNDEF); }
PP "if" { RET(TOKEN_PP_IF); }
PP "ifdef" { RET(TOKEN_PP_IFDEF); }
PP "ifndef" { RET(TOKEN_PP_IFNDEF); }
PP "else" { RET(TOKEN_PP_ELSE); }
PP "elif" { RET(TOKEN_PP_ELIF); }
PP "endif" { RET(TOKEN_PP_ENDIF); }
PP "error" { RET(TOKEN_PP_ERROR); }
Feb 17, 2009
Feb 17, 2009
167
WHITESPACE { if (s->report_whitespace) RET(' '); goto scanner_loop; }
Feb 12, 2009
Feb 12, 2009
168
NEWLINE { s->line++; RET('\n'); }
Feb 13, 2009
Feb 13, 2009
169
ANY { goto bad_chars; }
170
171
172
*/
multilinecomment:
Feb 17, 2009
Feb 17, 2009
173
if (YYLIMIT == YYCURSOR) YYFILL(1);
Feb 13, 2009
Feb 13, 2009
174
matchptr = cursor;
175
176
// The "*\/" is just to avoid screwing up text editor syntax highlighting.
/*!re2c
Feb 12, 2009
Feb 12, 2009
177
178
179
"*\/" {
if (saw_newline)
RET('\n');
Feb 17, 2009
Feb 17, 2009
180
181
else if (s->report_whitespace)
RET(' ');
Feb 12, 2009
Feb 12, 2009
182
183
184
185
goto scanner_loop;
}
NEWLINE {
s->line++;
Feb 13, 2009
Feb 13, 2009
186
token = matchptr;
Feb 12, 2009
Feb 12, 2009
187
188
189
saw_newline = 1;
goto multilinecomment;
}
Feb 17, 2009
Feb 17, 2009
190
191
192
193
194
"\000" {
if (eoi)
RET(TOKEN_INCOMPLETE_COMMENT);
goto multilinecomment;
}
Feb 13, 2009
Feb 13, 2009
195
ANY { goto multilinecomment; }
196
197
198
*/
singlelinecomment:
Feb 17, 2009
Feb 17, 2009
199
if (YYLIMIT == YYCURSOR) YYFILL(1);
Feb 13, 2009
Feb 13, 2009
200
matchptr = cursor;
201
/*!re2c
Feb 13, 2009
Feb 13, 2009
202
NEWLINE { s->line++; token = matchptr; RET('\n'); }
Feb 17, 2009
Feb 17, 2009
203
"\000" { if (eoi) { RET(TOKEN_EOI); } goto singlelinecomment; }
Feb 13, 2009
Feb 13, 2009
204
ANY { goto singlelinecomment; }
205
206
207
*/
bad_chars:
Feb 17, 2009
Feb 17, 2009
208
if (YYLIMIT == YYCURSOR) YYFILL(1);
209
/*!re2c
Feb 13, 2009
Feb 13, 2009
210
ANYLEGAL { cursor--; RET(TOKEN_BAD_CHARS); }
Feb 17, 2009
Feb 17, 2009
211
212
213
214
215
216
217
218
219
220
221
222
"\000" {
if (eoi)
{
assert( !((token >= sentinel) &&
(token < sentinel+YYMAXFILL)) );
eoi = 0;
cursor = (uchar *) s->source_base + s->orig_length;
RET(TOKEN_BAD_CHARS); // next call will be EOI.
}
goto bad_chars;
}
Feb 13, 2009
Feb 13, 2009
223
ANY { goto bad_chars; }
224
225
226
227
*/
assert(0 && "Shouldn't hit this code");
RET(TOKEN_UNKNOWN);
Feb 18, 2009
Feb 18, 2009
228
} // preprocessor_lexer
229
230
// end of mojoshader_lexer_preprocessor.re (or .c) ...