blob: a08cc876529d900d5a61969cdd9d68826fbddd92 [file] [log] [blame]
Shinichiro Hamaji1d545aa2015-06-23 15:29:13 +09001// 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
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090015#ifndef STMT_H_
16#define STMT_H_
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090017
18#include <string>
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +090019#include <vector>
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090020
21#include "loc.h"
22#include "string_piece.h"
Shinichiro Hamaji92a47382016-02-17 17:19:21 +090023#include "symtab.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090024
25using namespace std;
26
27class Evaluator;
Shinichiro Hamajif24ed142015-07-13 20:57:42 -070028class Value;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090029
30enum struct AssignOp {
31 EQ,
32 COLON_EQ,
33 PLUS_EQ,
34 QUESTION_EQ,
35};
36
Dan Willemsen3ce083f2017-10-11 22:17:48 -070037enum struct AssignDirective {
Shinichiro Hamaji420f7752015-06-26 04:02:02 +090038 NONE = 0,
39 OVERRIDE = 1,
40 EXPORT = 2,
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090041};
42
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +090043enum struct CondOp {
44 IFEQ,
45 IFNEQ,
46 IFDEF,
47 IFNDEF,
48};
49
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090050struct Stmt {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090051 public:
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090052 virtual ~Stmt();
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090053
54 Loc loc() const { return loc_; }
55 void set_loc(Loc loc) { loc_ = loc; }
56 StringPiece orig() const { return orig_; }
57
58 virtual void Eval(Evaluator* ev) const = 0;
59
60 virtual string DebugString() const = 0;
61
62 protected:
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090063 Stmt();
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090064
65 private:
66 Loc loc_;
67 StringPiece orig_;
68};
69
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090070struct RuleStmt : public Stmt {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090071 Value* expr;
72 char term;
73 Value* after_term;
74
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090075 virtual ~RuleStmt();
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090076
77 virtual void Eval(Evaluator* ev) const;
78
79 virtual string DebugString() const;
80};
81
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090082struct AssignStmt : public Stmt {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090083 Value* lhs;
84 Value* rhs;
Shinichiro Hamaji81699be2015-06-22 18:07:38 +090085 StringPiece orig_rhs;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090086 AssignOp op;
87 AssignDirective directive;
88
Dan Willemsen3ce083f2017-10-11 22:17:48 -070089 AssignStmt() : lhs_sym_cache_(Symbol::IsUninitialized{}) {}
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090090 virtual ~AssignStmt();
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090091
92 virtual void Eval(Evaluator* ev) const;
93
94 virtual string DebugString() const;
Shinichiro Hamaji92a47382016-02-17 17:19:21 +090095
96 Symbol GetLhsSymbol(Evaluator* ev) const;
97
98 private:
99 mutable Symbol lhs_sym_cache_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900100};
101
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900102struct CommandStmt : public Stmt {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900103 Value* expr;
Shinichiro Hamaji631a9f82015-07-05 14:18:15 +0900104 StringPiece orig;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900105
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900106 virtual ~CommandStmt();
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900107
108 virtual void Eval(Evaluator* ev) const;
109
110 virtual string DebugString() const;
111};
112
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900113struct IfStmt : public Stmt {
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900114 CondOp op;
115 Value* lhs;
116 Value* rhs;
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900117 vector<Stmt*> true_stmts;
118 vector<Stmt*> false_stmts;
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900119
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900120 virtual ~IfStmt();
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900121
122 virtual void Eval(Evaluator* ev) const;
123
124 virtual string DebugString() const;
125};
126
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900127struct IncludeStmt : public Stmt {
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900128 Value* expr;
Shinichiro Hamajiefad2dd2015-06-17 03:08:02 +0900129 bool should_exist;
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900130
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900131 virtual ~IncludeStmt();
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900132
133 virtual void Eval(Evaluator* ev) const;
134
135 virtual string DebugString() const;
136};
137
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900138struct ExportStmt : public Stmt {
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900139 Value* expr;
140 bool is_export;
141
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900142 virtual ~ExportStmt();
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900143
144 virtual void Eval(Evaluator* ev) const;
145
146 virtual string DebugString() const;
147};
148
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900149struct ParseErrorStmt : public Stmt {
Shinichiro Hamaji56227862015-08-05 16:53:37 +0900150 string msg;
151
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900152 virtual ~ParseErrorStmt();
Shinichiro Hamaji56227862015-08-05 16:53:37 +0900153
154 virtual void Eval(Evaluator* ev) const;
155
156 virtual string DebugString() const;
157};
158
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900159#endif // STMT_H_