-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgramArea.h
147 lines (120 loc) · 4.86 KB
/
ProgramArea.h
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
146
147
/*!
\file ProgramArea.h
\brief Interfaccia di ProgramArea
\author Andrea Zanelli
\date 18-12-2008
*/
#ifndef PROGRAMAREA_H_INCLUSION_GUARD
#define PROGRAMAREA_H_INCLUSION_GUARD
#include <string>
#include <vector>
#include <map>
#include <utility>
using std::string;
using std::vector;
using std::map;
using std::pair;
/*!
\class ProgramArea
\brief Area dove memorizzare le istruzioni
Le istruzioni vengono memorizzate nell'ordine d'inserimento, vengono
suddivise per funzione di appartenenza e gli viene dato un indice univoco
e consecutivo all'istruzione che le precede. \\
Le etichette vengono tolte e, attraverso una funzione apposta, puo` restituire
l'istruzione "puntata" da una certa etichetta. \\
*/
class ProgramArea {
public:
/* METODI PUBBLICI */
/**
* Costruttore di default
*/
ProgramArea();
/**
* Restituisce l'istruzione con indice <tt>index</tt> nella forma con cui e`
* stata inserita a meno di un'eventuale etichetta. Se l'istruzione era
* solamente un'etichetta viene restituita la stringa vuota. Se l'indice e`
* errato lanciata un'eccezione di tipo std::string con la descrizione
* dell'errore.
*/
string get_instruction(const unsigned int& index) const;
/**
* Restituisce l'indice della prima istruzione della funzione con
* descrittore <tt>name</tt> che deve avere questa forma:
* "NomeFunzione(TipoArgomenti)TipoRitorno", con eventualmente degli spazi.
* Se la funzione non esiste lancia un'eccezione di tipo std::string
* con la descrizione dell'errore.
*/
unsigned int get_function_index(string name) const;
/**
* Restituisce l'indice dell'ultima istruzione della funzione con
* descrittore <tt>name</tt> che deve avere questa forma:
* "NomeFunzione(TipoArgomenti)TipoRitorno", con eventualmente degli spazi.
* Se la funzione non esiste lancia un'eccezione di tipo std::string
* con la descrizione dell'errore.
*/
unsigned int get_function_end_index(string name) const;
/**
* Restituisce l'indice dell'istruzione a cui corrispondeva l'etichetta
* <tt>label</tt>. Se l'etichetta non esiste lancia un'eccezione di tipo
* std::string con la descrizione dell'errore.
*/
unsigned int get_label_index(const string& label) const;
/**
* Aggiunge l'istruzione <tt>instruction</tt> al programma. Se
* <tt>instruction</tt> inizia con la parola ".method public static " si
* assume che sia l'inizio di una funzione e tutte le istruzioni successive
* vengono considerate all'interno di quella funzione fino ad una istruzione
* ".end method". Ogni istruzione dev'essere all'interno di una funzione.
* Si suppone che le istruzioni aggiunte siano tutte sintatticamente
* corrette, senza spazi all'inizio e alla fine, con un solo spazio tra gli
* argomenti e tra il nome e gli argomenti. Ogni funzione deve iniziare con
* un'istruzione ".method public static " e finire con l'istruzione
* ".end method".\\
* Se un'istruzione e` preceduta da un'etichetta, questa viene tolta e
* viene memorizzato l'indice dell'istruzione "puntata" dall'ettichetta. Le
* etichette devono essere all'inizio dell'istruzione (eventualmente senza
* istruzione di seguito).
* In caso di errori viene lanciata un'eccezione di tipo std::string
* con la descrizione dell'errore.
*/
void add_instruction(const string& instruction);
/**
* Ritorna il numero di istruzioni memorizzate
*/
unsigned int get_instructions_size() const;
/**
* Ritorna il numero di funzioni memorizzate
*/
unsigned int get_functions_size() const;
private:
/* VARIABILI PRIVATE */
//! usato per memorizzare le istruzioni
vector<string> program;
//! usato per memorizzare il nome delle funzioni con gli indici della prima
//! e dell'ulitma istruzione
map<string, pair<unsigned int, unsigned int> > functions;
//! usato per memorizzare il nome delle etichette con l'indice dell'
//! istruzione "puntata".
map<string, unsigned int> labels;
// true se e` stato appena aggiunta una funzione e l'istruzione successiva
// e` la prima
bool is_start_function;
// nome della funzione alla quale si stanno aggiungendo istruzioni
string current_function;
// true se si stanno aggiungendo istruzioni all'interno di una funzione
bool inside_function;
/* METODI PRIVATI */
/**
* Controlla se nella ultima istruzione inserita in program e` presente una
* etichetta nella forma <em>label:</em>, in tal caso toglie l'etichetta e
* la memorizza in <tt>labels</tt> con il corrispettivo indice dell'
* istruzione.
*/
void control_label();
/**
* Elimina gli spazi dalla stringa passata
*/
void delete_space(string& str) const;
};
#endif // PROGRAMAREA_H_INCLUSION_GUARD