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