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