parse_tree.h revision effb81e5f8246d0db0270817048dc992db66e9fb
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 66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Access an array or scope element. 67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// 68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Currently, such values are only read-only. In that you can do: 69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// a = obj1.a 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// b = obj2[0] 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// But not 72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// obj1.a = 5 73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// obj2[0] = 6 74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// 75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// In the current design where the dot operator is used only for templates, we 76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// explicitly don't want to allow you to do "invoker.foo = 5", so if we added 77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// support for accessors to be lvalues, we would also need to add some concept 78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// of a constant scope. Supporting this would also add a lot of complications 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// to the operator= implementation, since some accessors might return values 80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// in the const root scope that shouldn't be modified. Without a strong 81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// use-case for this, it seems simpler to just disallow it. 82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// 83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Additionally, the left-hand-side of the accessor must currently be an 84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// identifier. So you can't do things like: 85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// function_call()[1] 86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// a = b.c.d 87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// These are easier to implement if we needed them but given the very limited 88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// use cases for this, it hasn't seemed worth the bother. 89d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass AccessorNode : public ParseNode { 90d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 91d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch AccessorNode(); 92d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~AccessorNode(); 93d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 94d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const AccessorNode* AsAccessor() const OVERRIDE; 95d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 96d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 97d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 98d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 99d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 100d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 101d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Base is the thing on the left of the [] or dot, currently always required 103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // to be an identifier token. 104d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Token& base() const { return base_; } 105d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_base(const Token& b) { base_ = b; } 106d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Index is the expression inside the []. Will be null if member is set. 108d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const ParseNode* index() const { return index_.get(); } 109d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_index(scoped_ptr<ParseNode> i) { index_ = i.Pass(); } 110d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // The member is the identifier on the right hand side of the dot. Will be 112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // null if the index is set. 113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const IdentifierNode* member() const { return member_.get(); } 114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void set_member(scoped_ptr<IdentifierNode> i) { member_ = i.Pass(); } 115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 116d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Value ExecuteArrayAccess(Scope* scope, Err* err) const; 118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Value ExecuteScopeAccess(Scope* scope, Err* err) const; 119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 120d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token base_; 121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Either index or member will be set according to what type of access this 123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // is. 124d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<ParseNode> index_; 125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<IdentifierNode> member_; 126d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 127d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(AccessorNode); 128d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 129d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 130d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// BinaryOpNode ---------------------------------------------------------------- 131d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 132d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass BinaryOpNode : public ParseNode { 133d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 134d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch BinaryOpNode(); 135d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~BinaryOpNode(); 136d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 137d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const BinaryOpNode* AsBinaryOp() const OVERRIDE; 138d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 139d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 140d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 141d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 142d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 143d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 144d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 145d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Token& op() const { return op_; } 146d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_op(const Token& t) { op_ = t; } 147d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 148d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const ParseNode* left() const { return left_.get(); } 149d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_left(scoped_ptr<ParseNode> left) { 150d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch left_ = left.Pass(); 151d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 152d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 153d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const ParseNode* right() const { return right_.get(); } 154d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_right(scoped_ptr<ParseNode> right) { 155d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch right_ = right.Pass(); 156d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 157d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 158d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 159d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<ParseNode> left_; 160d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token op_; 161d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<ParseNode> right_; 162d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 163d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(BinaryOpNode); 164d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 165d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 166d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// BlockNode ------------------------------------------------------------------- 167d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 168d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass BlockNode : public ParseNode { 169d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 170d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Set has_scope if this block introduces a nested scope. 1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) explicit BlockNode(bool has_scope); 172d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~BlockNode(); 173d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 174d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const BlockNode* AsBlock() const OVERRIDE; 175d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 176d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 177d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 178d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 179d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 180d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 181d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void set_begin_token(const Token& t) { begin_token_ = t; } 1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void set_end_token(const Token& t) { end_token_ = t; } 184d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 185d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::vector<ParseNode*>& statements() const { return statements_; } 186d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void append_statement(scoped_ptr<ParseNode> s) { 187d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch statements_.push_back(s.release()); 188d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 189d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 190d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Doesn't create a nested scope. 191d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Value ExecuteBlockInScope(Scope* our_scope, Err* err) const; 192d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 193d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 194d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch bool has_scope_; 195d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 196d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Tokens corresponding to { and }, if any (may be NULL). 1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Token begin_token_; 1983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Token end_token_; 199d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 200d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Owning pointers, use unique_ptr when we can use C++11. 201d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::vector<ParseNode*> statements_; 202d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 203d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(BlockNode); 204d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 205d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 206d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// ConditionNode --------------------------------------------------------------- 207d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 208d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass ConditionNode : public ParseNode { 209d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 210d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch ConditionNode(); 211d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~ConditionNode(); 212d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 213d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const ConditionNode* AsConditionNode() const OVERRIDE; 214d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 215d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 216d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 217d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 218d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 219d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 220d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 221d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_if_token(const Token& token) { if_token_ = token; } 222d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 223d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const ParseNode* condition() const { return condition_.get(); } 224d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_condition(scoped_ptr<ParseNode> c) { 225d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch condition_ = c.Pass(); 226d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 227d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 228d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const BlockNode* if_true() const { return if_true_.get(); } 229d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_if_true(scoped_ptr<BlockNode> t) { 230d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if_true_ = t.Pass(); 231d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 232d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 233d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // This is either empty, a block (for the else clause), or another 234d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // condition. 235d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const ParseNode* if_false() const { return if_false_.get(); } 236d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_if_false(scoped_ptr<ParseNode> f) { 237d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if_false_ = f.Pass(); 238d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 239d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 240d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 241d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Token corresponding to the "if" string. 242d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token if_token_; 243d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 244d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<ParseNode> condition_; // Always non-null. 245d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<BlockNode> if_true_; // Always non-null. 246d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<ParseNode> if_false_; // May be null. 247d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 248d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(ConditionNode); 249d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 250d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 251d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// FunctionCallNode ------------------------------------------------------------ 252d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 253d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass FunctionCallNode : public ParseNode { 254d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 255d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch FunctionCallNode(); 256d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~FunctionCallNode(); 257d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 258d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const FunctionCallNode* AsFunctionCall() const OVERRIDE; 259d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 260d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 261d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 262d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 263d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 264d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 265d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 266d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Token& function() const { return function_; } 267d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_function(Token t) { function_ = t; } 268d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 269d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const ListNode* args() const { return args_.get(); } 270d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_args(scoped_ptr<ListNode> a) { args_ = a.Pass(); } 271d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 272d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const BlockNode* block() const { return block_.get(); } 273d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_block(scoped_ptr<BlockNode> b) { block_ = b.Pass(); } 274d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 275d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 276d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token function_; 277d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<ListNode> args_; 278d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<BlockNode> block_; // May be null. 279d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 280d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(FunctionCallNode); 281d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 282d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 283d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// IdentifierNode -------------------------------------------------------------- 284d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 285d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass IdentifierNode : public ParseNode { 286d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 287d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch IdentifierNode(); 288d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch IdentifierNode(const Token& token); 289d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~IdentifierNode(); 290d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 291d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const IdentifierNode* AsIdentifier() const OVERRIDE; 292d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 293d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 294d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 295d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 296d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 297d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 298d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 299d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Token& value() const { return value_; } 300d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_value(const Token& t) { value_ = t; } 301d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 302d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 303d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token value_; 304d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 305d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(IdentifierNode); 306d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 307d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 308d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// ListNode -------------------------------------------------------------------- 309d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 310d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass ListNode : public ParseNode { 311d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 312d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch ListNode(); 313d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~ListNode(); 314d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 315d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const ListNode* AsList() const OVERRIDE; 316d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 317d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 318d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 319d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 320d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 321d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 322d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 323d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_begin_token(const Token& t) { begin_token_ = t; } 324d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_end_token(const Token& t) { end_token_ = t; } 325d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 326d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void append_item(scoped_ptr<ParseNode> s) { 327d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch contents_.push_back(s.release()); 328d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 3293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<const ParseNode*>& contents() const { return contents_; } 330d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 331d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 332d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Tokens corresponding to the [ and ]. 333d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token begin_token_; 334d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token end_token_; 335d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 336d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Owning pointers, use unique_ptr when we can use C++11. 3373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::vector<const ParseNode*> contents_; 338d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 339d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(ListNode); 340d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 341d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 342d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// LiteralNode ----------------------------------------------------------------- 343d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 344d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass LiteralNode : public ParseNode { 345d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 346d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch LiteralNode(); 347d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch LiteralNode(const Token& token); 348d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~LiteralNode(); 349d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 350d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const LiteralNode* AsLiteral() const OVERRIDE; 351d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 352d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 353d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 354d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 355d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 356d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 357d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 358d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Token& value() const { return value_; } 359d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_value(const Token& t) { value_ = t; } 360d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 361d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 362d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token value_; 363d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 364d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(LiteralNode); 365d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 366d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 367d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// UnaryOpNode ----------------------------------------------------------------- 368d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 369d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass UnaryOpNode : public ParseNode { 370d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 371d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch UnaryOpNode(); 372d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~UnaryOpNode(); 373d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 374d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const UnaryOpNode* AsUnaryOp() const OVERRIDE; 375d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 376d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 377d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 378d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 379d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 380d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 381d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 382d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Token& op() const { return op_; } 383d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_op(const Token& t) { op_ = t; } 384d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 385d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const ParseNode* operand() const { return operand_.get(); } 386d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_operand(scoped_ptr<ParseNode> operand) { 387d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch operand_ = operand.Pass(); 388d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 389d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 390d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 391d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token op_; 392d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<ParseNode> operand_; 393d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 394d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(UnaryOpNode); 395d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 396d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 397d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#endif // TOOLS_GN_PARSE_TREE_H_ 398