Le fichier source est ${UPS_HOME}/upssdk/demo/${UPS_LANGUAGE}/analyse.upl.
Cet exemple n'utilise pas les instructions de l'extension d'Up ! 5GL pour Up ! Parser. Les objets sémantiques sont construits dynamiquement.
upscmp Source=analyse.upl
analyse
upssng Source=analyse.upl
Source Composant "Exemple de l'emploi d'Up ! Parser" Version 4.0.0;
ImporterModule
/************/
UpsPrs(<UpsPrs.upi>, ImporterDefinitions);
Constante
/*******/
ElementVariable=70000;
Variable
/******/
Prive :
/*****/
A : Entier;
B : Reel;
C : Caractere;
MonAnalyseurLexical : Nul Ou AnalyseurLexical;
MonAnalyseurSyntaxique : Nul Ou AnalyseurSyntaxique;
NonTerminalExpression : Nul Ou NonTerminalSyntaxique;
NonTerminalExpressionPrincipale : Nul Ou NonTerminalSyntaxique;
NonTerminalOperateurBinaire : Nul Ou NonTerminalSyntaxique;
NonTerminalOperateurUnaire : Nul Ou NonTerminalSyntaxique;
RegleExpressionConstanteCaractere : Nul Ou RegleSyntaxique;
RegleExpressionConstanteEntier : Nul Ou RegleSyntaxique;
RegleExpressionConstanteReelle : Nul Ou RegleSyntaxique;
RegleExpressionIdentifiant : Nul Ou RegleSyntaxique;
RegleExpressionBinaire : Nul Ou RegleSyntaxique;
RegleExpressionPrincipale : Nul Ou RegleSyntaxique;
RegleExpressionUnaire : Nul Ou RegleSyntaxique;
RegleOperateurBinaireAddition : Nul Ou RegleSyntaxique;
RegleOperateurBinaireSoustraction : Nul Ou RegleSyntaxique;
RegleOperateurBinaireMultiplication : Nul Ou RegleSyntaxique;
RegleOperateurBinaireDivision : Nul Ou RegleSyntaxique;
RegleOperateurUnaireAddition : Nul Ou RegleSyntaxique;
RegleOperateurUnaireSoustraction : Nul Ou RegleSyntaxique;
Compteur : Entier;
Prive :
/*****/
Fonction LireCommentaireIdentifiant(Identifiant : Entier, Liaison : Booleen) Retourner Nul Ou Caractere
/*****************************************************************************************************/
Debut
Si Identifiant==ElementVariable Alors
Si Liaison Alors
Retourner "d'une variable";
Sinon
Retourner "une variable";
Fin Si
Fin Si
Retourner Nul;
Fin Fonction
Fonction ActionExpressionConstanteCaractere(ValeurLexicale : Nul Ou Objet, ? : Nul Ou Objet, ? : Entier, ? : Entier) Retourner ActionEtapeReponse
/***********************************************************************************************************************************************/
Debut
MonAnalyseurSyntaxique.FixerValeurSemantique(ValeurLexicale);
Retourner ActionEtapeSucces;
Fin Fonction
Fonction ActionExpressionConstanteEntier(ValeurLexicale : Nul Ou Objet, ? : Nul Ou Objet, ? : Entier, ? : Entier) Retourner ActionEtapeReponse
/********************************************************************************************************************************************/
Debut
MonAnalyseurSyntaxique.FixerValeurSemantique(ValeurLexicale);
Retourner ActionEtapeSucces;
Fin Fonction
Fonction ActionExpressionConstanteReel(ValeurLexicale : Nul Ou Objet, ? : Nul Ou Objet, ? : Entier, ? : Entier) Retourner ActionEtapeReponse
/******************************************************************************************************************************************/
Debut
MonAnalyseurSyntaxique.FixerValeurSemantique(ValeurLexicale);
Retourner ActionEtapeSucces;
Fin Fonction
Fonction ActionExpressionVariable(ValeurLexicale : Nul Ou Objet, ? : Nul Ou Objet, NumeroLigne : Entier, NumeroColonne : Entier) Retourner ActionEtapeReponse
/***********************************************************************************************************************************************************/
Variable
NomVariable : Caractere;
Debut
NomVariable=Caractere(ValeurLexicale);
Selon NomVariable Faire
Cas Pour "A" Faire
MonAnalyseurSyntaxique.FixerValeurSemantique(A);
Fin Cas
Cas Pour "B" Faire
MonAnalyseurSyntaxique.FixerValeurSemantique(B);
Fin Cas
Cas Pour "C" Faire
MonAnalyseurSyntaxique.FixerValeurSemantique(C);
Fin Cas
Defaut
Ecran.Ecrire("Analyse-5 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : la variable '"+NomVariable+"' est inconnue.");
Retourner ActionEtapeArreterTout;
Fin Defaut
Fin Selon
Retourner ActionEtapeSucces;
Fin Fonction
Fonction ActionExpressionPrincipale(? : Nul Ou Objet, ? : Nul Ou Objet, ? : Entier, ? : Entier) Retourner ActionEtapeReponse
/**************************************************************************************************************************/
Variable
/******/
Valeur1 : Nul Ou Objet;
Debut
Valeur1=MonAnalyseurSyntaxique.LireValeurSemantique(1);
Selon Valeur1.EstInstanceDe Faire
Cas Pour Caractere Faire
Ecran.Ecrire(Caractere(Valeur1));
Fin Cas
Cas Pour Entier Faire
Ecran.Ecrire(Entier(Valeur1));
Fin Cas
Cas Pour Reel Faire
Ecran.Ecrire(Reel(Valeur1));
Fin Cas
Defaut
Ecran.Ecrire("?");
Fin Defaut
Fin Selon
Retourner ActionEtapeSucces;
Fin Fonction
Fonction ActionExpressionBinaire(? : Nul Ou Objet, Valeur : Nul Ou Objet, NumeroLigne : Entier, NumeroColonne : Entier) Retourner ActionEtapeReponse
/**************************************************************************************************************************************************/
Variable
/******/
Valeur1 : Nul Ou Objet;
Valeur3 : Nul Ou Objet;
ValeurReponse : Nul Ou Objet;
SymboleLexical : Caractere;
Debut
Valeur1=MonAnalyseurSyntaxique.LireValeurSemantique(1);
Valeur3=Valeur;
SymboleLexical=Caractere(MonAnalyseurSyntaxique.LireSymboleLexical(2));
Selon SymboleLexical Faire
Cas Pour "+" Faire
Si Valeur1.EstInstanceDe==Entier Alors
Si Valeur3.EstInstanceDe==Entier Alors
ValeurReponse=Entier(Valeur1)+Entier(Valeur3);
SinonSi Valeur3.EstInstanceDe==Reel Alors
ValeurReponse=Entier(Valeur1)+Reel(Valeur3);
Sinon
Ecran.Ecrire("Analyse-1 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : les opérandes de '+' sont de types incompatibles.");
Retourner ActionEtapeArreterTout;
Fin Si
SinonSi Valeur1.EstInstanceDe==Reel Alors
Si Valeur3.EstInstanceDe==Entier Alors
ValeurReponse=Reel(Valeur1)+Entier(Valeur3);
SinonSi Valeur3.EstInstanceDe==Reel Alors
ValeurReponse=Reel(Valeur1)+Reel(Valeur3);
Sinon
Ecran.Ecrire("Analyse-1 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : les opérandes de '+' sont de types incompatibles.");
Retourner ActionEtapeArreterTout;
Fin Si
SinonSi Valeur1.EstInstanceDe==Caractere Et Valeur3.EstInstanceDe==Caractere Alors
ValeurReponse=Caractere(Valeur1)+Caractere(Valeur3);
Sinon
Ecran.Ecrire("Analyse-1 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : les opérandes de '+' sont de types incompatibles.");
Retourner ActionEtapeArreterTout;
Fin Si
Fin Cas
Cas Pour "-" Faire
Si Valeur1.EstInstanceDe==Entier Alors
Si Valeur3.EstInstanceDe==Entier Alors
ValeurReponse=Entier(Valeur1)-Entier(Valeur3);
SinonSi Valeur3.EstInstanceDe==Reel Alors
ValeurReponse=Entier(Valeur1)-Reel(Valeur3);
Sinon
Ecran.Ecrire("Analyse-1 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : les opérandes de '-' sont de types incompatibles.");
Retourner ActionEtapeArreterTout;
Fin Si
SinonSi Valeur1.EstInstanceDe==Reel Alors
Si Valeur3.EstInstanceDe==Entier Alors
ValeurReponse=Reel(Valeur1)-Entier(Valeur3);
SinonSi Valeur3.EstInstanceDe==Reel Alors
ValeurReponse=Reel(Valeur1)-Reel(Valeur3);
Sinon
Ecran.Ecrire("Analyse-1 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : les opérandes de '-' sont de types incompatibles.");
Retourner ActionEtapeArreterTout;
Fin Si
Sinon
Ecran.Ecrire("Analyse-1 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : les opérandes de '-' sont de types incompatibles.");
Retourner ActionEtapeArreterTout;
Fin Si
Fin Cas
Cas Pour "*" Faire
Si Valeur1.EstInstanceDe==Entier Alors
Si Valeur3.EstInstanceDe==Entier Alors
ValeurReponse=Entier(Valeur1)*Entier(Valeur3);
SinonSi Valeur3.EstInstanceDe==Reel Alors
ValeurReponse=Entier(Valeur1)*Reel(Valeur3);
Sinon
Ecran.Ecrire("Analyse-1 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : les opérandes de '*' sont de types incompatibles.");
Retourner ActionEtapeArreterTout;
Fin Si
SinonSi Valeur1.EstInstanceDe==Reel Alors
Si Valeur3.EstInstanceDe==Entier Alors
ValeurReponse=Reel(Valeur1)*Entier(Valeur3);
SinonSi Valeur3.EstInstanceDe==Reel Alors
ValeurReponse=Reel(Valeur1)*Reel(Valeur3);
Sinon
Ecran.Ecrire("Analyse-1 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : les opérandes de '*' sont de types incompatibles.");
Retourner ActionEtapeArreterTout;
Fin Si
Sinon
Ecran.Ecrire("Analyse-1 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)*
+" : les opérandes de '*' sont de types incompatibles.");
Retourner ActionEtapeArreterTout;
Fin Si
Fin Cas
Cas Pour "/" Faire
Si Valeur1.EstInstanceDe==Entier Alors
Si Valeur3.EstInstanceDe==Entier Alors
ValeurReponse=Entier(Valeur1)/Entier(Valeur3);
SinonSi Valeur3.EstInstanceDe==Reel Alors
ValeurReponse=Entier(Valeur1)/Reel(Valeur3);
Sinon
Ecran.Ecrire("Analyse-1 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : les opérandes de '/' sont de types incompatibles.");
Retourner ActionEtapeArreterTout;
Fin Si
SinonSi Valeur1.EstInstanceDe==Reel Alors
Si Valeur3.EstInstanceDe==Entier Alors
ValeurReponse=Reel(Valeur1)/Entier(Valeur3);
SinonSi Valeur3.EstInstanceDe==Reel Alors
ValeurReponse=Reel(Valeur1)/Reel(Valeur3);
Sinon
Ecran.Ecrire("Analyse-1 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : les opérandes de '/' sont de types incompatibles.");
Retourner ActionEtapeArreterTout;
Fin Si
Sinon
Ecran.Ecrire("Analyse-1 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : les opérandes de '/' sont de types incompatibles.");
Retourner ActionEtapeArreterTout;
Fin Si
Fin Cas
Defaut
Ecran.Ecrire("Analyse-2 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : l'opérateur '"+SymboleLexical+"' est non pris en compte.");
Retourner ActionEtapeArreterTout;
Fin Defaut
Fin Selon
MonAnalyseurSyntaxique.FixerValeurSemantique(ValeurReponse);
Retourner ActionEtapeSucces;
Fin Fonction
Fonction ActionExpressionUnaire(? : Nul Ou Objet, Valeur : Nul Ou Objet, NumeroLigne : Entier, NumeroColonne : Entier) Retourner ActionEtapeReponse
/*************************************************************************************************************************************************/
Variable
/******/
Valeur2 : Nul Ou Objet;
ValeurReponse : Nul Ou Objet;
SymboleLexical : Caractere;
Debut
Valeur2=Valeur;
SymboleLexical=Caractere(MonAnalyseurSyntaxique.LireSymboleLexical(1));
Selon SymboleLexical Faire
Cas Pour "+" Faire
Si Valeur2.EstInstanceDe==Entier Alors
ValeurReponse=Entier(Valeur2);
SinonSi Valeur2.EstInstanceDe==Reel Alors
ValeurReponse=Reel(Valeur2);
Sinon
Ecran.Ecrire("Analyse-3 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : l'opérande de '+' est de type incompatible.");
Retourner ActionEtapeArreterTout;
Fin Si
Fin Cas
Cas Pour "-" Faire
Si Valeur2.EstInstanceDe==Entier Alors
ValeurReponse=-Entier(Valeur2);
SinonSi Valeur2.EstInstanceDe==Reel Alors
ValeurReponse=-Reel(Valeur2);
SinonSi Valeur2.EstInstanceDe==Caractere Alors
ValeurReponse=-Caractere(Valeur2);
Sinon
Ecran.Ecrire("Analyse-3 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : l'opérande de '-' est de type incompatible.");
Retourner ActionEtapeArreterTout;
Fin Si
Fin Cas
Defaut
Ecran.Ecrire("Analyse-2 : Erreur de sémantique en ligne "+Caractere(NumeroLigne)+" colonne "+Caractere(NumeroColonne)
+" : l'opérateur '"+SymboleLexical+"' est non pris en compte.");
Retourner ActionEtapeArreterTout;
Fin Defaut
Fin Selon
MonAnalyseurSyntaxique.FixerValeurSemantique(ValeurReponse);
Retourner ActionEtapeSucces;
Fin Fonction
Procedure EnvoyerErreur(MessageErreur : Caractere, ? : Caractere, ? : Entier, ? : Entier)
/***************************************************************************************/
Debut
Ecran.Ecrire(MessageErreur);
Fin Procedure
Procedure Analyser(Chaine : Caractere)
/************************************/
Variable
/******/
F : Nul Ou FluxCaractere;
Debut
Ecran.Ecrire("Analyse de : "+Chaine);
F=FluxCaractere(Chaine, Vrai);
MonAnalyseurLexical.DebuterAnalyse(IFlux(F), "<Chaine>", EnvoyerErreur);
?=MonAnalyseurSyntaxique.Analyser(NonTerminalExpressionPrincipale, Faux, EnvoyerErreur);
MonAnalyseurLexical.TerminerAnalyse();
F.Fermer();
Fin Procedure
Principal
/*******/
Debut
MonAnalyseurLexical=AnalyseurLexical("MonAnalyseurLexical", Vrai, Faux, Faux, Faux, Faux, Vrai, Vrai, Vrai, Faux, Vrai, LireCommentaireIdentifiant);
MonAnalyseurLexical.AjouterSeparateur(" \t\r\n");
MonAnalyseurLexical.AjouterElementLexical("A", ElementVariable);
MonAnalyseurLexical.AjouterElementLexical("B", ElementVariable);
MonAnalyseurLexical.AjouterElementLexical("C", ElementVariable);
MonAnalyseurSyntaxique=AnalyseurSyntaxique("MonAnalyseurSyntaxique");
NonTerminalExpression=NonTerminalSyntaxique(MonAnalyseurSyntaxique, "Analyse.Expression", Faux, Faux);
NonTerminalExpressionPrincipale=NonTerminalSyntaxique(MonAnalyseurSyntaxique, "Analyse.ExpressionPrincipale", Faux, Faux);
NonTerminalOperateurBinaire=NonTerminalSyntaxique(MonAnalyseurSyntaxique, "Analyse.OperateurBinaire", Faux, Faux);
NonTerminalOperateurUnaire=NonTerminalSyntaxique(MonAnalyseurSyntaxique, "Analyse.OperateurUnaire", Faux, Faux);
/* ExpressionPrincipale : Expression ";" . */
RegleExpressionPrincipale=RegleSyntaxique(MonAnalyseurSyntaxique, NonTerminalExpressionPrincipale);
RegleExpressionPrincipale.AjouterEtape(NonTerminalExpression);
RegleExpressionPrincipale.AjouterEtape(";", ActionExpressionPrincipale);
/* Expression : . */
RegleExpressionConstanteCaractere=RegleSyntaxique(MonAnalyseurSyntaxique, NonTerminalExpression);
RegleExpressionConstanteCaractere.AjouterEtape(ElementChaineGuillemets, ActionExpressionConstanteCaractere);
/* Expression : . */
RegleExpressionConstanteEntier=RegleSyntaxique(MonAnalyseurSyntaxique, NonTerminalExpression);
RegleExpressionConstanteEntier.AjouterEtape(ElementEntier, ActionExpressionConstanteEntier);
/* Expression : . */
RegleExpressionConstanteReelle=RegleSyntaxique(MonAnalyseurSyntaxique, NonTerminalExpression);
RegleExpressionConstanteReelle.AjouterEtape(ElementReel, ActionExpressionConstanteReel);
/* Expression : . */
RegleExpressionIdentifiant=RegleSyntaxique(MonAnalyseurSyntaxique, NonTerminalExpression);
RegleExpressionIdentifiant.AjouterEtape(ElementVariable, ActionExpressionVariable);
/* Expression : Expression OperateurBinaire Expression. */
RegleExpressionBinaire=RegleSyntaxique(MonAnalyseurSyntaxique, NonTerminalExpression);
RegleExpressionBinaire.AjouterEtape(NonTerminalExpression);
RegleExpressionBinaire.AjouterEtape(NonTerminalOperateurBinaire);
RegleExpressionBinaire.AjouterEtape(NonTerminalExpression, ActionExpressionBinaire);
/* Expression : OperateurUnaire Expression. */
RegleExpressionUnaire=RegleSyntaxique(MonAnalyseurSyntaxique, NonTerminalExpression);
RegleExpressionUnaire.AjouterEtape(NonTerminalOperateurUnaire);
RegleExpressionUnaire.AjouterEtape(NonTerminalExpression, ActionExpressionUnaire);
/* OperateurBinaire : "+". */
RegleOperateurBinaireAddition=RegleSyntaxique(MonAnalyseurSyntaxique, NonTerminalOperateurBinaire);
RegleOperateurBinaireAddition.AjouterEtape("+");
RegleOperateurBinaireAddition.ChangerPriorite(8);
/* OperateurBinaire : "-". */
RegleOperateurBinaireSoustraction=RegleSyntaxique(MonAnalyseurSyntaxique, NonTerminalOperateurBinaire);
RegleOperateurBinaireSoustraction.AjouterEtape("-");
RegleOperateurBinaireSoustraction.ChangerPriorite(8);
/* OperateurBinaire : "*". */
RegleOperateurBinaireMultiplication=RegleSyntaxique(MonAnalyseurSyntaxique, NonTerminalOperateurBinaire);
RegleOperateurBinaireMultiplication.AjouterEtape("*");
RegleOperateurBinaireMultiplication.ChangerPriorite(10);
/* OperateurBinaire : "/". */
RegleOperateurBinaireDivision=RegleSyntaxique(MonAnalyseurSyntaxique, NonTerminalOperateurBinaire);
RegleOperateurBinaireDivision.AjouterEtape("/");
RegleOperateurBinaireDivision.ChangerPriorite(10);
/* OperateurUnaire : "+". */
RegleOperateurUnaireAddition=RegleSyntaxique(MonAnalyseurSyntaxique, NonTerminalOperateurUnaire);
RegleOperateurUnaireAddition.AjouterEtape("+");
/* OperateurUnaire : "-". */
RegleOperateurUnaireSoustraction=RegleSyntaxique(MonAnalyseurSyntaxique, NonTerminalOperateurUnaire);
RegleOperateurUnaireSoustraction.AjouterEtape("-");
MonAnalyseurSyntaxique.DebuterAnalyse(MonAnalyseurLexical);
Analyser("1+2-3*4/5;");
Analyser("1.0+2.0-3.0*4.0/5.0;");
Analyser("1+2.0-3*4.0/5;");
Analyser("1.0+2-3.0*4/5.0;");
A=2;
Analyser("1+A-3*4/5;");
B=3.0;
Analyser("1.0+2.0-B*4.0/5.0;");
Analyser("\"coucou\"+\"hello\";");
Analyser("-\"coucou\";");
C="coucou";
Analyser("C+\"hello\";");
Analyser("1^2;");
Analyser("1+D;");
MonAnalyseurSyntaxique.TerminerAnalyse();
Fin Principal