SkSLParser.h revision 9e1138d56665d13641f8805cd72ae81adc255f79
1b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas/* 2b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Copyright 2016 Google Inc. 3b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * 4b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Use of this source code is governed by a BSD-style license that can be 5b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * found in the LICENSE file. 6b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 7b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 8b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#ifndef SKSL_PARSER 9b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#define SKSL_PARSER 10b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 11b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include <vector> 12b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include <memory> 13b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include <unordered_set> 14b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include "SkSLErrorReporter.h" 15b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include "SkSLToken.h" 16b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 17b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct yy_buffer_state; 18b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#define YY_TYPEDEF_YY_BUFFER_STATE 19b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholastypedef struct yy_buffer_state *YY_BUFFER_STATE; 20b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 21b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasnamespace SkSL { 22b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 23b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTBlock; 24b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTBreakStatement; 25b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTContinueStatement; 26b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTDeclaration; 27b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTDiscardStatement; 28b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTDoStatement; 29b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTExpression; 30b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTExpressionStatement; 31b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTForStatement; 32b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTIfStatement; 33b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTInterfaceBlock; 34b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTLayout; 35b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTModifiers; 36b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTParameter; 375961bc9278a00e56dacdd9408d0744b5a0a3b493ethannicholasstruct ASTPrecision; 38b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTReturnStatement; 39b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTStatement; 40b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTSuffix; 41b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTType; 42b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTWhileStatement; 4314fe8cc16d2a98d5a96f818e4d0b7127ecad59e2ethannicholasstruct ASTVarDeclarations; 44b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasclass SymbolTable; 45b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 46b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas/** 47b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Consumes .sksl text and produces an abstract syntax tree describing the contents. 48b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 49b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasclass Parser { 50b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholaspublic: 519e1138d56665d13641f8805cd72ae81adc255f79Ethan Nicholas Parser(SkString text, SymbolTable& types, ErrorReporter& errors); 52b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 53b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas ~Parser(); 54b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 55b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas /** 56b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Consumes a complete .sksl file and produces a list of declarations. Errors are reported via 57b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * the ErrorReporter; the return value may contain some declarations even when errors have 58b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * occurred. 59b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 60b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::vector<std::unique_ptr<ASTDeclaration>> file(); 61b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 62b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasprivate: 63b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas /** 64b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Return the next token from the parse stream. 65b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 66b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas Token nextToken(); 67b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 68b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas /** 69b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Push a token back onto the parse stream, so that it is the next one read. Only a single level 70b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * of pushback is supported (that is, it is an error to call pushback() twice in a row without 71b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * an intervening nextToken()). 72b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 73b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas void pushback(Token t); 74b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 75b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas /** 76b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Returns the next token without consuming it from the stream. 77b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 78b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas Token peek(); 79b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 80b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas /** 81b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Reads the next token and generates an error if it is not the expected type. The 'expected' 82b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * string is part of the error message, which reads: 83b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * 84b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * "expected <expected>, but found '<actual text>'" 85b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * 86b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * If 'result' is non-null, it is set to point to the token that was read. 87b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Returns true if the read token was as expected, false otherwise. 88b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 899e1138d56665d13641f8805cd72ae81adc255f79Ethan Nicholas bool expect(Token::Kind kind, const char* expected, Token* result = nullptr); 909e1138d56665d13641f8805cd72ae81adc255f79Ethan Nicholas bool expect(Token::Kind kind, SkString expected, Token* result = nullptr); 91b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 929e1138d56665d13641f8805cd72ae81adc255f79Ethan Nicholas void error(Position p, const char* msg); 939e1138d56665d13641f8805cd72ae81adc255f79Ethan Nicholas void error(Position p, SkString msg); 94b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 95b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas /** 96b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Returns true if the 'name' identifier refers to a type name. For instance, isType("int") will 97b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * always return true. 98b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */ 999e1138d56665d13641f8805cd72ae81adc255f79Ethan Nicholas bool isType(SkString name); 100b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 101b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas // these functions parse individual grammar rules from the current parse position; you probably 102b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas // don't need to call any of these outside of the parser. The function declarations in the .cpp 103b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas // file have comments describing the grammar rules. 104b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 1055961bc9278a00e56dacdd9408d0744b5a0a3b493ethannicholas std::unique_ptr<ASTDeclaration> precision(); 106b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 107b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTDeclaration> directive(); 108b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 109b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTDeclaration> declaration(); 110b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 11114fe8cc16d2a98d5a96f818e4d0b7127ecad59e2ethannicholas std::unique_ptr<ASTVarDeclarations> varDeclarations(); 112b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 113b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTType> structDeclaration(); 114b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 11514fe8cc16d2a98d5a96f818e4d0b7127ecad59e2ethannicholas std::unique_ptr<ASTVarDeclarations> structVarDeclaration(ASTModifiers modifiers); 116b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 11714fe8cc16d2a98d5a96f818e4d0b7127ecad59e2ethannicholas std::unique_ptr<ASTVarDeclarations> varDeclarationEnd(ASTModifiers modifiers, 11814fe8cc16d2a98d5a96f818e4d0b7127ecad59e2ethannicholas std::unique_ptr<ASTType> type, 1199e1138d56665d13641f8805cd72ae81adc255f79Ethan Nicholas SkString name); 120b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 121b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTParameter> parameter(); 122b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 123b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas int layoutInt(); 124b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 125b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas ASTLayout layout(); 126b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 127b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas ASTModifiers modifiers(); 128b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 129b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas ASTModifiers modifiersWithDefaults(int defaultFlags); 130b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 131b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTStatement> statement(); 132b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 133b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTType> type(); 134b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 135b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTDeclaration> interfaceBlock(ASTModifiers mods); 136b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 137b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTIfStatement> ifStatement(); 138b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 139b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTDoStatement> doStatement(); 140b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 141b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTWhileStatement> whileStatement(); 142b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 143b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTForStatement> forStatement(); 144b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 145b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTReturnStatement> returnStatement(); 146b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 147b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTBreakStatement> breakStatement(); 148b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 149b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTContinueStatement> continueStatement(); 150b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 151b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTDiscardStatement> discardStatement(); 152b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 153b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTBlock> block(); 154b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 155b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpressionStatement> expressionStatement(); 156b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 157b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> expression(); 158b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 159b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> assignmentExpression(); 160b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 161b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> ternaryExpression(); 162b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 163b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> logicalOrExpression(); 164b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 165b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> logicalXorExpression(); 166b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 167b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> logicalAndExpression(); 168b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 169b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> bitwiseOrExpression(); 170b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 171b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> bitwiseXorExpression(); 172b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 173b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> bitwiseAndExpression(); 174b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 175b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> equalityExpression(); 176b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 177b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> relationalExpression(); 178b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 179b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> shiftExpression(); 180b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 181b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> additiveExpression(); 182b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 183b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> multiplicativeExpression(); 184b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 185b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> unaryExpression(); 186b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 187b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> postfixExpression(); 188b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 189b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTSuffix> suffix(); 190b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 191b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas std::unique_ptr<ASTExpression> term(); 192b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 193b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas bool intLiteral(int64_t* dest); 194b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 195b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas bool floatLiteral(double* dest); 196b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 197b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas bool boolLiteral(bool* dest); 198b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 1999e1138d56665d13641f8805cd72ae81adc255f79Ethan Nicholas bool identifier(SkString* dest); 200b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 201b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas void* fScanner; 202b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas YY_BUFFER_STATE fBuffer; 203cad6416ccbf103648874b0f5fb615ec5ac798f14ethannicholas // current parse depth, used to enforce a recursion limit to try to keep us from overflowing the 204cad6416ccbf103648874b0f5fb615ec5ac798f14ethannicholas // stack on pathological inputs 205cad6416ccbf103648874b0f5fb615ec5ac798f14ethannicholas int fDepth = 0; 206b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas Token fPushback; 207b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas SymbolTable& fTypes; 208b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas ErrorReporter& fErrors; 209cad6416ccbf103648874b0f5fb615ec5ac798f14ethannicholas 210cad6416ccbf103648874b0f5fb615ec5ac798f14ethannicholas friend class AutoDepth; 211b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas}; 212b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 213b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas} // namespace 214b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas 215b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#endif 216