blob: 3e05763b161c7d66333185f6884f2543894f3833 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
2// Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6#ifndef _PARSER_HELPER_INCLUDED_
7#define _PARSER_HELPER_INCLUDED_
8
alokp@chromium.orgad771eb2010-09-07 17:36:23 +00009#include "compiler/ExtensionBehavior.h"
10#include "compiler/localintermediate.h"
daniel@transgaming.combbf56f72010-04-20 18:52:13 +000011#include "compiler/ShHandle.h"
12#include "compiler/SymbolTable.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000013
14struct TMatrixFields {
daniel@transgaming.com0578f812010-05-17 09:58:39 +000015 bool wholeRow;
16 bool wholeCol;
17 int row;
18 int col;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000019};
20
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021struct TPragma {
daniel@transgaming.com0578f812010-05-17 09:58:39 +000022 TPragma(bool o, bool d) : optimize(o), debug(d) { }
23 bool optimize;
24 bool debug;
25 TPragmaTable pragmaTable;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026};
27
28//
29// The following are extra variables needed during parsing, grouped together so
30// they can be passed to the parser without needing a global.
31//
32struct TParseContext {
zmo@google.comdc4b4f82011-06-17 00:42:53 +000033 TParseContext(TSymbolTable& symt, TExtensionBehavior& ext, TIntermediate& interm, ShShaderType type, ShShaderSpec spec, int options, bool checksPrecErrors, const char* sourcePath, TInfoSink& is) :
kbr@chromium.org476541f2011-10-27 21:14:51 +000034 intermediate(interm),
35 symbolTable(symt),
36 extensionBehavior(ext),
37 infoSink(is),
38 shaderType(type),
39 shaderSpec(spec),
40 compileOptions(options),
41 sourcePath(sourcePath),
42 treeRoot(0),
43 numErrors(0),
44 lexAfterType(false),
45 loopNestingLevel(0),
46 structNestingLevel(0),
47 inTypeParen(false),
48 currentFunctionType(NULL),
49 functionReturnsValue(false),
50 checksPrecisionErrors(checksPrecErrors),
51 contextPragma(true, false),
52 scanner(NULL) { }
daniel@transgaming.com0578f812010-05-17 09:58:39 +000053 TIntermediate& intermediate; // to hold and build a parse tree
54 TSymbolTable& symbolTable; // symbol table that goes with the language currently being parsed
zmo@google.com5601ea02011-06-10 18:23:25 +000055 TExtensionBehavior& extensionBehavior; // mapping between supported extensions and current behavior.
daniel@transgaming.com0578f812010-05-17 09:58:39 +000056 TInfoSink& infoSink;
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000057 ShShaderType shaderType; // vertex or fragment language (future: pack or unpack)
58 ShShaderSpec shaderSpec; // The language specification compiler conforms to - GLES2 or WebGL.
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +000059 int compileOptions;
60 const char* sourcePath; // Path of source file or NULL.
daniel@transgaming.com0578f812010-05-17 09:58:39 +000061 TIntermNode* treeRoot; // root of parse tree being created
daniel@transgaming.com0578f812010-05-17 09:58:39 +000062 int numErrors;
63 bool lexAfterType; // true if we've recognized a type, so can only be looking for an identifier
64 int loopNestingLevel; // 0 if outside all loops
kbr@chromium.org476541f2011-10-27 21:14:51 +000065 int structNestingLevel; // incremented while parsing a struct declaration
daniel@transgaming.com0578f812010-05-17 09:58:39 +000066 bool inTypeParen; // true if in parentheses, looking only for an identifier
67 const TType* currentFunctionType; // the return type of the function that's currently being parsed
68 bool functionReturnsValue; // true if a non-void function has a return
zmo@google.comdc4b4f82011-06-17 00:42:53 +000069 bool checksPrecisionErrors; // true if an error will be generated when a variable is declared without precision, explicit or implicit.
alokp@chromium.org75fe6b72011-08-14 05:31:22 +000070 struct TPragma contextPragma;
71 TString HashErrMsg;
72 bool AfterEOF;
73 void* scanner;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000074
alokp@chromium.org044a5cf2010-11-12 15:42:16 +000075 void error(TSourceLoc loc, const char *reason, const char* token,
76 const char* extraInfoFormat, ...);
77 void warning(TSourceLoc loc, const char* reason, const char* token,
78 const char* extraInfoFormat, ...);
daniel@transgaming.com0578f812010-05-17 09:58:39 +000079 void recover();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000080
daniel@transgaming.com0578f812010-05-17 09:58:39 +000081 bool parseVectorFields(const TString&, int vecSize, TVectorFields&, int line);
82 bool parseMatrixFields(const TString&, int matSize, TMatrixFields&, int line);
alokp@chromium.org75fe6b72011-08-14 05:31:22 +000083
84 bool reservedErrorCheck(int line, const TString& identifier);
daniel@transgaming.com0578f812010-05-17 09:58:39 +000085 void assignError(int line, const char* op, TString left, TString right);
86 void unaryOpError(int line, const char* op, TString operand);
87 void binaryOpError(int line, const char* op, TString left, TString right);
daniel@transgaming.coma5d76232010-05-17 09:58:47 +000088 bool precisionErrorCheck(int line, TPrecision precision, TBasicType type);
daniel@transgaming.com0578f812010-05-17 09:58:39 +000089 bool lValueErrorCheck(int line, const char* op, TIntermTyped*);
90 bool constErrorCheck(TIntermTyped* node);
91 bool integerErrorCheck(TIntermTyped* node, const char* token);
92 bool globalErrorCheck(int line, bool global, const char* token);
93 bool constructorErrorCheck(int line, TIntermNode*, TFunction&, TOperator, TType*);
94 bool arraySizeErrorCheck(int line, TIntermTyped* expr, int& size);
95 bool arrayQualifierErrorCheck(int line, TPublicType type);
96 bool arrayTypeErrorCheck(int line, TPublicType type);
97 bool arrayErrorCheck(int line, TString& identifier, TPublicType type, TVariable*& variable);
98 bool voidErrorCheck(int, const TString&, const TPublicType&);
99 bool boolErrorCheck(int, const TIntermTyped*);
100 bool boolErrorCheck(int, const TPublicType&);
101 bool samplerErrorCheck(int line, const TPublicType& pType, const char* reason);
102 bool structQualifierErrorCheck(int line, const TPublicType& pType);
103 bool parameterSamplerErrorCheck(int line, TQualifier qualifier, const TType& type);
daniel@transgaming.com0578f812010-05-17 09:58:39 +0000104 bool nonInitConstErrorCheck(int line, TString& identifier, TPublicType& type);
zmo@google.comfd747b82011-04-23 01:30:07 +0000105 bool nonInitErrorCheck(int line, TString& identifier, TPublicType& type, TVariable*& variable);
daniel@transgaming.com0578f812010-05-17 09:58:39 +0000106 bool paramErrorCheck(int line, TQualifier qualifier, TQualifier paramQualifier, TType* type);
alokp@chromium.org8815d7f2010-09-09 17:30:03 +0000107 bool extensionErrorCheck(int line, const TString&);
zmo@google.com09c323a2011-08-12 18:22:25 +0000108 bool supportsExtension(const char* extension);
alokp@chromium.org75fe6b72011-08-14 05:31:22 +0000109
110 bool containsSampler(TType& type);
111 bool areAllChildConst(TIntermAggregate* aggrNode);
daniel@transgaming.com0578f812010-05-17 09:58:39 +0000112 const TFunction* findFunction(int line, TFunction* pfnCall, bool *builtIn = 0);
113 bool executeInitializer(TSourceLoc line, TString& identifier, TPublicType& pType,
114 TIntermTyped* initializer, TIntermNode*& intermNode, TVariable* variable = 0);
alokp@chromium.org75fe6b72011-08-14 05:31:22 +0000115 bool arraySetMaxSize(TIntermSymbol*, TType*, int, bool, TSourceLoc);
116
daniel@transgaming.com0578f812010-05-17 09:58:39 +0000117 TIntermTyped* addConstructor(TIntermNode*, const TType*, TOperator, TFunction*, TSourceLoc);
118 TIntermTyped* foldConstConstructor(TIntermAggregate* aggrNode, const TType& type);
119 TIntermTyped* constructStruct(TIntermNode*, TType*, int, TSourceLoc, bool subset);
120 TIntermTyped* constructBuiltIn(const TType*, TOperator, TIntermNode*, TSourceLoc, bool subset);
121 TIntermTyped* addConstVectorNode(TVectorFields&, TIntermTyped*, TSourceLoc);
122 TIntermTyped* addConstMatrixNode(int , TIntermTyped*, TSourceLoc);
123 TIntermTyped* addConstArrayNode(int index, TIntermTyped* node, TSourceLoc line);
124 TIntermTyped* addConstStruct(TString& , TIntermTyped*, TSourceLoc);
kbr@chromium.org476541f2011-10-27 21:14:51 +0000125
126 // Performs an error check for embedded struct declarations.
127 // Returns true if an error was raised due to the declaration of
128 // this struct.
129 bool enterStructDeclaration(TSourceLoc line, const TString& identifier);
130 void exitStructDeclaration();
131
132 bool structNestingErrorCheck(TSourceLoc line, const TType& fieldType);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000133};
134
alokp@chromium.org044a5cf2010-11-12 15:42:16 +0000135int PaParseStrings(int count, const char* const string[], const int length[],
136 TParseContext* context);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000137
138typedef TParseContext* TParseContextPointer;
139extern TParseContextPointer& GetGlobalParseContext();
140#define GlobalParseContext GetGlobalParseContext()
141
142typedef struct TThreadParseContextRec
143{
daniel@transgaming.com0578f812010-05-17 09:58:39 +0000144 TParseContext *lpGlobalParseContext;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000145} TThreadParseContext;
146
147#endif // _PARSER_HELPER_INCLUDED_