-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathInterpreteur.h
57 lines (46 loc) · 2.74 KB
/
Interpreteur.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
#ifndef INTERPRETEUR_H
#define INTERPRETEUR_H
#include "Symbole.h"
#include "Lecteur.h"
#include "Exceptions.h"
#include "TableSymboles.h"
#include "ArbreAbstrait.h"
class Interpreteur {
public:
Interpreteur(ifstream & fichier); // Construit un interpréteur pour interpreter
// le programme dans fichier
void analyse(); // Si le contenu du fichier est conforme à la grammaire,
// cette méthode se termine normalement et affiche un message "Syntaxe correcte".
// la table des symboles (ts) et l'arbre abstrait (arbre) auront été construits
// Sinon, une exception sera levée
void traduitEnCPP(ostream & cout,unsigned int indentation)const;
inline const TableSymboles & getTable() const {
return m_table;
} // accesseur
inline Noeud* getArbre() const {
return m_arbre;
} // accesseur
private:
Lecteur m_lecteur; // Le lecteur de symboles utilisé pour analyser le fichier
TableSymboles m_table; // La table des symboles valués
Noeud* m_arbre; // L'arbre abstrait
// Implémentation de la grammaire
Noeud* programme(); // <programme> ::= procedure principale() <seqInst> finproc FIN_FICHIER
Noeud* seqInst(); // <seqInst> ::= <inst> { <inst> }
Noeud* inst(); // <inst> ::= <affectation> ; | <instSi> | <instTantque> | <instRepeter>
Noeud* affectation(); // <affectation> ::= <variable> = <expression>
Noeud* expression(); // <expression> ::= <facteur> { <opBinaire> <facteur> }
Noeud* facteur(); // <facteur> ::= <entier> | <variable> | - <facteur> | non <facteur> | ( <expression> )
// <opBinaire> ::= + | - | * | / | < | > | <= | >= | == | != | et | ou
Noeud* instSi(); // <instSi> ::= si ( <expression> ) <seqInst> finsi
Noeud* instTantque(); // <instTantque> ::= tantque (<expression>)<seqInst> fintantque
Noeud* instRepeter(); // <instRepeter> ::= repeter <seqInst> jusqua (<expression>)
Noeud* instPour(); // <instPour> ::= pour (<affectation> ; <expression> ; <affectation>) <seqInst> finpour
Noeud* instEcrire(); // <instEcrire> ::= ecrire (<expression> | <chaine> {,<expression> | <chaine> } );
Noeud* instLire(); // <instLire> ::= lire (<variable> {, <variable> } );
// outils pour simplifier l'analyse syntaxique
void tester(const string & symboleAttendu) const throw (SyntaxeException); // Si symbole courant != symboleAttendu, on lève une exception
void testerEtAvancer(const string & symboleAttendu) throw (SyntaxeException); // Si symbole courant != symboleAttendu, on lève une exception, sinon on avance
void erreur(const string & mess) const throw (SyntaxeException); // Lève une exception "contenant" le message mess
};
#endif /* INTERPRETEUR_H */