11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 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; 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BlockCommentNode; 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass Comments { 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Comments(); 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~Comments(); 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<Token>& before() const { return before_; } 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void append_before(Token c) { 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci before_.push_back(c); 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<Token>& suffix() const { return suffix_; } 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void append_suffix(Token c) { 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci suffix_.push_back(c); 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Reverse the order of the suffix comments. When walking the tree in 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // post-order we append suffix comments in reverse order, so this fixes them 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // up. 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void ReverseSuffix(); 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<Token>& after() const { return after_; } 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void append_after(Token c) { 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci after_.push_back(c); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Whole line comments before the expression. 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<Token> before_; 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // End-of-line comments after this expression. 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<Token> suffix_; 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // For top-level expressions only, after_ lists whole-line comments 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // following the expression. 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<Token> after_; 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(Comments); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// ParseNode ------------------------------------------------------------------- 68d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 69d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// A node in the AST. 70d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass ParseNode { 71d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 72d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch ParseNode(); 73d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~ParseNode(); 74d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 75d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const AccessorNode* AsAccessor() const; 76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const BinaryOpNode* AsBinaryOp() const; 77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const BlockNode* AsBlock() const; 78d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const ConditionNode* AsConditionNode() const; 79d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const FunctionCallNode* AsFunctionCall() const; 80d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const IdentifierNode* AsIdentifier() const; 81d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const ListNode* AsList() const; 82d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const LiteralNode* AsLiteral() const; 83d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const UnaryOpNode* AsUnaryOp() const; 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual const BlockCommentNode* AsBlockComment() const; 85d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 86d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const = 0; 87d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 88d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const = 0; 89d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 90d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Returns an error with the given messages and the range set to something 91d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // that indicates this node. 92d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 93d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 94d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const = 0; 95d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 96d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Prints a representation of this node to the given string, indenting 97d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // by the given number of spaces. 98d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const = 0; 99d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const Comments* comments() const { return comments_.get(); } 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Comments* comments_mutable(); 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void PrintComments(std::ostream& out, int indent) const; 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 104d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<Comments> comments_; 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 107d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(ParseNode); 108d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 109d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 110d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// AccessorNode ---------------------------------------------------------------- 111d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Access an array or scope element. 113d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// 114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Currently, such values are only read-only. In that you can do: 115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// a = obj1.a 116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// b = obj2[0] 117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// But not 118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// obj1.a = 5 119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// obj2[0] = 6 120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// 121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// In the current design where the dot operator is used only for templates, we 122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// explicitly don't want to allow you to do "invoker.foo = 5", so if we added 123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// support for accessors to be lvalues, we would also need to add some concept 124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// of a constant scope. Supporting this would also add a lot of complications 125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// to the operator= implementation, since some accessors might return values 126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// in the const root scope that shouldn't be modified. Without a strong 127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// use-case for this, it seems simpler to just disallow it. 128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// 129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Additionally, the left-hand-side of the accessor must currently be an 130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// identifier. So you can't do things like: 131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// function_call()[1] 132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// a = b.c.d 133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// These are easier to implement if we needed them but given the very limited 134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// use cases for this, it hasn't seemed worth the bother. 135d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass AccessorNode : public ParseNode { 136d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 137d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch AccessorNode(); 138d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~AccessorNode(); 139d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 140d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const AccessorNode* AsAccessor() const OVERRIDE; 141d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 142d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 143d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 144d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 145d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 146d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 147d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Base is the thing on the left of the [] or dot, currently always required 149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // to be an identifier token. 150d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Token& base() const { return base_; } 151d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_base(const Token& b) { base_ = b; } 152d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Index is the expression inside the []. Will be null if member is set. 154d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const ParseNode* index() const { return index_.get(); } 155d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_index(scoped_ptr<ParseNode> i) { index_ = i.Pass(); } 156d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // The member is the identifier on the right hand side of the dot. Will be 158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // null if the index is set. 159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const IdentifierNode* member() const { return member_.get(); } 160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void set_member(scoped_ptr<IdentifierNode> i) { member_ = i.Pass(); } 161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 162d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Value ExecuteArrayAccess(Scope* scope, Err* err) const; 164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Value ExecuteScopeAccess(Scope* scope, Err* err) const; 165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 166d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token base_; 167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Either index or member will be set according to what type of access this 169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // is. 170d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<ParseNode> index_; 171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<IdentifierNode> member_; 172d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 173d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(AccessorNode); 174d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 175d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 176d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// BinaryOpNode ---------------------------------------------------------------- 177d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 178d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass BinaryOpNode : public ParseNode { 179d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 180d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch BinaryOpNode(); 181d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~BinaryOpNode(); 182d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 183d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const BinaryOpNode* AsBinaryOp() const OVERRIDE; 184d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 185d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 186d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 187d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 188d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 189d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 190d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 191d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Token& op() const { return op_; } 192d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_op(const Token& t) { op_ = t; } 193d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 194d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const ParseNode* left() const { return left_.get(); } 195d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_left(scoped_ptr<ParseNode> left) { 196d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch left_ = left.Pass(); 197d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 198d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 199d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const ParseNode* right() const { return right_.get(); } 200d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_right(scoped_ptr<ParseNode> right) { 201d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch right_ = right.Pass(); 202d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 203d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 204d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 205d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<ParseNode> left_; 206d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token op_; 207d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<ParseNode> right_; 208d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 209d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(BinaryOpNode); 210d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 211d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 212d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// BlockNode ------------------------------------------------------------------- 213d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 214d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass BlockNode : public ParseNode { 215d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 216d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Set has_scope if this block introduces a nested scope. 2173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) explicit BlockNode(bool has_scope); 218d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~BlockNode(); 219d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 220d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const BlockNode* AsBlock() const OVERRIDE; 221d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 222d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 223d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 224d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 225d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 226d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 227d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void set_begin_token(const Token& t) { begin_token_ = t; } 2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void set_end_token(const Token& t) { end_token_ = t; } 230d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 231d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::vector<ParseNode*>& statements() const { return statements_; } 232d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void append_statement(scoped_ptr<ParseNode> s) { 233d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch statements_.push_back(s.release()); 234d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 235d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 236d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Doesn't create a nested scope. 237d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Value ExecuteBlockInScope(Scope* our_scope, Err* err) const; 238d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 239d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 240d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch bool has_scope_; 241d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 242d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Tokens corresponding to { and }, if any (may be NULL). 2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Token begin_token_; 2443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Token end_token_; 245d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 246d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Owning pointers, use unique_ptr when we can use C++11. 247d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch std::vector<ParseNode*> statements_; 248d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 249d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(BlockNode); 250d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 251d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 252d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// ConditionNode --------------------------------------------------------------- 253d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 254d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass ConditionNode : public ParseNode { 255d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 256d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch ConditionNode(); 257d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~ConditionNode(); 258d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 259d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const ConditionNode* AsConditionNode() const OVERRIDE; 260d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 261d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 262d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 263d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 264d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 265d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 266d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 267d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_if_token(const Token& token) { if_token_ = token; } 268d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 269d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const ParseNode* condition() const { return condition_.get(); } 270d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_condition(scoped_ptr<ParseNode> c) { 271d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch condition_ = c.Pass(); 272d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 273d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 274d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const BlockNode* if_true() const { return if_true_.get(); } 275d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_if_true(scoped_ptr<BlockNode> t) { 276d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if_true_ = t.Pass(); 277d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 278d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 279d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // This is either empty, a block (for the else clause), or another 280d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // condition. 281d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const ParseNode* if_false() const { return if_false_.get(); } 282d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_if_false(scoped_ptr<ParseNode> f) { 283d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if_false_ = f.Pass(); 284d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 285d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 286d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 287d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Token corresponding to the "if" string. 288d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token if_token_; 289d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 290d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<ParseNode> condition_; // Always non-null. 291d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<BlockNode> if_true_; // Always non-null. 292d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<ParseNode> if_false_; // May be null. 293d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 294d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(ConditionNode); 295d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 296d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 297d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// FunctionCallNode ------------------------------------------------------------ 298d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 299d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass FunctionCallNode : public ParseNode { 300d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 301d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch FunctionCallNode(); 302d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~FunctionCallNode(); 303d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 304d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const FunctionCallNode* AsFunctionCall() const OVERRIDE; 305d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 306d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 307d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 308d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 309d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 310d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 311d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 312d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Token& function() const { return function_; } 313d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_function(Token t) { function_ = t; } 314d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 315d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const ListNode* args() const { return args_.get(); } 316d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_args(scoped_ptr<ListNode> a) { args_ = a.Pass(); } 317d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 318d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const BlockNode* block() const { return block_.get(); } 319d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_block(scoped_ptr<BlockNode> b) { block_ = b.Pass(); } 320d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 321d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 322d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token function_; 323d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<ListNode> args_; 324d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<BlockNode> block_; // May be null. 325d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 326d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(FunctionCallNode); 327d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 328d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 329d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// IdentifierNode -------------------------------------------------------------- 330d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 331d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass IdentifierNode : public ParseNode { 332d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 333d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch IdentifierNode(); 334d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch IdentifierNode(const Token& token); 335d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~IdentifierNode(); 336d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 337d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const IdentifierNode* AsIdentifier() const OVERRIDE; 338d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 339d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 340d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 341d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 342d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 343d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 344d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 345d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Token& value() const { return value_; } 346d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_value(const Token& t) { value_ = t; } 347d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 348d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 349d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token value_; 350d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 351d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(IdentifierNode); 352d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 353d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 354d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// ListNode -------------------------------------------------------------------- 355d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 356d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass ListNode : public ParseNode { 357d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 358d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch ListNode(); 359d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~ListNode(); 360d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 361d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const ListNode* AsList() const OVERRIDE; 362d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 363d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 364d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 365d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 366d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 367d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 368d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 369d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_begin_token(const Token& t) { begin_token_ = t; } 370d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_end_token(const Token& t) { end_token_ = t; } 371d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 372d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void append_item(scoped_ptr<ParseNode> s) { 373d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch contents_.push_back(s.release()); 374d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 3753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<const ParseNode*>& contents() const { return contents_; } 376d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 377d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 378d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Tokens corresponding to the [ and ]. 379d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token begin_token_; 380d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token end_token_; 381d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 382d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // Owning pointers, use unique_ptr when we can use C++11. 3833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::vector<const ParseNode*> contents_; 384d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 385d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(ListNode); 386d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 387d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 388d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// LiteralNode ----------------------------------------------------------------- 389d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 390d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass LiteralNode : public ParseNode { 391d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 392d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch LiteralNode(); 393d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch LiteralNode(const Token& token); 394d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~LiteralNode(); 395d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 396d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const LiteralNode* AsLiteral() const OVERRIDE; 397d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 398d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 399d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 400d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 401d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 402d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 403d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 404d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Token& value() const { return value_; } 405d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_value(const Token& t) { value_ = t; } 406d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 407d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 408d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token value_; 409d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 410d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(LiteralNode); 411d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 412d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 413d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// UnaryOpNode ----------------------------------------------------------------- 414d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 415d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochclass UnaryOpNode : public ParseNode { 416d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch public: 417d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch UnaryOpNode(); 418d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual ~UnaryOpNode(); 419d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 420d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual const UnaryOpNode* AsUnaryOp() const OVERRIDE; 421d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 422d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual LocationRange GetRange() const OVERRIDE; 423d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual Err MakeErrorDescribing( 424d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& msg, 425d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const std::string& help = std::string()) const OVERRIDE; 426d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch virtual void Print(std::ostream& out, int indent) const OVERRIDE; 427d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 428d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const Token& op() const { return op_; } 429d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_op(const Token& t) { op_ = t; } 430d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 431d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch const ParseNode* operand() const { return operand_.get(); } 432d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch void set_operand(scoped_ptr<ParseNode> operand) { 433d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch operand_ = operand.Pass(); 434d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 435d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 436d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch private: 437d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch Token op_; 438d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch scoped_ptr<ParseNode> operand_; 439d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 440d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch DISALLOW_COPY_AND_ASSIGN(UnaryOpNode); 441d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}; 442d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// BlockCommentNode ------------------------------------------------------------ 4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This node type is only used for standalone comments (that is, those not 4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// specifically attached to another syntax element. The most common of these 4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// is a standard header block. This node contains only the last line of such 4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// a comment block as the anchor, and other lines of the block comment are 4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// hung off of it as Before comments, similar to other syntax elements. 4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BlockCommentNode : public ParseNode { 4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BlockCommentNode(); 4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~BlockCommentNode(); 4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual const BlockCommentNode* AsBlockComment() const OVERRIDE; 4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual Value Execute(Scope* scope, Err* err) const OVERRIDE; 4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual LocationRange GetRange() const OVERRIDE; 4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual Err MakeErrorDescribing( 4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& msg, 4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& help = std::string()) const OVERRIDE; 4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Print(std::ostream& out, int indent) const OVERRIDE; 4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const Token& comment() const { return comment_; } 4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void set_comment(const Token& t) { comment_ = t; } 4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Token comment_; 4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(BlockCommentNode); 4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 472d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#endif // TOOLS_GN_PARSE_TREE_H_ 473