blob: 3b6feeb9bc6bbed658dcb4cf4e906dab04f6a64e [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 Hamaji505d0d22016-02-29 20:07:39 +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
Shinichiro Hamaji45a0c762015-06-26 06:47:10 +090037enum 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
Shinichiro Hamaji505d0d22016-02-29 20:07:39 +090089 AssignStmt()
90 : lhs_sym_cache_(Symbol::IsUninitialized{}) {
91 }
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090092 virtual ~AssignStmt();
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090093
94 virtual void Eval(Evaluator* ev) const;
95
96 virtual string DebugString() const;
Shinichiro Hamaji505d0d22016-02-29 20:07:39 +090097
98 Symbol GetLhsSymbol(Evaluator* ev) const;
99
100 private:
101 mutable Symbol lhs_sym_cache_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900102};
103
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900104struct CommandStmt : public Stmt {
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900105 Value* expr;
Shinichiro Hamaji631a9f82015-07-05 14:18:15 +0900106 StringPiece orig;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900107
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900108 virtual ~CommandStmt();
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900109
110 virtual void Eval(Evaluator* ev) const;
111
112 virtual string DebugString() const;
113};
114
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900115struct IfStmt : public Stmt {
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900116 CondOp op;
117 Value* lhs;
118 Value* rhs;
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900119 vector<Stmt*> true_stmts;
120 vector<Stmt*> false_stmts;
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900121
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900122 virtual ~IfStmt();
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900123
124 virtual void Eval(Evaluator* ev) const;
125
126 virtual string DebugString() const;
127};
128
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900129struct IncludeStmt : public Stmt {
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900130 Value* expr;
Shinichiro Hamajiefad2dd2015-06-17 03:08:02 +0900131 bool should_exist;
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900132
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900133 virtual ~IncludeStmt();
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900134
135 virtual void Eval(Evaluator* ev) const;
136
137 virtual string DebugString() const;
138};
139
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900140struct ExportStmt : public Stmt {
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900141 Value* expr;
142 bool is_export;
143
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900144 virtual ~ExportStmt();
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +0900145
146 virtual void Eval(Evaluator* ev) const;
147
148 virtual string DebugString() const;
149};
150
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900151struct ParseErrorStmt : public Stmt {
Shinichiro Hamaji56227862015-08-05 16:53:37 +0900152 string msg;
153
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900154 virtual ~ParseErrorStmt();
Shinichiro Hamaji56227862015-08-05 16:53:37 +0900155
156 virtual void Eval(Evaluator* ev) const;
157
158 virtual string DebugString() const;
159};
160
Shinichiro Hamaji645cca72015-09-24 17:04:21 +0900161#endif // STMT_H_