1 // Copyright 2015 Google Inc. All rights reserved
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef STMT_H_
16 #define STMT_H_
17 
18 #include <string>
19 #include <vector>
20 
21 #include "loc.h"
22 #include "string_piece.h"
23 #include "symtab.h"
24 
25 using namespace std;
26 
27 class Evaluator;
28 class Value;
29 
30 enum struct AssignOp {
31   EQ,
32   COLON_EQ,
33   PLUS_EQ,
34   QUESTION_EQ,
35 };
36 
37 enum struct AssignDirective {
38   NONE = 0,
39   OVERRIDE = 1,
40   EXPORT = 2,
41 };
42 
43 enum struct CondOp {
44   IFEQ,
45   IFNEQ,
46   IFDEF,
47   IFNDEF,
48 };
49 
50 struct Stmt {
51  public:
52   virtual ~Stmt();
53 
locStmt54   Loc loc() const { return loc_; }
set_locStmt55   void set_loc(Loc loc) { loc_ = loc; }
origStmt56   StringPiece orig() const { return orig_; }
57 
58   virtual void Eval(Evaluator* ev) const = 0;
59 
60   virtual string DebugString() const = 0;
61 
62  protected:
63   Stmt();
64 
65  private:
66   Loc loc_;
67   StringPiece orig_;
68 };
69 
70 struct RuleStmt : public Stmt {
71   Value* expr;
72   char term;
73   Value* after_term;
74 
75   virtual ~RuleStmt();
76 
77   virtual void Eval(Evaluator* ev) const;
78 
79   virtual string DebugString() const;
80 };
81 
82 struct AssignStmt : public Stmt {
83   Value* lhs;
84   Value* rhs;
85   StringPiece orig_rhs;
86   AssignOp op;
87   AssignDirective directive;
88 
AssignStmtAssignStmt89   AssignStmt() : lhs_sym_cache_(Symbol::IsUninitialized{}) {}
90   virtual ~AssignStmt();
91 
92   virtual void Eval(Evaluator* ev) const;
93 
94   virtual string DebugString() const;
95 
96   Symbol GetLhsSymbol(Evaluator* ev) const;
97 
98  private:
99   mutable Symbol lhs_sym_cache_;
100 };
101 
102 struct CommandStmt : public Stmt {
103   Value* expr;
104   StringPiece orig;
105 
106   virtual ~CommandStmt();
107 
108   virtual void Eval(Evaluator* ev) const;
109 
110   virtual string DebugString() const;
111 };
112 
113 struct IfStmt : public Stmt {
114   CondOp op;
115   Value* lhs;
116   Value* rhs;
117   vector<Stmt*> true_stmts;
118   vector<Stmt*> false_stmts;
119 
120   virtual ~IfStmt();
121 
122   virtual void Eval(Evaluator* ev) const;
123 
124   virtual string DebugString() const;
125 };
126 
127 struct IncludeStmt : public Stmt {
128   Value* expr;
129   bool should_exist;
130 
131   virtual ~IncludeStmt();
132 
133   virtual void Eval(Evaluator* ev) const;
134 
135   virtual string DebugString() const;
136 };
137 
138 struct ExportStmt : public Stmt {
139   Value* expr;
140   bool is_export;
141 
142   virtual ~ExportStmt();
143 
144   virtual void Eval(Evaluator* ev) const;
145 
146   virtual string DebugString() const;
147 };
148 
149 struct ParseErrorStmt : public Stmt {
150   string msg;
151 
152   virtual ~ParseErrorStmt();
153 
154   virtual void Eval(Evaluator* ev) const;
155 
156   virtual string DebugString() const;
157 };
158 
159 #endif  // STMT_H_
160