parse_tree.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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