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 { class AnalyseSemantique {
/** Arbre abstrait à analyser. */
private ArbreAbstrait arbre; private ArbreAbstrait arbre;
/**
* Entier représentant le type du résultat obtenu après génération.
* @see Variable
*/
private int typeResult; private int typeResult;
/** la variable résultat obtenu après génération. */
private Variable resultat; private Variable resultat;
/**
* Préparation des analyses.
*
* @param as analyseur syntaxique qui fournit l'arbre abstrait à analyser
*/
public AnalyseSemantique(AnalyseSyntaxique as) { public AnalyseSemantique(AnalyseSyntaxique as) {
arbre = as.getArbreAbstrait(); arbre = as.getArbreAbstrait();
typeResult = -1; typeResult = -1;
...@@ -13,14 +47,28 @@ class AnalyseSemantique { ...@@ -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 { public int getTypeRetour() throws AnalyseException {
if (typeResult == -1) typeResult = getType(arbre); if (typeResult == -1) typeResult = getType(arbre);
return typeResult; 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 { private int getType(ArbreAbstrait aa) throws AnalyseException {
int tg, td; int tg, td;
switch(aa.getLabel()) { switch(aa.getLabel()) {
...@@ -162,24 +210,64 @@ class AnalyseSemantique { ...@@ -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 { public int getIntValue() throws AnalyseException {
verifieEvaluation(Variable.TYPE_ENT); verifieEvaluation(Variable.TYPE_ENT);
return resultat.getNbVal(); 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 { public Fraction getFracValue() throws AnalyseException {
verifieEvaluation(Variable.TYPE_FRAC); verifieEvaluation(Variable.TYPE_FRAC);
return resultat.getFracVal(); 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 { public Polynome getPolyValue() throws AnalyseException {
verifieEvaluation(Variable.TYPE_POLY); verifieEvaluation(Variable.TYPE_POLY);
return resultat.getPolyVal(); 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 { public void calculeRetour() throws AnalyseException {
if (resultat == null) { if (resultat == null) {
resultat = evaluate(arbre); resultat = evaluate(arbre);
...@@ -189,13 +277,39 @@ class AnalyseSemantique { ...@@ -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 { private void verifieEvaluation(int type) throws AnalyseException {
if (typeResult == -1) getTypeRetour(); if (typeResult == -1) getTypeRetour();
if (typeResult != type) if (typeResult != type)
throw new AnalyseException("L'expression n'est pas de type " + Variable.getSType(type) + "."); throw new AnalyseException("L'expression n'est pas de type " + Variable.getSType(type) + ".");
calculeRetour(); 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 { private Variable evaluate(ArbreAbstrait aa) throws AnalyseException {
Variable vg, vd; Variable vg, vd;
switch(aa.getLabel()) { switch(aa.getLabel()) {
...@@ -275,9 +389,6 @@ class AnalyseSemantique { ...@@ -275,9 +389,6 @@ class AnalyseSemantique {
} }
throw new AnalyseException("Erreur dans l'arbre abstrait: label inconnue."); 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