Commit 1716dc57 authored by Vincent's avatar Vincent

modification AnalyseSemantique.java

ajout javadoc
parent 5c9b5ba0
/**
* Analyse sémantique des polynômes.
*
* <p>
* Cette analyse se base sur l'arbre abstrait crée par l'analyseur syntaxique.
* Elle se passe en deux temps : d'une part l'analyse sémantique statique et d'autre part
* l'analyse sémantique dynamique.
* </p>
*
* <p>
* L'analyse statique consiste à vérifier que les types de chaque opérande de chaque noeud de
* l'arbre abstrait sont cohérents. Elle vérifie aussi que les identifiants de variables ont bien
* été déclarés une et une seule fois.
* </p>
*
* <p>
* L'analyse dynamique construit le polynôme. Elle s'assure que les dénominateurs sont non-nuls et
* que les puissances sont des entiers positifs.
* </p>
*/
class AnalyseSemantique {
/** Arbre abstrait à analyser. */
private ArbreAbstrait arbre;
/**
* Entier représentant le type du résultat obtenu après génération.
* @see Variable
*/
private int typeResult;
/** la variable résultat obtenu après génération. */
private Variable resultat;
/**
* Préparation des analyses.
*
* @param as analyseur syntaxique qui fournit l'arbre abstrait à analyser
*/
public AnalyseSemantique(AnalyseSyntaxique as) {
arbre = as.getArbreAbstrait();
typeResult = -1;
......@@ -13,14 +47,28 @@ class AnalyseSemantique {
}
/***
*** A N A L Y S E S T A T I Q U E
***/
/**
* Analyse sémantique statique
*
* @return un entier représentant le type du résultat qui serait obtenu après génération.
*
* @throws AnalyseException si un type n'est pas cohérent dans l'arbre abstrait.
*/
public int getTypeRetour() throws AnalyseException {
if (typeResult == -1) typeResult = getType(arbre);
return typeResult;
}
/**
* Méthode récurssive d'analyse sémantique statique.
*
* @param aa arbre abstrait qui sera analysé
*
* @return un entier représentant le type du résultat qui serait obtenu après génération.
*
* @throws AnalyseException si un type n'est pas cohérent dans l'arbre abstrait.
*/
private int getType(ArbreAbstrait aa) throws AnalyseException {
int tg, td;
switch(aa.getLabel()) {
......@@ -162,24 +210,64 @@ class AnalyseSemantique {
/***
*** A N A L Y S E D Y N A M I Q U E
***/
/**
* Retourne la valeur du résultat s'il est de type entier.
*
* <p>
* Le comportement de cette méthode est indéterminé si le résultat de l'analyse n'est pas de type entier.
* </p>
*
* @return la valeur entière du résultat de l'analyse dynamique.
*
* @throws AnalyseException s'il y a un problème pendant la génération.
*/
public int getIntValue() throws AnalyseException {
verifieEvaluation(Variable.TYPE_ENT);
return resultat.getNbVal();
}
/**
* Retourne la valeur du résultat s'il est de type fraction.
*
* <p>
* Le comportement de cette méthode est indéterminé si le résultat de l'analyse n'est pas de type fraction.
* </p>
*
* @return la valeur fractionnaire du résultat de l'analyse dynamique.
*
* @throws AnalyseException s'il y a un problème pendant la génération.
*/
public Fraction getFracValue() throws AnalyseException {
verifieEvaluation(Variable.TYPE_FRAC);
return resultat.getFracVal();
}
/**
* Retourne la valeur du résultat s'il est de type polynôme.
*
* <p>
* Le comportement de cette méthode est indéterminé si le résultat de l'analyse n'est pas de type polynôme.
* </p>
*
* @return la valeur polynomiale du résultat de l'analyse dynamique.
*
* @throws AnalyseException s'il y a un problème pendant la génération.
*/
public Polynome getPolyValue() throws AnalyseException {
verifieEvaluation(Variable.TYPE_POLY);
return resultat.getPolyVal();
}
/**
* Génère la valeur du résultat de l'expression analysée.
*
* Cette méthode met aussi à jour la variable d'environnement <code>ANS</code> (type et valeur).
*
* @throws AnalyseException s'il y a un problème pendant la génération.
*/
public void calculeRetour() throws AnalyseException {
if (resultat == null) {
resultat = evaluate(arbre);
......@@ -189,13 +277,39 @@ class AnalyseSemantique {
}
/**
* Vérifie que le type du résultat est bien conforme à ce qu'on veut.
*
* <p>
* Le résultat est généré si besoin.
* </p>
*
* @param type le type souhaité du résultat de la génération.
*
* @throws AnalyseException si le type du résultat n'est pas celui souhaité.
*/
private void verifieEvaluation(int type) throws AnalyseException {
if (typeResult == -1) getTypeRetour();
if (typeResult != type)
throw new AnalyseException("L'expression n'est pas de type " + Variable.getSType(type) + ".");
calculeRetour();
}
/**
* Évalue la valeur du résultat d'un arbre abstrait.
*
* <p>
* Il s'agit du coeur de l'analyse sémantique dynamique.
* C'"est une fonction récurssive.
* </p>
*
* @param aa l'arbre abstrait qui sert de base à la génération du résultat.
*
* @return le résultat de la génération de l'expression.
*
* @throws AnalyseException si un problème de génération survient dans l'analyse sémantique.
*/
private Variable evaluate(ArbreAbstrait aa) throws AnalyseException {
Variable vg, vd;
switch(aa.getLabel()) {
......@@ -275,9 +389,6 @@ class AnalyseSemantique {
}
throw new AnalyseException("Erreur dans l'arbre abstrait: label inconnue.");
}
/***
*** fin d'analyse sémantique dynamique
***/
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment