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