summaryrefslogtreecommitdiffstats
path: root/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp.l
diff options
context:
space:
mode:
Diffstat (limited to 'Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp.l')
-rw-r--r--Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp.l181
1 files changed, 181 insertions, 0 deletions
diff --git a/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp.l b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp.l
new file mode 100644
index 0000000..627ca04
--- /dev/null
+++ b/Source/ThirdParty/ANGLE/src/compiler/preprocessor/new/pp.l
@@ -0,0 +1,181 @@
+/*
+//
+// Copyright (c) 2002-2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+This file contains the Lex specification for GLSL ES preprocessor.
+Based on Microsoft Visual Studio 2010 Preprocessor Grammar:
+http://msdn.microsoft.com/en-us/library/2scxys89.aspx
+
+IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh.
+*/
+
+%top{
+//
+// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// This file is auto-generated by generate_parser.sh. DO NOT EDIT!
+}
+
+%{
+#include "compiler/debug.h"
+#include "Context.h"
+#include "pp_tab.h"
+
+#define YY_USER_ACTION \
+ do { \
+ yylloc->first_line = yylineno; \
+ yylloc->first_column = yycolumn + 1; \
+ yycolumn += yyleng; \
+ } while(0);
+
+#define YY_INPUT(buf, result, maxSize) \
+ result = yyextra->readInput(buf, maxSize);
+
+static std::string* extractMacroName(const char* str, int len);
+%}
+
+%option noyywrap nounput never-interactive
+%option yylineno reentrant bison-bridge bison-locations
+%option stack
+%option prefix="pp"
+%option extra-type="pp::Context*"
+
+HSPACE [ \t]
+HASH ^{HSPACE}*#{HSPACE}*
+IDENTIFIER [_a-zA-Z][_a-zA-Z0-9]*
+PUNCTUATOR [][<>(){}.+-/*%^|&~=!:;,?]
+
+DECIMAL_CONSTANT [1-9][0-9]*
+OCTAL_CONSTANT 0[0-7]*
+HEXADECIMAL_CONSTANT 0[xX][0-9a-fA-F]+
+
+DIGIT [0-9]
+EXPONENT_PART [eE][+-]?{DIGIT}+
+FRACTIONAL_CONSTANT ({DIGIT}*"."{DIGIT}+)|({DIGIT}+".")
+
+%%
+
+{HASH} { return HASH; }
+
+{HASH}define{HSPACE}+{IDENTIFIER}/[ \t\n] {
+ yylval->sval = extractMacroName(yytext, yyleng);
+ return HASH_DEFINE_OBJ;
+}
+{HASH}define{HSPACE}+{IDENTIFIER}/"(" {
+ yylval->sval = extractMacroName(yytext, yyleng);
+ return HASH_DEFINE_FUNC;
+}
+{HASH}undef{HSPACE}+ { return HASH_UNDEF; }
+
+{HASH}if { return HASH_IF; }
+{HASH}ifdef { return HASH_IFDEF; }
+{HASH}ifndef { return HASH_IFNDEF; }
+{HASH}else { return HASH_ELSE; }
+{HASH}elif { return HASH_ELIF; }
+{HASH}endif { return HASH_ENDIF; }
+"defined" { return DEFINED; }
+
+{HASH}error { return HASH_ERROR; }
+{HASH}pragma { return HASH_PRAGMA; }
+{HASH}extension { return HASH_EXTENSION; }
+{HASH}version { return HASH_VERSION; }
+{HASH}line { return HASH_LINE; }
+
+{IDENTIFIER} {
+ yylval->sval = new std::string(yytext, yyleng);
+ return IDENTIFIER;
+}
+
+{DECIMAL_CONSTANT}|{OCTAL_CONSTANT}|{HEXADECIMAL_CONSTANT} {
+ yylval->sval = new std::string(yytext, yyleng);
+ return INT_CONSTANT;
+}
+
+({DIGIT}+{EXPONENT_PART})|({FRACTIONAL_CONSTANT}{EXPONENT_PART}?) {
+ yylval->sval = new std::string(yytext, yyleng);
+ return FLOAT_CONSTANT;
+}
+
+{PUNCTUATOR} { return yytext[0]; }
+
+[ \t\v\f]+ { /* Ignore whitespace */ }
+
+\n {
+ ++yylineno; yycolumn = 0;
+ return yytext[0];
+}
+
+<*><<EOF>> { yyterminate(); }
+
+%%
+
+std::string* extractMacroName(const char* str, int len)
+{
+ // The input string is of the form {HASH}define{HSPACE}+{IDENTIFIER}
+ // We just need to find the last HSPACE.
+ ASSERT(str && (len > 8)); // strlen("#define ") == 8;
+
+ std::string* name = NULL;
+ for (int i = len - 1; i >= 0; --i)
+ {
+ if ((str[i] == ' ') || (str[i] == '\t'))
+ {
+ name = new std::string(str + i + 1, len - i - 1);
+ break;
+ }
+ }
+ ASSERT(name);
+ return name;
+}
+
+namespace pp {
+
+int Context::readInput(char* buf, int maxSize)
+{
+ int nread = YY_NULL;
+ while (!mInput->eof() &&
+ (mInput->error() == pp::Input::kErrorNone) &&
+ (nread == YY_NULL))
+ {
+ int line = 0, file = 0;
+ pp::Token::decodeLocation(yyget_lineno(mLexer), &line, &file);
+ file = mInput->stringIndex();
+ yyset_lineno(pp::Token::encodeLocation(line, file), mLexer);
+
+ nread = mInput->read(buf, maxSize);
+
+ if (mInput->error() == pp::Input::kErrorUnexpectedEOF)
+ {
+ // TODO(alokp): Report error.
+ }
+ }
+ return nread;
+}
+
+bool Context::initLexer()
+{
+ ASSERT(mLexer == NULL);
+
+ if (yylex_init_extra(this, &mLexer))
+ return false;
+
+ yyrestart(0, mLexer);
+ return true;
+}
+
+void Context::destroyLexer()
+{
+ ASSERT(mLexer);
+
+ yylex_destroy(mLexer);
+ mLexer = NULL;
+}
+
+} // namespace pp
+