Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(378)

Side by Side Diff: src/sksl/SkSLParser.h

Issue 1984363002: initial checkin of SkSL compiler (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: more comments from Ben Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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 <string>
12 #include <vector>
13 #include <unordered_set>
14 #include "SkSLErrorReporter.h"
15 #include "SkSLToken.h"
16
17 struct yy_buffer_state;
18 #define YY_TYPEDEF_YY_BUFFER_STATE
19 typedef struct yy_buffer_state *YY_BUFFER_STATE;
20
21 namespace SkSL {
22
23 struct ASTBlock;
24 struct ASTBreakStatement;
25 struct ASTContinueStatement;
26 struct ASTDeclaration;
27 struct ASTDiscardStatement;
28 struct ASTDoStatement;
29 struct ASTExpression;
30 struct ASTExpressionStatement;
31 struct ASTForStatement;
32 struct ASTIfStatement;
33 struct ASTInterfaceBlock;
34 struct ASTLayout;
35 struct ASTModifiers;
36 struct ASTParameter;
37 struct ASTReturnStatement;
38 struct ASTStatement;
39 struct ASTSuffix;
40 struct ASTType;
41 struct ASTWhileStatement;
42 struct ASTVarDeclaration;
43 class SymbolTable;
44
45 /**
46 * Consumes .sksl text and produces an abstract syntax tree describing the conte nts.
47 */
48 class Parser {
49 public:
50 Parser(std::string text, std::shared_ptr<SymbolTable> types, ErrorReporter& errors);
dogben 2016/06/21 17:53:48 nit: Would "const std::string& text" work here? n
51
52 ~Parser();
53
54 /**
55 * Consumes a complete .sksl file and produces a list of declarations. Error s are reported via
56 * the ErrorReporter; the return value may contain some declarations even wh en errors have
57 * occurred.
58 */
59 std::vector<std::unique_ptr<ASTDeclaration>> file();
60
61 // these functions parse individual grammar rules from the current parse pos ition; you probably
62 // don't need to call any of these outside of the parser. The function decla rations in the .cpp
63 // file have comments describing the grammar rules.
64
65 std::unique_ptr<ASTDeclaration> directive();
66
67 void precision();
68
69 std::unique_ptr<ASTDeclaration> declaration();
70
71 std::unique_ptr<ASTType> type();
72
73 std::unique_ptr<ASTParameter> parameter();
74
75 ASTLayout layout();
76
77 ASTModifiers modifiers();
78
79 std::unique_ptr<ASTStatement> statement();
80
81 std::unique_ptr<ASTType> structDeclaration();
82
83 std::unique_ptr<ASTVarDeclaration> varDeclaration();
84
85 std::unique_ptr<ASTDeclaration> interfaceBlock(ASTModifiers mods);
86
87 std::unique_ptr<ASTIfStatement> ifStatement();
88
89 std::unique_ptr<ASTWhileStatement> whileStatement();
90
91 std::unique_ptr<ASTDoStatement> doStatement();
92
93 std::unique_ptr<ASTForStatement> forStatement();
94
95 std::unique_ptr<ASTReturnStatement> returnStatement();
96
97 std::unique_ptr<ASTBreakStatement> breakStatement();
98
99 std::unique_ptr<ASTContinueStatement> continueStatement();
100
101 std::unique_ptr<ASTDiscardStatement> discardStatement();
102
103 std::unique_ptr<ASTBlock> block();
104
105 std::unique_ptr<ASTExpressionStatement> expressionStatement();
106
107 std::unique_ptr<ASTExpression> expression();
108
109 std::unique_ptr<ASTExpression> assignmentExpression();
110
111 std::unique_ptr<ASTExpression> ternaryExpression();
112
113 std::unique_ptr<ASTExpression> logicalOrExpression();
114
115 std::unique_ptr<ASTExpression> logicalXorExpression();
116
117 std::unique_ptr<ASTExpression> logicalAndExpression();
118
119 std::unique_ptr<ASTExpression> bitwiseOrExpression();
120
121 std::unique_ptr<ASTExpression> bitwiseXorExpression();
122
123 std::unique_ptr<ASTExpression> bitwiseAndExpression();
124
125 std::unique_ptr<ASTExpression> equalityExpression();
126
127 std::unique_ptr<ASTExpression> relationalExpression();
128
129 std::unique_ptr<ASTExpression> shiftExpression();
130
131 std::unique_ptr<ASTExpression> additiveExpression();
132
133 std::unique_ptr<ASTExpression> multiplicativeExpression();
134
135 std::unique_ptr<ASTExpression> unaryExpression();
136
137 std::unique_ptr<ASTExpression> postfixExpression();
138
139 std::unique_ptr<ASTSuffix> suffix();
140
141 std::unique_ptr<ASTExpression> term();
142
143 bool intLiteral(int64_t* dest);
144
145 bool floatLiteral(double* dest);
146
147 bool boolLiteral(bool* dest);
148
149 bool identifier(std::string* dest);
150
151 std::unique_ptr<ASTVarDeclaration> varDeclarationEnd(ASTModifiers modifiers,
152 std::unique_ptr<ASTType > type,
153 std::string name);
154
155 /**
156 * Return the next token from the parse stream.
157 */
158 Token nextToken();
159
160 /**
161 * Push a token back onto the parse stream, so that it is the next one read. Only a single level
162 * of pushback is supported (that is, it is an error to call pushback() twic e in a row without
163 * an intervening nextToken()).
dogben 2016/06/21 17:53:48 nit: Maybe also note that you can't call pushback
164 */
165 void pushback(Token t);
166
167 /**
168 * Returns the next token without consuming it from the stream.
169 */
170 Token peek();
171
172 /**
173 * Reads the next token and generates an error if it is not the expected typ e. The 'expected'
174 * string is part of the error message, which reads:
175 *
176 * "expected <expected>, but found '<actual text>'"
177 *
178 * If 'result' is non-null, it is set to point to the token that was read.
179 * Returns true if the read token was as expected, false otherwise.
180 */
181 bool expect(Token::Kind kind, std::string expected, Token* result = nullptr) ;
182
183 void error(Position p, std::string msg);
184
185 /**
186 * Returns true if the 'name' identifier refers to a type name. For instance , isType("int") will
187 * always return true.
188 */
189 bool isType(std::string name);
190
191 void* fScanner;
dogben 2016/06/21 17:53:48 nit: Any reason not to make fields and helper meth
192 YY_BUFFER_STATE fBuffer;
193 Token fPushback;
194 std::shared_ptr<SymbolTable> fTypes;
195 ErrorReporter& fErrors;
196 };
197
198 } // namespace
199
200 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698