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