blob: bfc503edf646207a6962d57345b9ba62ddea386b [file] [log] [blame]
alokp@chromium.org4e4b8072011-08-07 05:36:04 +00001/*
2//
Jamie Madill88f6e942014-02-19 10:27:53 -05003// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
alokp@chromium.org4e4b8072011-08-07 05:36:04 +00004// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8This file contains the Lex specification for GLSL ES preprocessor.
9Based on Microsoft Visual Studio 2010 Preprocessor Grammar:
10http://msdn.microsoft.com/en-us/library/2scxys89.aspx
11
12IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh.
13*/
14
15%top{
16//
Jamie Madill88f6e942014-02-19 10:27:53 -050017// Copyright (c) 2011-2014 The ANGLE Project Authors. All rights reserved.
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000018// Use of this source code is governed by a BSD-style license that can be
19// found in the LICENSE file.
20//
21
22// This file is auto-generated by generate_parser.sh. DO NOT EDIT!
23}
24
25%{
alokp@chromium.org04d7d222012-05-16 19:24:07 +000026#include "Tokenizer.h"
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000027
daniel@transgaming.comb3077d02013-01-11 04:12:09 +000028#include "DiagnosticsBase.h"
alokp@chromium.orgd089d112012-04-13 17:05:12 +000029#include "Token.h"
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000030
maxvujovic@gmail.comc6b3b3c2012-06-27 22:49:39 +000031#if defined(__GNUC__)
32// Triggered by the auto-generated yy_fatal_error function.
33#pragma GCC diagnostic ignored "-Wmissing-noreturn"
Minmin Gong794e0002015-04-07 18:31:54 -070034#elif defined(_MSC_VER)
35#pragma warning(disable: 4244)
maxvujovic@gmail.comc6b3b3c2012-06-27 22:49:39 +000036#endif
37
alokp@chromium.org4b2a5222012-04-03 17:19:42 +000038typedef std::string YYSTYPE;
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000039typedef pp::SourceLocation YYLTYPE;
alokp@chromium.org4b2a5222012-04-03 17:19:42 +000040
alokp@chromium.org98eec912012-05-01 10:04:08 +000041// Use the unused yycolumn variable to track file (string) number.
42#define yyfileno yycolumn
43
alokp@chromium.org04d7d222012-05-16 19:24:07 +000044#define YY_USER_INIT \
45 do { \
46 yyfileno = 0; \
47 yylineno = 1; \
48 yyextra->leadingSpace = false; \
49 yyextra->lineStart = true; \
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000050 } while(0);
alokp@chromium.orgb81c4012011-08-21 06:53:11 +000051
alokp@chromium.org19d7aa62012-05-31 17:34:05 +000052#define YY_USER_ACTION \
53 do \
54 { \
55 pp::Input* input = &yyextra->input; \
56 pp::Input::Location* scanLoc = &yyextra->scanLoc; \
57 while ((scanLoc->sIndex < input->count()) && \
58 (scanLoc->cIndex >= input->length(scanLoc->sIndex))) \
59 { \
60 scanLoc->cIndex -= input->length(scanLoc->sIndex++); \
61 ++yyfileno; yylineno = 1; \
62 } \
63 yylloc->file = yyfileno; \
64 yylloc->line = yylineno; \
65 scanLoc->cIndex += yyleng; \
alokp@chromium.org98eec912012-05-01 10:04:08 +000066 } while(0);
67
68#define YY_INPUT(buf, result, maxSize) \
alokp@chromium.org30a487c2012-05-02 17:30:46 +000069 result = yyextra->input.read(buf, maxSize);
alokp@chromium.org128d9192012-04-26 22:39:21 +000070
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000071%}
72
alokp@chromium.org98eec912012-05-01 10:04:08 +000073%option noyywrap nounput never-interactive
alokp@chromium.orgd08bb0c2012-04-23 19:27:13 +000074%option reentrant bison-bridge bison-locations
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000075%option prefix="pp"
alokp@chromium.org04d7d222012-05-16 19:24:07 +000076%option extra-type="pp::Tokenizer::Context*"
alokp@chromium.org85f2b2c2012-04-25 06:06:33 +000077%x COMMENT
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000078
alokp@chromium.org85f2b2c2012-04-25 06:06:33 +000079NEWLINE \n|\r|\r\n
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000080IDENTIFIER [_a-zA-Z][_a-zA-Z0-9]*
81PUNCTUATOR [][<>(){}.+-/*%^|&~=!:;,?]
82
shannonwoods@chromium.orgc8100b82013-05-30 00:20:34 +000083DECIMAL_CONSTANT [1-9][0-9]*[uU]?
84OCTAL_CONSTANT 0[0-7]*[uU]?
85HEXADECIMAL_CONSTANT 0[xX][0-9a-fA-F]+[uU]?
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000086
alokp@chromium.orgb81c4012011-08-21 06:53:11 +000087DIGIT [0-9]
88EXPONENT_PART [eE][+-]?{DIGIT}+
89FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".")
90
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000091%%
92
alokp@chromium.org85f2b2c2012-04-25 06:06:33 +000093 /* Line comment */
94"//"[^\r\n]*
95
96 /* Block comment */
alokp@chromium.orga11a6ab2012-04-27 10:00:38 +000097 /* Line breaks are just counted - not returned. */
98 /* The comment is replaced by a single space. */
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000099"/*" { BEGIN(COMMENT); }
alokp@chromium.orga11a6ab2012-04-27 10:00:38 +0000100<COMMENT>[^*\r\n]+
101<COMMENT>"*"
alokp@chromium.org2c958ee2012-05-17 20:35:42 +0000102<COMMENT>{NEWLINE} { ++yylineno; }
alokp@chromium.org2c958ee2012-05-17 20:35:42 +0000103<COMMENT>"*/" {
104 yyextra->leadingSpace = true;
105 BEGIN(INITIAL);
106}
alokp@chromium.org85f2b2c2012-04-25 06:06:33 +0000107
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000108# {
109 // # is only valid at start of line for preprocessor directives.
alokp@chromium.org432d6fc2012-06-27 22:13:21 +0000110 yylval->assign(1, yytext[0]);
111 return yyextra->lineStart ? pp::Token::PP_HASH : pp::Token::PP_OTHER;
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000112}
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000113
114{IDENTIFIER} {
alokp@chromium.org4b2a5222012-04-03 17:19:42 +0000115 yylval->assign(yytext, yyleng);
116 return pp::Token::IDENTIFIER;
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000117}
118
shannonwoods@chromium.org3f83e292013-05-30 00:21:34 +0000119({DECIMAL_CONSTANT}[uU]?)|({OCTAL_CONSTANT}[uU]?)|({HEXADECIMAL_CONSTANT}[uU]?) {
alokp@chromium.org4b2a5222012-04-03 17:19:42 +0000120 yylval->assign(yytext, yyleng);
121 return pp::Token::CONST_INT;
alokp@chromium.orgb81c4012011-08-21 06:53:11 +0000122}
123
shannonwoods@chromium.org2a5436f2013-05-30 00:21:41 +0000124({DIGIT}+{EXPONENT_PART}[fF]?)|({FRACTIONAL_CONSTANT}{EXPONENT_PART}?[fF]?) {
alokp@chromium.org4b2a5222012-04-03 17:19:42 +0000125 yylval->assign(yytext, yyleng);
126 return pp::Token::CONST_FLOAT;
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000127}
128
alokp@chromium.org78a35192012-04-19 17:16:26 +0000129 /* Anything that starts with a {DIGIT} or .{DIGIT} must be a number. */
130 /* Rule to catch all invalid integers and floats. */
131({DIGIT}+[_a-zA-Z0-9.]*)|("."{DIGIT}+[_a-zA-Z0-9.]*) {
alokp@chromium.org432d6fc2012-06-27 22:13:21 +0000132 yylval->assign(yytext, yyleng);
133 return pp::Token::PP_NUMBER;
alokp@chromium.org78a35192012-04-19 17:16:26 +0000134}
135
alokp@chromium.org07d921d2012-05-22 20:22:08 +0000136"++" {
137 yylval->assign(yytext, yyleng);
138 return pp::Token::OP_INC;
139}
140"--" {
141 yylval->assign(yytext, yyleng);
142 return pp::Token::OP_DEC;
143}
144"<<" {
145 yylval->assign(yytext, yyleng);
146 return pp::Token::OP_LEFT;
147}
148">>" {
149 yylval->assign(yytext, yyleng);
150 return pp::Token::OP_RIGHT;
151}
152"<=" {
153 yylval->assign(yytext, yyleng);
154 return pp::Token::OP_LE;
155}
156">=" {
157 yylval->assign(yytext, yyleng);
158 return pp::Token::OP_GE;
159}
160"==" {
161 yylval->assign(yytext, yyleng);
162 return pp::Token::OP_EQ;
163}
164"!=" {
165 yylval->assign(yytext, yyleng);
166 return pp::Token::OP_NE;
167}
168"&&" {
169 yylval->assign(yytext, yyleng);
170 return pp::Token::OP_AND;
171}
172"^^" {
173 yylval->assign(yytext, yyleng);
174 return pp::Token::OP_XOR;
175}
176"||" {
177 yylval->assign(yytext, yyleng);
178 return pp::Token::OP_OR;
179}
180"+=" {
181 yylval->assign(yytext, yyleng);
182 return pp::Token::OP_ADD_ASSIGN;
183}
184"-=" {
185 yylval->assign(yytext, yyleng);
186 return pp::Token::OP_SUB_ASSIGN;
187}
188"*=" {
189 yylval->assign(yytext, yyleng);
190 return pp::Token::OP_MUL_ASSIGN;
191}
192"/=" {
193 yylval->assign(yytext, yyleng);
194 return pp::Token::OP_DIV_ASSIGN;
195}
196"%=" {
197 yylval->assign(yytext, yyleng);
198 return pp::Token::OP_MOD_ASSIGN;
199}
200"<<=" {
201 yylval->assign(yytext, yyleng);
202 return pp::Token::OP_LEFT_ASSIGN;
203}
204">>=" {
205 yylval->assign(yytext, yyleng);
206 return pp::Token::OP_RIGHT_ASSIGN;
207}
208"&=" {
209 yylval->assign(yytext, yyleng);
210 return pp::Token::OP_AND_ASSIGN;
211}
212"^=" {
213 yylval->assign(yytext, yyleng);
214 return pp::Token::OP_XOR_ASSIGN;
215}
216"|=" {
217 yylval->assign(yytext, yyleng);
218 return pp::Token::OP_OR_ASSIGN;
219}
alokp@chromium.org3f990c42012-04-03 19:50:35 +0000220
alokp@chromium.org07d921d2012-05-22 20:22:08 +0000221{PUNCTUATOR} {
222 yylval->assign(1, yytext[0]);
223 return yytext[0];
224}
225
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000226[ \t\v\f]+ { yyextra->leadingSpace = true; }
alokp@chromium.orgd08bb0c2012-04-23 19:27:13 +0000227
228{NEWLINE} {
229 ++yylineno;
alokp@chromium.org07d921d2012-05-22 20:22:08 +0000230 yylval->assign(1, '\n');
alokp@chromium.orgd08bb0c2012-04-23 19:27:13 +0000231 return '\n';
232}
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000233
shannon.woods%transgaming.com@gtempaccount.combcde56f2013-04-13 03:32:12 +0000234\\{NEWLINE} { ++yylineno; }
235
alokp@chromium.org78a35192012-04-19 17:16:26 +0000236. {
alokp@chromium.org432d6fc2012-06-27 22:13:21 +0000237 yylval->assign(1, yytext[0]);
238 return pp::Token::PP_OTHER;
alokp@chromium.org78a35192012-04-19 17:16:26 +0000239}
240
alokp@chromium.org07d921d2012-05-22 20:22:08 +0000241<*><<EOF>> {
alokp@chromium.org19d7aa62012-05-31 17:34:05 +0000242 // YY_USER_ACTION is not invoked for handling EOF.
243 // Set the location for EOF token manually.
244 pp::Input* input = &yyextra->input;
245 pp::Input::Location* scanLoc = &yyextra->scanLoc;
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000246 yy_size_t sIndexMax = input->count() ? input->count() - 1 : 0;
alokp@chromium.org19d7aa62012-05-31 17:34:05 +0000247 if (scanLoc->sIndex != sIndexMax)
248 {
249 // We can only reach here if there are empty strings at the
250 // end of the input.
251 scanLoc->sIndex = sIndexMax; scanLoc->cIndex = 0;
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000252 // FIXME: this is not 64-bit clean.
253 yyfileno = static_cast<int>(sIndexMax); yylineno = 1;
alokp@chromium.org19d7aa62012-05-31 17:34:05 +0000254 }
255 yylloc->file = yyfileno;
256 yylloc->line = yylineno;
257 yylval->clear();
258
alokp@chromium.org07d921d2012-05-22 20:22:08 +0000259 if (YY_START == COMMENT)
260 {
Jamie Madillc9f140d2014-02-18 15:27:21 -0500261 yyextra->diagnostics->report(pp::Diagnostics::PP_EOF_IN_COMMENT,
alokp@chromium.org07d921d2012-05-22 20:22:08 +0000262 pp::SourceLocation(yyfileno, yylineno),
263 "");
264 }
alokp@chromium.org07d921d2012-05-22 20:22:08 +0000265 yyterminate();
266}
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000267
268%%
269
alokp@chromium.org3a01d1b2011-08-30 05:10:53 +0000270namespace pp {
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000271
Jamie Madill185de882014-12-22 15:17:52 -0500272Tokenizer::Tokenizer(Diagnostics *diagnostics)
273 : mHandle(0),
274 mMaxTokenSize(256)
alokp@chromium.org3a01d1b2011-08-30 05:10:53 +0000275{
alokp@chromium.org2c958ee2012-05-17 20:35:42 +0000276 mContext.diagnostics = diagnostics;
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000277}
278
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000279Tokenizer::~Tokenizer()
280{
281 destroyScanner();
282}
283
Zhenyao Mod526f982014-05-13 14:51:19 -0700284bool Tokenizer::init(size_t count, const char * const string[], const int length[])
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000285{
Zhenyao Mod526f982014-05-13 14:51:19 -0700286 if ((count > 0) && (string == 0))
287 return false;
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000288
289 mContext.input = Input(count, string, length);
290 return initScanner();
291}
292
alokp@chromium.org46aa13d2012-06-15 15:40:27 +0000293void Tokenizer::setFileNumber(int file)
294{
295 // We use column number as file number.
296 // See macro yyfileno.
297 yyset_column(file, mHandle);
298}
299
300void Tokenizer::setLineNumber(int line)
301{
302 yyset_lineno(line, mHandle);
303}
304
Jamie Madill5508f392014-02-20 13:31:36 -0500305void Tokenizer::setMaxTokenSize(size_t maxTokenSize)
306{
307 mMaxTokenSize = maxTokenSize;
308}
309
Zhenyao Mod526f982014-05-13 14:51:19 -0700310void Tokenizer::lex(Token *token)
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000311{
alokp@chromium.org5b6a68e2012-06-28 20:29:13 +0000312 token->type = yylex(&token->text, &token->location, mHandle);
Jamie Madill5508f392014-02-20 13:31:36 -0500313 if (token->text.size() > mMaxTokenSize)
alokp@chromium.orgc022c3a2012-07-09 15:56:42 +0000314 {
Jamie Madillc9f140d2014-02-18 15:27:21 -0500315 mContext.diagnostics->report(Diagnostics::PP_TOKEN_TOO_LONG,
alokp@chromium.orgc022c3a2012-07-09 15:56:42 +0000316 token->location, token->text);
Jamie Madill5508f392014-02-20 13:31:36 -0500317 token->text.erase(mMaxTokenSize);
alokp@chromium.orgc022c3a2012-07-09 15:56:42 +0000318 }
319
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +0000320 token->flags = 0;
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000321
alokp@chromium.org19d7aa62012-05-31 17:34:05 +0000322 token->setAtStartOfLine(mContext.lineStart);
323 mContext.lineStart = token->type == '\n';
324
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000325 token->setHasLeadingSpace(mContext.leadingSpace);
326 mContext.leadingSpace = false;
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000327}
328
329bool Tokenizer::initScanner()
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000330{
alokp@chromium.org98eec912012-05-01 10:04:08 +0000331 if ((mHandle == NULL) && yylex_init_extra(&mContext, &mHandle))
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000332 return false;
333
alokp@chromium.org98eec912012-05-01 10:04:08 +0000334 yyrestart(0, mHandle);
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000335 return true;
336}
337
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000338void Tokenizer::destroyScanner()
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000339{
alokp@chromium.org01fd4312012-03-30 21:33:30 +0000340 if (mHandle == NULL)
341 return;
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000342
alokp@chromium.org01fd4312012-03-30 21:33:30 +0000343 yylex_destroy(mHandle);
344 mHandle = NULL;
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000345}
346
347} // namespace pp
348