blob: d328e9a4f0e5681e04199cf39d3358a09491da83 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
Nicolas Capens16004fc2014-06-11 11:29:11 -04002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
Geoff Lang0a73dd82014-11-19 16:18:08 -05006#ifndef COMPILER_TRANSLATOR_PARSECONTEXT_H_
7#define COMPILER_TRANSLATOR_PARSECONTEXT_H_
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00008
Jamie Madilld4a3a312014-06-25 16:04:56 -04009#include "compiler/translator/Compiler.h"
Geoff Lang17732822013-08-29 13:46:49 -040010#include "compiler/translator/Diagnostics.h"
11#include "compiler/translator/DirectiveHandler.h"
Jamie Madillb1a85f42014-08-19 15:23:24 -040012#include "compiler/translator/Intermediate.h"
Geoff Lang17732822013-08-29 13:46:49 -040013#include "compiler/translator/SymbolTable.h"
daniel@transgaming.comb401a922012-10-26 18:58:24 +000014#include "compiler/preprocessor/Preprocessor.h"
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000015
Jamie Madill06145232015-05-13 13:10:01 -040016struct TMatrixFields
17{
daniel@transgaming.com0578f812010-05-17 09:58:39 +000018 bool wholeRow;
19 bool wholeCol;
20 int row;
21 int col;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000022};
23
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000024//
25// The following are extra variables needed during parsing, grouped together so
26// they can be passed to the parser without needing a global.
27//
Jamie Madill6c0c2982015-05-13 13:50:04 -040028class TParseContext : angle::NonCopyable
Jamie Madill06145232015-05-13 13:10:01 -040029{
Jamie Madill6c0c2982015-05-13 13:50:04 -040030 public:
Jamie Madill06145232015-05-13 13:10:01 -040031 TParseContext(TSymbolTable &symt,
32 TExtensionBehavior &ext,
33 TIntermediate &interm,
34 sh::GLenum type,
35 ShShaderSpec spec,
36 int options,
37 bool checksPrecErrors,
38 TInfoSink &is,
39 bool debugShaderPrecisionSupported)
40 : intermediate(interm),
41 symbolTable(symt),
Jamie Madill6c0c2982015-05-13 13:50:04 -040042 mShaderType(type),
43 mShaderSpec(spec),
44 mCompileOptions(options),
45 mTreeRoot(nullptr),
Jamie Madill06145232015-05-13 13:10:01 -040046 mLoopNestingLevel(0),
Jamie Madill6c0c2982015-05-13 13:50:04 -040047 mStructNestingLevel(0),
Jamie Madill06145232015-05-13 13:10:01 -040048 mSwitchNestingLevel(0),
Jamie Madill6c0c2982015-05-13 13:50:04 -040049 mCurrentFunctionType(nullptr),
Jamie Madill06145232015-05-13 13:10:01 -040050 mFunctionReturnsValue(false),
Jamie Madill6c0c2982015-05-13 13:50:04 -040051 mChecksPrecisionErrors(checksPrecErrors),
52 mFragmentPrecisionHigh(false),
53 mDefaultMatrixPacking(EmpColumnMajor),
54 mDefaultBlockStorage(EbsShared),
55 mDiagnostics(is),
56 mShaderVersion(100),
57 mDirectiveHandler(ext, mDiagnostics, mShaderVersion, debugShaderPrecisionSupported),
58 mPreprocessor(&mDiagnostics, &mDirectiveHandler),
59 mScanner(nullptr),
Jamie Madill06145232015-05-13 13:10:01 -040060 mDeferredSingleDeclarationErrorCheck(false)
Olli Etuahofa33d582015-04-09 14:33:12 +030061 {
62 }
Jamie Madill06145232015-05-13 13:10:01 -040063
Jamie Madill6c0c2982015-05-13 13:50:04 -040064 const pp::Preprocessor &getPreprocessor() const { return mPreprocessor; }
65 pp::Preprocessor &getPreprocessor() { return mPreprocessor; }
66 void *getScanner() const { return mScanner; }
67 void setScanner(void *scanner) { mScanner = scanner; }
68 int getShaderVersion() const { return mShaderVersion; }
69 sh::GLenum getShaderType() const { return mShaderType; }
70 ShShaderSpec getShaderSpec() const { return mShaderSpec; }
71 int numErrors() const { return mDiagnostics.numErrors(); }
72 TInfoSink &infoSink() { return mDiagnostics.infoSink(); }
Jamie Madill06145232015-05-13 13:10:01 -040073 void error(const TSourceLoc &loc, const char *reason, const char *token,
74 const char *extraInfo="");
75 void warning(const TSourceLoc &loc, const char *reason, const char *token,
76 const char *extraInfo="");
daniel@transgaming.com0578f812010-05-17 09:58:39 +000077 void recover();
Jamie Madill6c0c2982015-05-13 13:50:04 -040078 TIntermNode *getTreeRoot() const { return mTreeRoot; }
79 void setTreeRoot(TIntermNode *treeRoot) { mTreeRoot = treeRoot; }
80
81 bool getFragmentPrecisionHigh() const { return mFragmentPrecisionHigh; }
82 void setFragmentPrecisionHigh(bool fragmentPrecisionHigh)
83 {
84 mFragmentPrecisionHigh = fragmentPrecisionHigh;
85 }
86
87 bool getFunctionReturnsValue() const { return mFunctionReturnsValue; }
88 void setFunctionReturnsValue(bool functionReturnsValue)
89 {
90 mFunctionReturnsValue = functionReturnsValue;
91 }
92
93 void setLoopNestingLevel(int loopNestintLevel)
94 {
95 mLoopNestingLevel = loopNestintLevel;
96 }
97
98 const TType *getCurrentFunctionType() const { return mCurrentFunctionType; }
99 void setCurrentFunctionType(const TType *currentFunctionType)
100 {
101 mCurrentFunctionType = currentFunctionType;
102 }
103
104 void incrLoopNestingLevel() { ++mLoopNestingLevel; }
105 void decrLoopNestingLevel() { --mLoopNestingLevel; }
106
107 void incrSwitchNestingLevel() { ++mSwitchNestingLevel; }
108 void decrSwitchNestingLevel() { --mSwitchNestingLevel; }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000109
Jamie Madill5c097022014-08-20 16:38:32 -0400110 // This method is guaranteed to succeed, even if no variable with 'name' exists.
111 const TVariable *getNamedVariable(const TSourceLoc &location, const TString *name, const TSymbol *symbol);
112
Jamie Madill06145232015-05-13 13:10:01 -0400113 bool parseVectorFields(const TString&, int vecSize, TVectorFields&, const TSourceLoc &line);
114 bool parseMatrixFields(const TString&, int matCols, int matRows, TMatrixFields&, const TSourceLoc &line);
alokp@chromium.org75fe6b72011-08-14 05:31:22 +0000115
Jamie Madill06145232015-05-13 13:10:01 -0400116 bool reservedErrorCheck(const TSourceLoc &line, const TString &identifier);
117 void assignError(const TSourceLoc &line, const char *op, TString left, TString right);
118 void unaryOpError(const TSourceLoc &line, const char *op, TString operand);
119 void binaryOpError(const TSourceLoc &line, const char *op, TString left, TString right);
120 bool precisionErrorCheck(const TSourceLoc &line, TPrecision precision, TBasicType type);
121 bool lValueErrorCheck(const TSourceLoc &line, const char *op, TIntermTyped*);
122 bool constErrorCheck(TIntermTyped *node);
123 bool integerErrorCheck(TIntermTyped *node, const char *token);
124 bool globalErrorCheck(const TSourceLoc &line, bool global, const char *token);
125 bool constructorErrorCheck(const TSourceLoc &line, TIntermNode*, TFunction&, TOperator, TType*);
126 bool arraySizeErrorCheck(const TSourceLoc &line, TIntermTyped *expr, int &size);
Olli Etuaho3739d232015-04-08 12:23:44 +0300127 bool arrayQualifierErrorCheck(const TSourceLoc &line, const TPublicType &type);
Jamie Madill06145232015-05-13 13:10:01 -0400128 bool arrayTypeErrorCheck(const TSourceLoc &line, const TPublicType &type);
Olli Etuaho6ed7bbe2015-04-07 18:08:46 +0300129 bool voidErrorCheck(const TSourceLoc &line, const TString &identifier, const TBasicType &type);
Jamie Madill075edd82013-07-08 13:30:19 -0400130 bool boolErrorCheck(const TSourceLoc&, const TIntermTyped*);
131 bool boolErrorCheck(const TSourceLoc&, const TPublicType&);
Jamie Madill06145232015-05-13 13:10:01 -0400132 bool samplerErrorCheck(const TSourceLoc &line, const TPublicType &pType, const char *reason);
133 bool locationDeclaratorListCheck(const TSourceLoc &line, const TPublicType &pType);
134 bool parameterSamplerErrorCheck(const TSourceLoc &line, TQualifier qualifier, const TType &type);
135 bool paramErrorCheck(const TSourceLoc &line, TQualifier qualifier, TQualifier paramQualifier, TType *type);
136 bool extensionErrorCheck(const TSourceLoc &line, const TString&);
137 bool singleDeclarationErrorCheck(const TPublicType &publicType, const TSourceLoc &identifierLocation);
138 bool layoutLocationErrorCheck(const TSourceLoc &location, const TLayoutQualifier &layoutQualifier);
Olli Etuahob6e07a62015-02-16 12:22:10 +0200139 bool functionCallLValueErrorCheck(const TFunction *fnCandidate, TIntermAggregate *);
Olli Etuaho37ad4742015-04-27 13:18:50 +0300140 void es3InvariantErrorCheck(const TQualifier qualifier, const TSourceLoc &invariantLocation);
alokp@chromium.org8b851c62012-06-15 16:25:11 +0000141
Jamie Madill6c0c2982015-05-13 13:50:04 -0400142 const TPragma &pragma() const { return mDirectiveHandler.pragma(); }
143 const TExtensionBehavior &extensionBehavior() const { return mDirectiveHandler.extensionBehavior(); }
Jamie Madill06145232015-05-13 13:10:01 -0400144 bool supportsExtension(const char *extension);
145 bool isExtensionEnabled(const char *extension) const;
146 void handleExtensionDirective(const TSourceLoc &loc, const char *extName, const char *behavior);
147 void handlePragmaDirective(const TSourceLoc &loc, const char *name, const char *value, bool stdgl);
alokp@chromium.org75fe6b72011-08-14 05:31:22 +0000148
Jamie Madill06145232015-05-13 13:10:01 -0400149 bool containsSampler(const TType &type);
150 bool areAllChildConst(TIntermAggregate *aggrNode);
151 const TFunction* findFunction(
152 const TSourceLoc &line, TFunction *pfnCall, int inputShaderVersion, bool *builtIn = 0);
153 bool executeInitializer(const TSourceLoc &line,
154 const TString &identifier,
155 const TPublicType &pType,
156 TIntermTyped *initializer,
157 TIntermNode **intermNode);
alokp@chromium.org75fe6b72011-08-14 05:31:22 +0000158
Jamie Madill06145232015-05-13 13:10:01 -0400159 TPublicType addFullySpecifiedType(TQualifier qualifier,
160 bool invariant,
161 TLayoutQualifier layoutQualifier,
162 const TPublicType &typeSpecifier);
Olli Etuahoe7847b02015-03-16 11:56:12 +0200163
Olli Etuahofa33d582015-04-09 14:33:12 +0300164 TIntermAggregate *parseSingleDeclaration(TPublicType &publicType,
Jamie Madill06145232015-05-13 13:10:01 -0400165 const TSourceLoc &identifierOrTypeLocation,
166 const TString &identifier);
Olli Etuahoe7847b02015-03-16 11:56:12 +0200167 TIntermAggregate *parseSingleArrayDeclaration(TPublicType &publicType,
Jamie Madill06145232015-05-13 13:10:01 -0400168 const TSourceLoc &identifierLocation,
169 const TString &identifier,
170 const TSourceLoc &indexLocation,
171 TIntermTyped *indexExpression);
172 TIntermAggregate *parseSingleInitDeclaration(const TPublicType &publicType,
173 const TSourceLoc &identifierLocation,
174 const TString &identifier,
175 const TSourceLoc &initLocation,
176 TIntermTyped *initializer);
Jamie Madill47e3ec02014-08-20 16:38:33 -0400177
Olli Etuaho3875ffd2015-04-10 16:45:14 +0300178 // Parse a declaration like "type a[n] = initializer"
179 // Note that this does not apply to declarations like "type[n] a = initializer"
180 TIntermAggregate *parseSingleArrayInitDeclaration(TPublicType &publicType,
Jamie Madill06145232015-05-13 13:10:01 -0400181 const TSourceLoc &identifierLocation,
182 const TString &identifier,
183 const TSourceLoc &indexLocation,
184 TIntermTyped *indexExpression,
185 const TSourceLoc &initLocation,
186 TIntermTyped *initializer);
Olli Etuaho3875ffd2015-04-10 16:45:14 +0300187
Jamie Madill06145232015-05-13 13:10:01 -0400188 TIntermAggregate *parseInvariantDeclaration(const TSourceLoc &invariantLoc,
189 const TSourceLoc &identifierLoc,
190 const TString *identifier,
191 const TSymbol *symbol);
Olli Etuahoe7847b02015-03-16 11:56:12 +0200192
Jamie Madill06145232015-05-13 13:10:01 -0400193 TIntermAggregate *parseDeclarator(TPublicType &publicType,
194 TIntermAggregate *aggregateDeclaration,
195 const TSourceLoc &identifierLocation,
196 const TString &identifier);
197 TIntermAggregate *parseArrayDeclarator(TPublicType &publicType,
198 TIntermAggregate *aggregateDeclaration,
199 const TSourceLoc &identifierLocation,
200 const TString &identifier,
201 const TSourceLoc &arrayLocation,
202 TIntermTyped *indexExpression);
203 TIntermAggregate *parseInitDeclarator(const TPublicType &publicType,
204 TIntermAggregate *aggregateDeclaration,
205 const TSourceLoc &identifierLocation,
206 const TString &identifier,
207 const TSourceLoc &initLocation,
208 TIntermTyped *initializer);
Olli Etuahoe7847b02015-03-16 11:56:12 +0200209
Olli Etuaho3875ffd2015-04-10 16:45:14 +0300210 // Parse a declarator like "a[n] = initializer"
Jamie Madill06145232015-05-13 13:10:01 -0400211 TIntermAggregate *parseArrayInitDeclarator(const TPublicType &publicType,
212 TIntermAggregate *aggregateDeclaration,
213 const TSourceLoc &identifierLocation,
214 const TString &identifier,
215 const TSourceLoc &indexLocation,
216 TIntermTyped *indexExpression,
217 const TSourceLoc &initLocation,
218 TIntermTyped *initializer);
Olli Etuaho3875ffd2015-04-10 16:45:14 +0300219
Jamie Madilla295edf2013-06-06 11:56:48 -0400220 void parseGlobalLayoutQualifier(const TPublicType &typeQualifier);
Jamie Madill06145232015-05-13 13:10:01 -0400221 TFunction *addConstructorFunc(const TPublicType &publicType);
222 TIntermTyped *addConstructor(TIntermNode *arguments,
223 TType *type,
224 TOperator op,
225 TFunction *fnCall,
226 const TSourceLoc &line);
227 TIntermTyped *foldConstConstructor(TIntermAggregate *aggrNode, const TType &type);
228 TIntermTyped *addConstVectorNode(TVectorFields&, TIntermTyped*, const TSourceLoc&);
229 TIntermTyped *addConstMatrixNode(int, TIntermTyped*, const TSourceLoc&);
230 TIntermTyped *addConstArrayNode(int index, TIntermTyped *node, const TSourceLoc &line);
231 TIntermTyped *addConstStruct(
232 const TString &identifier, TIntermTyped *node, const TSourceLoc& line);
233 TIntermTyped *addIndexExpression(TIntermTyped *baseExpression,
234 const TSourceLoc& location,
235 TIntermTyped *indexExpression);
236 TIntermTyped* addFieldSelectionExpression(TIntermTyped *baseExpression,
237 const TSourceLoc &dotLocation,
238 const TString &fieldString,
239 const TSourceLoc &fieldLocation);
shannonwoods@chromium.orga9100882013-05-30 00:11:39 +0000240
Jamie Madill06145232015-05-13 13:10:01 -0400241 TFieldList *addStructDeclaratorList(const TPublicType &typeSpecifier, TFieldList *fieldList);
242 TPublicType addStructure(const TSourceLoc &structLine,
243 const TSourceLoc &nameLine,
244 const TString *structName,
245 TFieldList *fieldList);
kbr@chromium.org476541f2011-10-27 21:14:51 +0000246
Jamie Madill06145232015-05-13 13:10:01 -0400247 TIntermAggregate* addInterfaceBlock(const TPublicType &typeQualifier,
248 const TSourceLoc &nameLine,
249 const TString &blockName,
250 TFieldList *fieldList,
251 const TString *instanceName,
252 const TSourceLoc &instanceLine,
253 TIntermTyped *arrayIndex,
254 const TSourceLoc& arrayIndexLine);
shannonwoods@chromium.org5668c5d2013-05-30 00:11:48 +0000255
Jamie Madill06145232015-05-13 13:10:01 -0400256 TLayoutQualifier parseLayoutQualifier(
257 const TString &qualifierType, const TSourceLoc &qualifierTypeLine);
258 TLayoutQualifier parseLayoutQualifier(const TString &qualifierType,
259 const TSourceLoc &qualifierTypeLine,
260 const TString &intValueString,
261 int intValue,
262 const TSourceLoc &intValueLine);
Jamie Madilla5efff92013-06-06 11:56:47 -0400263 TLayoutQualifier joinLayoutQualifiers(TLayoutQualifier leftQualifier, TLayoutQualifier rightQualifier);
Jamie Madillf2e0f9b2013-08-26 16:39:42 -0400264 TPublicType joinInterpolationQualifiers(const TSourceLoc &interpolationLoc, TQualifier interpolationQualifier,
265 const TSourceLoc &storageLoc, TQualifier storageQualifier);
shannonwoods@chromium.org302adfe2013-05-30 00:21:06 +0000266
kbr@chromium.org476541f2011-10-27 21:14:51 +0000267 // Performs an error check for embedded struct declarations.
268 // Returns true if an error was raised due to the declaration of
269 // this struct.
Jamie Madill06145232015-05-13 13:10:01 -0400270 bool enterStructDeclaration(const TSourceLoc &line, const TString &identifier);
kbr@chromium.org476541f2011-10-27 21:14:51 +0000271 void exitStructDeclaration();
272
Jamie Madill06145232015-05-13 13:10:01 -0400273 bool structNestingErrorCheck(const TSourceLoc &line, const TField &field);
Olli Etuaho09b22472015-02-11 11:47:26 +0200274
Olli Etuahoa3a36662015-02-17 13:46:51 +0200275 TIntermSwitch *addSwitch(TIntermTyped *init, TIntermAggregate *statementList, const TSourceLoc &loc);
276 TIntermCase *addCase(TIntermTyped *condition, const TSourceLoc &loc);
277 TIntermCase *addDefault(const TSourceLoc &loc);
278
Jamie Madill06145232015-05-13 13:10:01 -0400279 TIntermTyped *addUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &loc);
280 TIntermTyped *addUnaryMathLValue(TOperator op, TIntermTyped *child, const TSourceLoc &loc);
281 TIntermTyped *addBinaryMath(
282 TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &loc);
283 TIntermTyped *addBinaryMathBooleanResult(
284 TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &loc);
285 TIntermTyped *addAssign(
286 TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &loc);
Olli Etuaho49300862015-02-20 14:54:49 +0200287
288 TIntermBranch *addBranch(TOperator op, const TSourceLoc &loc);
289 TIntermBranch *addBranch(TOperator op, TIntermTyped *returnValue, const TSourceLoc &loc);
Olli Etuahoc4ba3be2015-03-02 14:42:24 +0200290
Jamie Madill06145232015-05-13 13:10:01 -0400291 TIntermTyped *addFunctionCallOrMethod(TFunction *fnCall,
292 TIntermNode *paramNode,
293 TIntermNode *thisNode,
294 const TSourceLoc &loc,
295 bool *fatalError);
Olli Etuahofc1806e2015-03-17 13:03:11 +0200296
Jamie Madill06145232015-05-13 13:10:01 -0400297 TIntermTyped *addTernarySelection(
298 TIntermTyped *cond, TIntermTyped *trueBlock, TIntermTyped *falseBlock, const TSourceLoc &line);
Olli Etuaho52901742015-04-15 13:42:45 +0300299
Jamie Madill6c0c2982015-05-13 13:50:04 -0400300 // TODO(jmadill): make these private
301 TIntermediate &intermediate; // to hold and build a parse tree
302 TSymbolTable &symbolTable; // symbol table that goes with the language currently being parsed
303
Olli Etuahofc1806e2015-03-17 13:03:11 +0200304 private:
Olli Etuaho2935c582015-04-08 14:32:06 +0300305 bool declareVariable(const TSourceLoc &line, const TString &identifier, const TType &type, TVariable **variable);
306
Olli Etuaho376f1b52015-04-13 13:23:41 +0300307 bool nonInitErrorCheck(const TSourceLoc &line, const TString &identifier, TPublicType *type);
308
Jamie Madill06145232015-05-13 13:10:01 -0400309 TIntermTyped *addBinaryMathInternal(
310 TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &loc);
311 TIntermTyped *createAssign(
312 TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &loc);
Olli Etuahof6c694b2015-03-26 14:50:53 +0200313 // The funcReturnType parameter is expected to be non-null when the operation is a built-in function.
314 // It is expected to be null for other unary operators.
Jamie Madill06145232015-05-13 13:10:01 -0400315 TIntermTyped *createUnaryMath(
316 TOperator op, TIntermTyped *child, const TSourceLoc &loc, const TType *funcReturnType);
Olli Etuahod6b14282015-03-17 14:31:35 +0200317
Olli Etuaho47fd36a2015-03-19 14:22:24 +0200318 // Return true if the checks pass
Jamie Madill06145232015-05-13 13:10:01 -0400319 bool binaryOpCommonCheck(
320 TOperator op, TIntermTyped *left, TIntermTyped *right, const TSourceLoc &loc);
Olli Etuahofa33d582015-04-09 14:33:12 +0300321
322 // Set to true when the last/current declarator list was started with an empty declaration.
323 bool mDeferredSingleDeclarationErrorCheck;
Jamie Madill6c0c2982015-05-13 13:50:04 -0400324
325 sh::GLenum mShaderType; // vertex or fragment language (future: pack or unpack)
326 ShShaderSpec mShaderSpec; // The language specification compiler conforms to - GLES2 or WebGL.
327 int mShaderVersion;
328 int mCompileOptions;
329 TIntermNode *mTreeRoot; // root of parse tree being created
330 int mLoopNestingLevel; // 0 if outside all loops
331 int mStructNestingLevel; // incremented while parsing a struct declaration
332 int mSwitchNestingLevel; // 0 if outside all switch statements
333 const TType *mCurrentFunctionType; // the return type of the function that's currently being parsed
334 bool mFunctionReturnsValue; // true if a non-void function has a return
335 bool mChecksPrecisionErrors; // true if an error will be generated when a variable is declared without precision, explicit or implicit.
336 bool mFragmentPrecisionHigh; // true if highp precision is supported in the fragment language.
337 TLayoutMatrixPacking mDefaultMatrixPacking;
338 TLayoutBlockStorage mDefaultBlockStorage;
339 TString mHashErrMsg;
340 TDiagnostics mDiagnostics;
341 TDirectiveHandler mDirectiveHandler;
342 pp::Preprocessor mPreprocessor;
343 void *mScanner;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000344};
345
Jamie Madill06145232015-05-13 13:10:01 -0400346int PaParseStrings(
347 size_t count, const char *const string[], const int length[], TParseContext *context);
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000348
Geoff Lang0a73dd82014-11-19 16:18:08 -0500349#endif // COMPILER_TRANSLATOR_PARSECONTEXT_H_