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