Up ! Parser - Version procédurale

Ce programme présente l'analyse d'un flux structuré. Il provient d'une chaîne de caractères.

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.

Mode compilé

Commande de compilation

upscmp Source=analyse.upl

Commande d'exécution

analyse

Mode interprété

upssng Source=analyse.upl

Fichier source

Source Composant "Exemple de l'emploi d'Up ! Parser" Version 4.0.0;

ImporterModule
/************/
Constante
/*******/
Variable
/******/
Prive :
/*****/
Prive :
/*****/
Fonction LireCommentaireIdentifiant(Identifiant : Entier, Liaison : Booleen) Retourner Nul Ou Caractere
/*****************************************************************************************************/
Debut
Si Identifiant==ElementVariable Alors 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
Debut NomVariable=Caractere(ValeurLexicale);
Selon NomVariable Faire Fin Selon
Retourner ActionEtapeSucces;
Fin Fonction

Fonction ActionExpressionPrincipale(? : Nul Ou Objet, ? : Nul Ou Objet, ? : Entier, ? : Entier) Retourner ActionEtapeReponse
/**************************************************************************************************************************/
Variable
/******/
Debut
Valeur1=MonAnalyseurSyntaxique.LireValeurSemantique(1);
Selon Valeur1.EstInstanceDe Faire Fin Selon
Retourner ActionEtapeSucces;
Fin Fonction

Fonction ActionExpressionBinaire(? : Nul Ou Objet, Valeur : Nul Ou Objet, NumeroLigne : Entier, NumeroColonne : Entier) Retourner ActionEtapeReponse
/**************************************************************************************************************************************************/
Variable
/******/
Debut Valeur1=MonAnalyseurSyntaxique.LireValeurSemantique(1);
Valeur3=Valeur;
SymboleLexical=Caractere(MonAnalyseurSyntaxique.LireSymboleLexical(2));
Selon SymboleLexical Faire 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
/******/
Debut
Valeur2=Valeur;
SymboleLexical=Caractere(MonAnalyseurSyntaxique.LireSymboleLexical(1));
Selon SymboleLexical Faire 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
/******/
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

Résultat de l'exécution

Analyse de : 1+2-3*4/5; 0.6 Analyse de : 1.0+2.0-3.0*4.0/5.0; 0.6 Analyse de : 1+2.0-3*4.0/5; 0.6 Analyse de : 1.0+2-3.0*4/5.0; 0.6 Analyse de : 1+A-3*4/5; 0.6 Analyse de : 1.0+2.0-B*4.0/5.0; 0.6 Analyse de : "coucou"+"hello"; coucouhello Analyse de : -"coucou"; uocuoc Analyse de : C+"hello"; coucouhello Analyse de : 1^2; Erreur UpsPrs-202 : erreur de syntaxe dans '' ligne 1, colonne 2. Attendu '+', '-', '*', '/', ';' au lieu de '^'. Analyse de : 1+D; Erreur UpsPrs-202 : erreur de syntaxe dans '' ligne 1, colonne 3. Attendu une chaîne entre "", un entier, un réel, une variable, '+', '-' au lieu d'un identifiant.