-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStatement.h
More file actions
145 lines (116 loc) · 3.72 KB
/
Statement.h
File metadata and controls
145 lines (116 loc) · 3.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#ifndef STATEMENT_H
#define STATEMENT_H
#include "Expr.h"
#include <vector>
#include "Node.h"
// - - - - //// - - - - //// - - - - //// - - - - //
//Statement
/* Classe virtuale che stabilisce la struttura di uno statement generico.
Non aggiunge attributi ma è utile per la "gestione della gerarchia".
*/
class Statement : public StmtBlock
{
public:
Statement() = default;
~Statement() = default;//non implementando il metodo accept rimane una classe puramente virtuale
private:
};
//-------------------// NOTA: //-------------------//
/*
Tutte le classi derivanti da Statement hanno dei metodi getters (getNome), però sono sprovvisti di variabili private
aventi i nomi indicati dopo il get.
Questi metodi getNome restituiscono un Node (opportuno e opportuanmente downcastato) del vector "figli" (che tutti gli
statement ereditano dalla superclasse StmtBlock:
Ricordo la gerarchia delle classi: Node->StmtBlock->Statement->"Concrete"Statement
*/
// - - - - //// - - - - //// - - - - //// - - - - //
//Block
/*Classe concreta che rappresenta un BLOCK, cioè un "aggregato" di statement (che ha come figli).*/
class Block : public StmtBlock
{
public:
Block(std::vector<Statement*> sv) {
for (auto s : sv) aggiungiFiglio(s);
}
~Block() = default;
void accept(Visitor* v) override {
v->visitBlock(this);
}
private:
};
// - - - - //// - - - - //// - - - - //// - - - - //
//PrintStmt
/*Classe concreta che rappresenta un PRINT statement*/
class PrintStmt : public Statement {//Per mandare in output un valore (numerico o variabile)
public:
PrintStmt(NumExpr* o) { aggiungiFiglio(o); }
~PrintStmt() = default;
void accept(Visitor* v) override {
v->visitPrintStmt(this);
}
NumExpr* getOutput();
private:
};
// - - - - //// - - - - //// - - - - //// - - - - //
//SetStmt
/*Classe concreta che rappresenta un SET statement*/
class SetStmt : public Statement {//Pe definire e inizializzare una variabile
public:
SetStmt(Variable* s, NumExpr* e){
aggiungiFiglio(s); aggiungiFiglio(e);
}
~SetStmt() = default;
void accept(Visitor* v) override {
v->visitSetStmt(this);
}
Variable* getToSet();
NumExpr* getValue();
private:
};
// - - - - //// - - - - //// - - - - //// - - - - //
//InputStmt
/*Classe concreta che rappresenta un INPUT statement*/
class InputStmt : public Statement {//Assegnare un valore dato dall'utente tramite input (normalmente console) a una variabile
public:
InputStmt(Variable* i) { aggiungiFiglio(i); }
~InputStmt() = default;
void accept(Visitor* v) override {
v->visitInputStmt(this);
}
Variable* getInput();
private:
};
// - - - - //// - - - - //// - - - - //// - - - - //
//WhileStmt
/*Classe concreta che rappresenta un WHILE statement*/
class WhileStmt : public Statement {//Eseguire in loop il blocco fintanto che la condizione è vera
public:
WhileStmt(BoolExpr* c, StmtBlock* b){
aggiungiFiglio(c); aggiungiFiglio(b);
}
~WhileStmt() = default;
void accept(Visitor* v) override {
v->visitWhileStmt(this);
}
BoolExpr* getCondizione();
StmtBlock* getBloccoLoop();
private:
};
// - - - - //// - - - - //// - - - - //// - - - - //
//IfStmt
/*Classe concreta che rappresenta un IF statement*/
class IfStmt : public Statement {//In base al fatto che la condizione sia vera o falsa viene eseguito il primo stmtblock altrimenti il secondo
public:
IfStmt(BoolExpr* c, StmtBlock* b1, StmtBlock* b2){
aggiungiFiglio(c); aggiungiFiglio(b1); aggiungiFiglio(b2);
}
~IfStmt() = default;
void accept(Visitor* v) override {
v->visitIfStmt(this);
}
BoolExpr* getCondizione();
StmtBlock* getBloccoVero();
StmtBlock* getBloccoFalso();
private:
};
#endif