blob: 25c938d608698b4434486e113b2fe8be7105ab76 [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%{
Scott Grahama8975422015-05-01 11:09:12 -070026#if defined(_MSC_VER)
27#pragma warning(disable: 4005)
28#endif
29
alokp@chromium.org04d7d222012-05-16 19:24:07 +000030#include "Tokenizer.h"
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000031
daniel@transgaming.comb3077d02013-01-11 04:12:09 +000032#include "DiagnosticsBase.h"
alokp@chromium.orgd089d112012-04-13 17:05:12 +000033#include "Token.h"
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000034
maxvujovic@gmail.comc6b3b3c2012-06-27 22:49:39 +000035#if defined(__GNUC__)
36// Triggered by the auto-generated yy_fatal_error function.
37#pragma GCC diagnostic ignored "-Wmissing-noreturn"
Minmin Gong794e0002015-04-07 18:31:54 -070038#elif defined(_MSC_VER)
39#pragma warning(disable: 4244)
maxvujovic@gmail.comc6b3b3c2012-06-27 22:49:39 +000040#endif
41
Jamie Madill2dc8bf82015-04-30 15:56:52 -040042// Workaround for flex using the register keyword, deprecated in C++11.
43#ifdef __cplusplus
44#if __cplusplus > 199711L
45#define register
46#endif
47#endif
48
alokp@chromium.org4b2a5222012-04-03 17:19:42 +000049typedef std::string YYSTYPE;
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000050typedef pp::SourceLocation YYLTYPE;
alokp@chromium.org4b2a5222012-04-03 17:19:42 +000051
alokp@chromium.org98eec912012-05-01 10:04:08 +000052// Use the unused yycolumn variable to track file (string) number.
53#define yyfileno yycolumn
54
alokp@chromium.org04d7d222012-05-16 19:24:07 +000055#define YY_USER_INIT \
56 do { \
57 yyfileno = 0; \
58 yylineno = 1; \
59 yyextra->leadingSpace = false; \
60 yyextra->lineStart = true; \
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000061 } while(0);
alokp@chromium.orgb81c4012011-08-21 06:53:11 +000062
alokp@chromium.org19d7aa62012-05-31 17:34:05 +000063#define YY_USER_ACTION \
64 do \
65 { \
66 pp::Input* input = &yyextra->input; \
67 pp::Input::Location* scanLoc = &yyextra->scanLoc; \
68 while ((scanLoc->sIndex < input->count()) && \
69 (scanLoc->cIndex >= input->length(scanLoc->sIndex))) \
70 { \
71 scanLoc->cIndex -= input->length(scanLoc->sIndex++); \
72 ++yyfileno; yylineno = 1; \
73 } \
74 yylloc->file = yyfileno; \
75 yylloc->line = yylineno; \
76 scanLoc->cIndex += yyleng; \
alokp@chromium.org98eec912012-05-01 10:04:08 +000077 } while(0);
78
79#define YY_INPUT(buf, result, maxSize) \
Jamie Madill3b040eb2015-08-17 16:51:33 +000080 result = yyextra->input.read(buf, maxSize);
alokp@chromium.org128d9192012-04-26 22:39:21 +000081
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000082%}
83
alokp@chromium.org98eec912012-05-01 10:04:08 +000084%option noyywrap nounput never-interactive
alokp@chromium.orgd08bb0c2012-04-23 19:27:13 +000085%option reentrant bison-bridge bison-locations
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000086%option prefix="pp"
alokp@chromium.org04d7d222012-05-16 19:24:07 +000087%option extra-type="pp::Tokenizer::Context*"
alokp@chromium.org85f2b2c2012-04-25 06:06:33 +000088%x COMMENT
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000089
alokp@chromium.org85f2b2c2012-04-25 06:06:33 +000090NEWLINE \n|\r|\r\n
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000091IDENTIFIER [_a-zA-Z][_a-zA-Z0-9]*
92PUNCTUATOR [][<>(){}.+-/*%^|&~=!:;,?]
93
shannonwoods@chromium.orgc8100b82013-05-30 00:20:34 +000094DECIMAL_CONSTANT [1-9][0-9]*[uU]?
95OCTAL_CONSTANT 0[0-7]*[uU]?
96HEXADECIMAL_CONSTANT 0[xX][0-9a-fA-F]+[uU]?
alokp@chromium.org4e4b8072011-08-07 05:36:04 +000097
alokp@chromium.orgb81c4012011-08-21 06:53:11 +000098DIGIT [0-9]
99EXPONENT_PART [eE][+-]?{DIGIT}+
100FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".")
101
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000102%%
103
alokp@chromium.org85f2b2c2012-04-25 06:06:33 +0000104 /* Line comment */
105"//"[^\r\n]*
106
107 /* Block comment */
alokp@chromium.orga11a6ab2012-04-27 10:00:38 +0000108 /* Line breaks are just counted - not returned. */
Jamie Madillb96687d2015-04-30 15:56:51 -0400109 /* The comment is replaced by a single space. */
alokp@chromium.org2c958ee2012-05-17 20:35:42 +0000110"/*" { BEGIN(COMMENT); }
alokp@chromium.orga11a6ab2012-04-27 10:00:38 +0000111<COMMENT>[^*\r\n]+
112<COMMENT>"*"
alokp@chromium.org2c958ee2012-05-17 20:35:42 +0000113<COMMENT>{NEWLINE} { ++yylineno; }
alokp@chromium.org2c958ee2012-05-17 20:35:42 +0000114<COMMENT>"*/" {
115 yyextra->leadingSpace = true;
116 BEGIN(INITIAL);
117}
alokp@chromium.org85f2b2c2012-04-25 06:06:33 +0000118
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000119# {
120 // # is only valid at start of line for preprocessor directives.
alokp@chromium.org432d6fc2012-06-27 22:13:21 +0000121 yylval->assign(1, yytext[0]);
122 return yyextra->lineStart ? pp::Token::PP_HASH : pp::Token::PP_OTHER;
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000123}
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000124
125{IDENTIFIER} {
alokp@chromium.org4b2a5222012-04-03 17:19:42 +0000126 yylval->assign(yytext, yyleng);
127 return pp::Token::IDENTIFIER;
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000128}
129
shannonwoods@chromium.org3f83e292013-05-30 00:21:34 +0000130({DECIMAL_CONSTANT}[uU]?)|({OCTAL_CONSTANT}[uU]?)|({HEXADECIMAL_CONSTANT}[uU]?) {
alokp@chromium.org4b2a5222012-04-03 17:19:42 +0000131 yylval->assign(yytext, yyleng);
132 return pp::Token::CONST_INT;
alokp@chromium.orgb81c4012011-08-21 06:53:11 +0000133}
134
shannonwoods@chromium.org2a5436f2013-05-30 00:21:41 +0000135({DIGIT}+{EXPONENT_PART}[fF]?)|({FRACTIONAL_CONSTANT}{EXPONENT_PART}?[fF]?) {
alokp@chromium.org4b2a5222012-04-03 17:19:42 +0000136 yylval->assign(yytext, yyleng);
137 return pp::Token::CONST_FLOAT;
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000138}
139
alokp@chromium.org78a35192012-04-19 17:16:26 +0000140 /* Anything that starts with a {DIGIT} or .{DIGIT} must be a number. */
141 /* Rule to catch all invalid integers and floats. */
142({DIGIT}+[_a-zA-Z0-9.]*)|("."{DIGIT}+[_a-zA-Z0-9.]*) {
alokp@chromium.org432d6fc2012-06-27 22:13:21 +0000143 yylval->assign(yytext, yyleng);
144 return pp::Token::PP_NUMBER;
alokp@chromium.org78a35192012-04-19 17:16:26 +0000145}
146
alokp@chromium.org07d921d2012-05-22 20:22:08 +0000147"++" {
148 yylval->assign(yytext, yyleng);
149 return pp::Token::OP_INC;
150}
151"--" {
152 yylval->assign(yytext, yyleng);
153 return pp::Token::OP_DEC;
154}
155"<<" {
156 yylval->assign(yytext, yyleng);
157 return pp::Token::OP_LEFT;
158}
159">>" {
160 yylval->assign(yytext, yyleng);
161 return pp::Token::OP_RIGHT;
162}
163"<=" {
164 yylval->assign(yytext, yyleng);
165 return pp::Token::OP_LE;
166}
167">=" {
168 yylval->assign(yytext, yyleng);
169 return pp::Token::OP_GE;
170}
171"==" {
172 yylval->assign(yytext, yyleng);
173 return pp::Token::OP_EQ;
174}
175"!=" {
176 yylval->assign(yytext, yyleng);
177 return pp::Token::OP_NE;
178}
179"&&" {
180 yylval->assign(yytext, yyleng);
181 return pp::Token::OP_AND;
182}
183"^^" {
184 yylval->assign(yytext, yyleng);
185 return pp::Token::OP_XOR;
186}
187"||" {
188 yylval->assign(yytext, yyleng);
189 return pp::Token::OP_OR;
190}
191"+=" {
192 yylval->assign(yytext, yyleng);
193 return pp::Token::OP_ADD_ASSIGN;
194}
195"-=" {
196 yylval->assign(yytext, yyleng);
197 return pp::Token::OP_SUB_ASSIGN;
198}
199"*=" {
200 yylval->assign(yytext, yyleng);
201 return pp::Token::OP_MUL_ASSIGN;
202}
203"/=" {
204 yylval->assign(yytext, yyleng);
205 return pp::Token::OP_DIV_ASSIGN;
206}
207"%=" {
208 yylval->assign(yytext, yyleng);
209 return pp::Token::OP_MOD_ASSIGN;
210}
211"<<=" {
212 yylval->assign(yytext, yyleng);
213 return pp::Token::OP_LEFT_ASSIGN;
214}
215">>=" {
216 yylval->assign(yytext, yyleng);
217 return pp::Token::OP_RIGHT_ASSIGN;
218}
219"&=" {
220 yylval->assign(yytext, yyleng);
221 return pp::Token::OP_AND_ASSIGN;
222}
223"^=" {
224 yylval->assign(yytext, yyleng);
225 return pp::Token::OP_XOR_ASSIGN;
226}
227"|=" {
228 yylval->assign(yytext, yyleng);
229 return pp::Token::OP_OR_ASSIGN;
230}
alokp@chromium.org3f990c42012-04-03 19:50:35 +0000231
alokp@chromium.org07d921d2012-05-22 20:22:08 +0000232{PUNCTUATOR} {
233 yylval->assign(1, yytext[0]);
234 return yytext[0];
235}
236
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000237[ \t\v\f]+ { yyextra->leadingSpace = true; }
alokp@chromium.orgd08bb0c2012-04-23 19:27:13 +0000238
239{NEWLINE} {
240 ++yylineno;
alokp@chromium.org07d921d2012-05-22 20:22:08 +0000241 yylval->assign(1, '\n');
alokp@chromium.orgd08bb0c2012-04-23 19:27:13 +0000242 return '\n';
243}
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000244
shannon.woods%transgaming.com@gtempaccount.combcde56f2013-04-13 03:32:12 +0000245\\{NEWLINE} { ++yylineno; }
246
alokp@chromium.org78a35192012-04-19 17:16:26 +0000247. {
alokp@chromium.org432d6fc2012-06-27 22:13:21 +0000248 yylval->assign(1, yytext[0]);
249 return pp::Token::PP_OTHER;
alokp@chromium.org78a35192012-04-19 17:16:26 +0000250}
251
alokp@chromium.org07d921d2012-05-22 20:22:08 +0000252<*><<EOF>> {
alokp@chromium.org19d7aa62012-05-31 17:34:05 +0000253 // YY_USER_ACTION is not invoked for handling EOF.
254 // Set the location for EOF token manually.
255 pp::Input* input = &yyextra->input;
256 pp::Input::Location* scanLoc = &yyextra->scanLoc;
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000257 yy_size_t sIndexMax = input->count() ? input->count() - 1 : 0;
alokp@chromium.org19d7aa62012-05-31 17:34:05 +0000258 if (scanLoc->sIndex != sIndexMax)
259 {
260 // We can only reach here if there are empty strings at the
261 // end of the input.
262 scanLoc->sIndex = sIndexMax; scanLoc->cIndex = 0;
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000263 // FIXME: this is not 64-bit clean.
264 yyfileno = static_cast<int>(sIndexMax); yylineno = 1;
alokp@chromium.org19d7aa62012-05-31 17:34:05 +0000265 }
266 yylloc->file = yyfileno;
267 yylloc->line = yylineno;
268 yylval->clear();
269
alokp@chromium.org07d921d2012-05-22 20:22:08 +0000270 if (YY_START == COMMENT)
271 {
Jamie Madillc9f140d2014-02-18 15:27:21 -0500272 yyextra->diagnostics->report(pp::Diagnostics::PP_EOF_IN_COMMENT,
alokp@chromium.org07d921d2012-05-22 20:22:08 +0000273 pp::SourceLocation(yyfileno, yylineno),
274 "");
275 }
alokp@chromium.org07d921d2012-05-22 20:22:08 +0000276 yyterminate();
277}
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000278
279%%
280
alokp@chromium.org3a01d1b2011-08-30 05:10:53 +0000281namespace pp {
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000282
Jamie Madill185de882014-12-22 15:17:52 -0500283Tokenizer::Tokenizer(Diagnostics *diagnostics)
284 : mHandle(0),
285 mMaxTokenSize(256)
alokp@chromium.org3a01d1b2011-08-30 05:10:53 +0000286{
alokp@chromium.org2c958ee2012-05-17 20:35:42 +0000287 mContext.diagnostics = diagnostics;
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000288}
289
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000290Tokenizer::~Tokenizer()
291{
292 destroyScanner();
293}
294
Zhenyao Mod526f982014-05-13 14:51:19 -0700295bool Tokenizer::init(size_t count, const char * const string[], const int length[])
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000296{
Zhenyao Mod526f982014-05-13 14:51:19 -0700297 if ((count > 0) && (string == 0))
298 return false;
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000299
300 mContext.input = Input(count, string, length);
301 return initScanner();
302}
303
alokp@chromium.org46aa13d2012-06-15 15:40:27 +0000304void Tokenizer::setFileNumber(int file)
305{
306 // We use column number as file number.
307 // See macro yyfileno.
308 yyset_column(file, mHandle);
309}
310
311void Tokenizer::setLineNumber(int line)
312{
313 yyset_lineno(line, mHandle);
314}
315
Jamie Madill5508f392014-02-20 13:31:36 -0500316void Tokenizer::setMaxTokenSize(size_t maxTokenSize)
317{
318 mMaxTokenSize = maxTokenSize;
319}
320
Zhenyao Mod526f982014-05-13 14:51:19 -0700321void Tokenizer::lex(Token *token)
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000322{
alokp@chromium.org5b6a68e2012-06-28 20:29:13 +0000323 token->type = yylex(&token->text, &token->location, mHandle);
Jamie Madill5508f392014-02-20 13:31:36 -0500324 if (token->text.size() > mMaxTokenSize)
alokp@chromium.orgc022c3a2012-07-09 15:56:42 +0000325 {
Jamie Madillc9f140d2014-02-18 15:27:21 -0500326 mContext.diagnostics->report(Diagnostics::PP_TOKEN_TOO_LONG,
alokp@chromium.orgc022c3a2012-07-09 15:56:42 +0000327 token->location, token->text);
Jamie Madill5508f392014-02-20 13:31:36 -0500328 token->text.erase(mMaxTokenSize);
alokp@chromium.orgc022c3a2012-07-09 15:56:42 +0000329 }
330
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +0000331 token->flags = 0;
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000332
alokp@chromium.org19d7aa62012-05-31 17:34:05 +0000333 token->setAtStartOfLine(mContext.lineStart);
334 mContext.lineStart = token->type == '\n';
335
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000336 token->setHasLeadingSpace(mContext.leadingSpace);
337 mContext.leadingSpace = false;
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000338}
339
340bool Tokenizer::initScanner()
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000341{
alokp@chromium.org98eec912012-05-01 10:04:08 +0000342 if ((mHandle == NULL) && yylex_init_extra(&mContext, &mHandle))
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000343 return false;
344
alokp@chromium.org98eec912012-05-01 10:04:08 +0000345 yyrestart(0, mHandle);
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000346 return true;
347}
348
alokp@chromium.org04d7d222012-05-16 19:24:07 +0000349void Tokenizer::destroyScanner()
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000350{
alokp@chromium.org01fd4312012-03-30 21:33:30 +0000351 if (mHandle == NULL)
352 return;
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000353
alokp@chromium.org01fd4312012-03-30 21:33:30 +0000354 yylex_destroy(mHandle);
355 mHandle = NULL;
alokp@chromium.org4e4b8072011-08-07 05:36:04 +0000356}
357
358} // namespace pp
359