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

Side by Side Diff: tools/gn/parse_tree.h

Issue 21114002: Add initial prototype for the GN meta-buildsystem. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add owners and readme Created 7 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « tools/gn/output_stream.h ('k') | tools/gn/parse_tree.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef TOOLS_GN_PARSE_TREE_H_
6 #define TOOLS_GN_PARSE_TREE_H_
7
8 #include <vector>
9
10 #include "base/basictypes.h"
11 #include "base/compiler_specific.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "tools/gn/err.h"
14 #include "tools/gn/token.h"
15 #include "tools/gn/value.h"
16
17 class AccessorNode;
18 class BinaryOpNode;
19 class BlockNode;
20 class ConditionNode;
21 class FunctionCallNode;
22 class IdentifierNode;
23 class ListNode;
24 class LiteralNode;
25 class Scope;
26 class UnaryOpNode;
27
28 // ParseNode -------------------------------------------------------------------
29
30 // A node in the AST.
31 class ParseNode {
32 public:
33 ParseNode();
34 virtual ~ParseNode();
35
36 virtual const AccessorNode* AsAccessor() const;
37 virtual const BinaryOpNode* AsBinaryOp() const;
38 virtual const BlockNode* AsBlock() const;
39 virtual const ConditionNode* AsConditionNode() const;
40 virtual const FunctionCallNode* AsFunctionCall() const;
41 virtual const IdentifierNode* AsIdentifier() const;
42 virtual const ListNode* AsList() const;
43 virtual const LiteralNode* AsLiteral() const;
44 virtual const UnaryOpNode* AsUnaryOp() const;
45
46 virtual Value Execute(Scope* scope, Err* err) const = 0;
47
48 virtual LocationRange GetRange() const = 0;
49
50 // Returns an error with the given messages and the range set to something
51 // that indicates this node.
52 virtual Err MakeErrorDescribing(
53 const std::string& msg,
54 const std::string& help = std::string()) const = 0;
55
56 // Prints a representation of this node to the given string, indenting
57 // by the given number of spaces.
58 virtual void Print(std::ostream& out, int indent) const = 0;
59
60 private:
61 DISALLOW_COPY_AND_ASSIGN(ParseNode);
62 };
63
64 // AccessorNode ----------------------------------------------------------------
65
66 // Access an array element.
67 //
68 // If we need to add support for member variables like "variable.len" I was
69 // thinking this would also handle that case.
70 class AccessorNode : public ParseNode {
71 public:
72 AccessorNode();
73 virtual ~AccessorNode();
74
75 virtual const AccessorNode* AsAccessor() const OVERRIDE;
76 virtual Value Execute(Scope* scope, Err* err) const OVERRIDE;
77 virtual LocationRange GetRange() const OVERRIDE;
78 virtual Err MakeErrorDescribing(
79 const std::string& msg,
80 const std::string& help = std::string()) const OVERRIDE;
81 virtual void Print(std::ostream& out, int indent) const OVERRIDE;
82
83 // Base is the thing on the left of the [], currently always required to be
84 // an identifier token.
85 const Token& base() const { return base_; }
86 void set_base(const Token& b) { base_ = b; }
87
88 // Index is the expression inside the [].
89 const ParseNode* index() const { return index_.get(); }
90 void set_index(scoped_ptr<ParseNode> i) { index_ = i.Pass(); }
91
92 private:
93 Token base_;
94 scoped_ptr<ParseNode> index_;
95
96 DISALLOW_COPY_AND_ASSIGN(AccessorNode);
97 };
98
99 // BinaryOpNode ----------------------------------------------------------------
100
101 class BinaryOpNode : public ParseNode {
102 public:
103 BinaryOpNode();
104 virtual ~BinaryOpNode();
105
106 virtual const BinaryOpNode* AsBinaryOp() const OVERRIDE;
107 virtual Value Execute(Scope* scope, Err* err) const OVERRIDE;
108 virtual LocationRange GetRange() const OVERRIDE;
109 virtual Err MakeErrorDescribing(
110 const std::string& msg,
111 const std::string& help = std::string()) const OVERRIDE;
112 virtual void Print(std::ostream& out, int indent) const OVERRIDE;
113
114 const Token& op() const { return op_; }
115 void set_op(const Token& t) { op_ = t; }
116
117 const ParseNode* left() const { return left_.get(); }
118 void set_left(scoped_ptr<ParseNode> left) {
119 left_ = left.Pass();
120 }
121
122 const ParseNode* right() const { return right_.get(); }
123 void set_right(scoped_ptr<ParseNode> right) {
124 right_ = right.Pass();
125 }
126
127 private:
128 scoped_ptr<ParseNode> left_;
129 Token op_;
130 scoped_ptr<ParseNode> right_;
131
132 DISALLOW_COPY_AND_ASSIGN(BinaryOpNode);
133 };
134
135 // BlockNode -------------------------------------------------------------------
136
137 class BlockNode : public ParseNode {
138 public:
139 // Set has_scope if this block introduces a nested scope.
140 BlockNode(bool has_scope);
141 virtual ~BlockNode();
142
143 virtual const BlockNode* AsBlock() const OVERRIDE;
144 virtual Value Execute(Scope* scope, Err* err) const OVERRIDE;
145 virtual LocationRange GetRange() const OVERRIDE;
146 virtual Err MakeErrorDescribing(
147 const std::string& msg,
148 const std::string& help = std::string()) const OVERRIDE;
149 virtual void Print(std::ostream& out, int indent) const OVERRIDE;
150
151 void set_begin_token(const Token* t) { begin_token_ = t; }
152 void set_end_token(const Token* t) { end_token_ = t; }
153
154 const std::vector<ParseNode*>& statements() const { return statements_; }
155 void append_statement(scoped_ptr<ParseNode> s) {
156 statements_.push_back(s.release());
157 }
158
159 // Doesn't create a nested scope.
160 Value ExecuteBlockInScope(Scope* our_scope, Err* err) const;
161
162 private:
163 bool has_scope_;
164
165 // Tokens corresponding to { and }, if any (may be NULL).
166 const Token* begin_token_;
167 const Token* end_token_;
168
169 // Owning pointers, use unique_ptr when we can use C++11.
170 std::vector<ParseNode*> statements_;
171
172 DISALLOW_COPY_AND_ASSIGN(BlockNode);
173 };
174
175 // ConditionNode ---------------------------------------------------------------
176
177 class ConditionNode : public ParseNode {
178 public:
179 ConditionNode();
180 virtual ~ConditionNode();
181
182 virtual const ConditionNode* AsConditionNode() const OVERRIDE;
183 virtual Value Execute(Scope* scope, Err* err) const OVERRIDE;
184 virtual LocationRange GetRange() const OVERRIDE;
185 virtual Err MakeErrorDescribing(
186 const std::string& msg,
187 const std::string& help = std::string()) const OVERRIDE;
188 virtual void Print(std::ostream& out, int indent) const OVERRIDE;
189
190 void set_if_token(const Token& token) { if_token_ = token; }
191
192 const ParseNode* condition() const { return condition_.get(); }
193 void set_condition(scoped_ptr<ParseNode> c) {
194 condition_ = c.Pass();
195 }
196
197 const BlockNode* if_true() const { return if_true_.get(); }
198 void set_if_true(scoped_ptr<BlockNode> t) {
199 if_true_ = t.Pass();
200 }
201
202 // This is either empty, a block (for the else clause), or another
203 // condition.
204 const ParseNode* if_false() const { return if_false_.get(); }
205 void set_if_false(scoped_ptr<ParseNode> f) {
206 if_false_ = f.Pass();
207 }
208
209 private:
210 // Token corresponding to the "if" string.
211 Token if_token_;
212
213 scoped_ptr<ParseNode> condition_; // Always non-null.
214 scoped_ptr<BlockNode> if_true_; // Always non-null.
215 scoped_ptr<ParseNode> if_false_; // May be null.
216
217 DISALLOW_COPY_AND_ASSIGN(ConditionNode);
218 };
219
220 // FunctionCallNode ------------------------------------------------------------
221
222 class FunctionCallNode : public ParseNode {
223 public:
224 FunctionCallNode();
225 virtual ~FunctionCallNode();
226
227 virtual const FunctionCallNode* AsFunctionCall() const OVERRIDE;
228 virtual Value Execute(Scope* scope, Err* err) const OVERRIDE;
229 virtual LocationRange GetRange() const OVERRIDE;
230 virtual Err MakeErrorDescribing(
231 const std::string& msg,
232 const std::string& help = std::string()) const OVERRIDE;
233 virtual void Print(std::ostream& out, int indent) const OVERRIDE;
234
235 const Token& function() const { return function_; }
236 void set_function(Token t) { function_ = t; }
237
238 const ListNode* args() const { return args_.get(); }
239 void set_args(scoped_ptr<ListNode> a) { args_ = a.Pass(); }
240
241 const BlockNode* block() const { return block_.get(); }
242 void set_block(scoped_ptr<BlockNode> b) { block_ = b.Pass(); }
243
244 private:
245 Token function_;
246 scoped_ptr<ListNode> args_;
247 scoped_ptr<BlockNode> block_; // May be null.
248
249 DISALLOW_COPY_AND_ASSIGN(FunctionCallNode);
250 };
251
252 // IdentifierNode --------------------------------------------------------------
253
254 class IdentifierNode : public ParseNode {
255 public:
256 IdentifierNode();
257 IdentifierNode(const Token& token);
258 virtual ~IdentifierNode();
259
260 virtual const IdentifierNode* AsIdentifier() const OVERRIDE;
261 virtual Value Execute(Scope* scope, Err* err) const OVERRIDE;
262 virtual LocationRange GetRange() const OVERRIDE;
263 virtual Err MakeErrorDescribing(
264 const std::string& msg,
265 const std::string& help = std::string()) const OVERRIDE;
266 virtual void Print(std::ostream& out, int indent) const OVERRIDE;
267
268 const Token& value() const { return value_; }
269 void set_value(const Token& t) { value_ = t; }
270
271 private:
272 Token value_;
273
274 DISALLOW_COPY_AND_ASSIGN(IdentifierNode);
275 };
276
277 // ListNode --------------------------------------------------------------------
278
279 class ListNode : public ParseNode {
280 public:
281 ListNode();
282 virtual ~ListNode();
283
284 virtual const ListNode* AsList() const OVERRIDE;
285 virtual Value Execute(Scope* scope, Err* err) const OVERRIDE;
286 virtual LocationRange GetRange() const OVERRIDE;
287 virtual Err MakeErrorDescribing(
288 const std::string& msg,
289 const std::string& help = std::string()) const OVERRIDE;
290 virtual void Print(std::ostream& out, int indent) const OVERRIDE;
291
292 void set_begin_token(const Token& t) { begin_token_ = t; }
293 void set_end_token(const Token& t) { end_token_ = t; }
294
295 void append_item(scoped_ptr<ParseNode> s) {
296 contents_.push_back(s.release());
297 }
298 const std::vector<ParseNode*>& contents() const { return contents_; }
299
300 private:
301 // Tokens corresponding to the [ and ].
302 Token begin_token_;
303 Token end_token_;
304
305 // Owning pointers, use unique_ptr when we can use C++11.
306 std::vector<ParseNode*> contents_;
307
308 DISALLOW_COPY_AND_ASSIGN(ListNode);
309 };
310
311 // LiteralNode -----------------------------------------------------------------
312
313 class LiteralNode : public ParseNode {
314 public:
315 LiteralNode();
316 LiteralNode(const Token& token);
317 virtual ~LiteralNode();
318
319 virtual const LiteralNode* AsLiteral() const OVERRIDE;
320 virtual Value Execute(Scope* scope, Err* err) const OVERRIDE;
321 virtual LocationRange GetRange() const OVERRIDE;
322 virtual Err MakeErrorDescribing(
323 const std::string& msg,
324 const std::string& help = std::string()) const OVERRIDE;
325 virtual void Print(std::ostream& out, int indent) const OVERRIDE;
326
327 const Token& value() const { return value_; }
328 void set_value(const Token& t) { value_ = t; }
329
330 private:
331 Token value_;
332
333 DISALLOW_COPY_AND_ASSIGN(LiteralNode);
334 };
335
336 // UnaryOpNode -----------------------------------------------------------------
337
338 class UnaryOpNode : public ParseNode {
339 public:
340 UnaryOpNode();
341 virtual ~UnaryOpNode();
342
343 virtual const UnaryOpNode* AsUnaryOp() const OVERRIDE;
344 virtual Value Execute(Scope* scope, Err* err) const OVERRIDE;
345 virtual LocationRange GetRange() const OVERRIDE;
346 virtual Err MakeErrorDescribing(
347 const std::string& msg,
348 const std::string& help = std::string()) const OVERRIDE;
349 virtual void Print(std::ostream& out, int indent) const OVERRIDE;
350
351 const Token& op() const { return op_; }
352 void set_op(const Token& t) { op_ = t; }
353
354 const ParseNode* operand() const { return operand_.get(); }
355 void set_operand(scoped_ptr<ParseNode> operand) {
356 operand_ = operand.Pass();
357 }
358
359 private:
360 Token op_;
361 scoped_ptr<ParseNode> operand_;
362
363 DISALLOW_COPY_AND_ASSIGN(UnaryOpNode);
364 };
365
366 #endif // TOOLS_GN_PARSE_TREE_H_
OLDNEW
« no previous file with comments | « tools/gn/output_stream.h ('k') | tools/gn/parse_tree.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698