blob: 6d4a0da315462caddfe36ae678a42c0344489fff [file] [log] [blame]
ethannicholasb3058bd2016-07-01 08:22:01 -07001/*
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 */
Ethan Nicholas11d53972016-11-28 11:23:23 -05007
ethannicholasb3058bd2016-07-01 08:22:01 -07008#ifndef SKSL_PARSER
9#define SKSL_PARSER
10
ethannicholasb3058bd2016-07-01 08:22:01 -070011#include <vector>
12#include <memory>
Ethan Nicholas3614d9a2017-02-15 12:33:30 -050013#include <unordered_map>
ethannicholasb3058bd2016-07-01 08:22:01 -070014#include <unordered_set>
15#include "SkSLErrorReporter.h"
16#include "SkSLToken.h"
17
18struct yy_buffer_state;
19#define YY_TYPEDEF_YY_BUFFER_STATE
20typedef struct yy_buffer_state *YY_BUFFER_STATE;
21
22namespace SkSL {
23
24struct ASTBlock;
25struct ASTBreakStatement;
26struct ASTContinueStatement;
27struct ASTDeclaration;
28struct ASTDiscardStatement;
29struct ASTDoStatement;
30struct ASTExpression;
31struct ASTExpressionStatement;
32struct ASTForStatement;
33struct ASTIfStatement;
34struct ASTInterfaceBlock;
ethannicholasb3058bd2016-07-01 08:22:01 -070035struct ASTParameter;
ethannicholas5961bc92016-10-12 06:39:56 -070036struct ASTPrecision;
ethannicholasb3058bd2016-07-01 08:22:01 -070037struct ASTReturnStatement;
38struct ASTStatement;
39struct ASTSuffix;
Ethan Nicholasaf197692017-02-27 13:26:45 -050040struct ASTSwitchCase;
41struct ASTSwitchStatement;
ethannicholasb3058bd2016-07-01 08:22:01 -070042struct ASTType;
43struct ASTWhileStatement;
ethannicholas14fe8cc2016-09-07 13:37:16 -070044struct ASTVarDeclarations;
Ethan Nicholas11d53972016-11-28 11:23:23 -050045struct Layout;
46struct Modifiers;
ethannicholasb3058bd2016-07-01 08:22:01 -070047class SymbolTable;
48
49/**
50 * Consumes .sksl text and produces an abstract syntax tree describing the contents.
51 */
52class Parser {
53public:
Ethan Nicholas0df1b042017-03-31 13:56:23 -040054 Parser(String text, SymbolTable& types, ErrorReporter& errors);
ethannicholasb3058bd2016-07-01 08:22:01 -070055
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
65private:
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 /**
Ethan Nicholas11d53972016-11-28 11:23:23 -050079 * Returns the next token without consuming it from the stream.
ethannicholasb3058bd2016-07-01 08:22:01 -070080 */
81 Token peek();
82
83 /**
Ethan Nicholas0c9d13b2017-05-08 16:18:19 -040084 * Checks to see if the next token is of the specified type. If so, stores it in result (if
85 * result is non-null) and returns true. Otherwise, pushes it back and returns false.
86 */
87 bool checkNext(Token::Kind kind, Token* result = nullptr);
88
89 /**
ethannicholasb3058bd2016-07-01 08:22:01 -070090 * Reads the next token and generates an error if it is not the expected type. The 'expected'
91 * string is part of the error message, which reads:
92 *
93 * "expected <expected>, but found '<actual text>'"
94 *
95 * If 'result' is non-null, it is set to point to the token that was read.
96 * Returns true if the read token was as expected, false otherwise.
97 */
Ethan Nicholas9e1138d2016-11-21 10:39:35 -050098 bool expect(Token::Kind kind, const char* expected, Token* result = nullptr);
Ethan Nicholas0df1b042017-03-31 13:56:23 -040099 bool expect(Token::Kind kind, String expected, Token* result = nullptr);
ethannicholasb3058bd2016-07-01 08:22:01 -0700100
Ethan Nicholas9e1138d2016-11-21 10:39:35 -0500101 void error(Position p, const char* msg);
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400102 void error(Position p, String msg);
103
ethannicholasb3058bd2016-07-01 08:22:01 -0700104 /**
105 * Returns true if the 'name' identifier refers to a type name. For instance, isType("int") will
106 * always return true.
107 */
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400108 bool isType(String name);
ethannicholasb3058bd2016-07-01 08:22:01 -0700109
110 // these functions parse individual grammar rules from the current parse position; you probably
111 // don't need to call any of these outside of the parser. The function declarations in the .cpp
112 // file have comments describing the grammar rules.
113
ethannicholas5961bc92016-10-12 06:39:56 -0700114 std::unique_ptr<ASTDeclaration> precision();
ethannicholasb3058bd2016-07-01 08:22:01 -0700115
116 std::unique_ptr<ASTDeclaration> directive();
117
118 std::unique_ptr<ASTDeclaration> declaration();
119
ethannicholas14fe8cc2016-09-07 13:37:16 -0700120 std::unique_ptr<ASTVarDeclarations> varDeclarations();
ethannicholasb3058bd2016-07-01 08:22:01 -0700121
122 std::unique_ptr<ASTType> structDeclaration();
123
Ethan Nicholas11d53972016-11-28 11:23:23 -0500124 std::unique_ptr<ASTVarDeclarations> structVarDeclaration(Modifiers modifiers);
ethannicholasb3058bd2016-07-01 08:22:01 -0700125
Ethan Nicholas11d53972016-11-28 11:23:23 -0500126 std::unique_ptr<ASTVarDeclarations> varDeclarationEnd(Modifiers modifiers,
127 std::unique_ptr<ASTType> type,
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400128 String name);
ethannicholasb3058bd2016-07-01 08:22:01 -0700129
130 std::unique_ptr<ASTParameter> parameter();
131
132 int layoutInt();
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400133
Ethan Nicholas11d53972016-11-28 11:23:23 -0500134 Layout layout();
ethannicholasb3058bd2016-07-01 08:22:01 -0700135
Ethan Nicholas11d53972016-11-28 11:23:23 -0500136 Modifiers modifiers();
ethannicholasb3058bd2016-07-01 08:22:01 -0700137
Ethan Nicholas11d53972016-11-28 11:23:23 -0500138 Modifiers modifiersWithDefaults(int defaultFlags);
ethannicholasb3058bd2016-07-01 08:22:01 -0700139
140 std::unique_ptr<ASTStatement> statement();
141
142 std::unique_ptr<ASTType> type();
143
Ethan Nicholas11d53972016-11-28 11:23:23 -0500144 std::unique_ptr<ASTDeclaration> interfaceBlock(Modifiers mods);
ethannicholasb3058bd2016-07-01 08:22:01 -0700145
146 std::unique_ptr<ASTIfStatement> ifStatement();
147
148 std::unique_ptr<ASTDoStatement> doStatement();
149
150 std::unique_ptr<ASTWhileStatement> whileStatement();
151
152 std::unique_ptr<ASTForStatement> forStatement();
153
Ethan Nicholasaf197692017-02-27 13:26:45 -0500154 std::unique_ptr<ASTSwitchCase> switchCase();
155
156 std::unique_ptr<ASTStatement> switchStatement();
157
ethannicholasb3058bd2016-07-01 08:22:01 -0700158 std::unique_ptr<ASTReturnStatement> returnStatement();
159
160 std::unique_ptr<ASTBreakStatement> breakStatement();
161
162 std::unique_ptr<ASTContinueStatement> continueStatement();
163
164 std::unique_ptr<ASTDiscardStatement> discardStatement();
165
166 std::unique_ptr<ASTBlock> block();
167
168 std::unique_ptr<ASTExpressionStatement> expressionStatement();
169
170 std::unique_ptr<ASTExpression> expression();
171
172 std::unique_ptr<ASTExpression> assignmentExpression();
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400173
ethannicholasb3058bd2016-07-01 08:22:01 -0700174 std::unique_ptr<ASTExpression> ternaryExpression();
175
176 std::unique_ptr<ASTExpression> logicalOrExpression();
177
178 std::unique_ptr<ASTExpression> logicalXorExpression();
179
180 std::unique_ptr<ASTExpression> logicalAndExpression();
181
182 std::unique_ptr<ASTExpression> bitwiseOrExpression();
183
184 std::unique_ptr<ASTExpression> bitwiseXorExpression();
185
186 std::unique_ptr<ASTExpression> bitwiseAndExpression();
187
188 std::unique_ptr<ASTExpression> equalityExpression();
189
190 std::unique_ptr<ASTExpression> relationalExpression();
191
192 std::unique_ptr<ASTExpression> shiftExpression();
193
194 std::unique_ptr<ASTExpression> additiveExpression();
195
196 std::unique_ptr<ASTExpression> multiplicativeExpression();
197
198 std::unique_ptr<ASTExpression> unaryExpression();
199
200 std::unique_ptr<ASTExpression> postfixExpression();
201
202 std::unique_ptr<ASTSuffix> suffix();
203
204 std::unique_ptr<ASTExpression> term();
205
206 bool intLiteral(int64_t* dest);
207
208 bool floatLiteral(double* dest);
209
210 bool boolLiteral(bool* dest);
211
Ethan Nicholas0df1b042017-03-31 13:56:23 -0400212 bool identifier(String* dest);
ethannicholasb3058bd2016-07-01 08:22:01 -0700213
ethannicholasb3058bd2016-07-01 08:22:01 -0700214 void* fScanner;
Ethan Nicholasbfe15f62017-03-01 11:46:51 -0500215 void* fLayoutScanner;
ethannicholasb3058bd2016-07-01 08:22:01 -0700216 YY_BUFFER_STATE fBuffer;
ethannicholascad64162016-10-27 10:54:02 -0700217 // current parse depth, used to enforce a recursion limit to try to keep us from overflowing the
218 // stack on pathological inputs
219 int fDepth = 0;
ethannicholasb3058bd2016-07-01 08:22:01 -0700220 Token fPushback;
221 SymbolTable& fTypes;
222 ErrorReporter& fErrors;
ethannicholascad64162016-10-27 10:54:02 -0700223
224 friend class AutoDepth;
ethannicholasb3058bd2016-07-01 08:22:01 -0700225};
226
227} // namespace
228
229#endif