Up ! Parser - Version déclarative

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}/analyse2.upl.

Cet exemple utilise les instructions de l'extension d'Up ! 5GL pour Up ! Parser. Les objets sémantiques sont déclarés statiquement.

Pour analyser le fichier source, UpsPrs.upi doit être déclaré parmi les modules importés dans le fichier ${UPS_HOME}/ini/${UPS_USER}/upsp5l.ini.

Mode compilé

Commande de compilation

upscmp Source=analyse2.upl

Commande d'exécution

analyse2

Mode interprété

upssng Source=analyse2.upl

Fichier source

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

ImporterModule
/************/
Constante
/*******/
Variable
/******/
Prive :
/*****/
AnalyseurLexical MonAnalyseurLexical(ReconnaitreChaineGuillemets, ReconnaitreEntier, ReconnaitreReel, ReconnaitreIdentificateur, /******************************************************************************************************************************/ Fin AnalyseurLexical

AnalyseurSyntaxique MonAnalyseurSyntaxique
/****************************************/ Fin AnalyseurSyntaxique
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, ValeurSemantique : Nul Ou Objet, NumeroLigne : Entier, NumeroColonne : Entier) Retourner ActionEtapeReponse
/************************************************************************************************************************************************************/
Variable
/******/
Debut Valeur1=MonAnalyseurSyntaxique.LireValeurSemantique(1);
Valeur3=ValeurSemantique;
SymboleLexical=Caractere(MonAnalyseurSyntaxique.LireSymboleLexical(2));
Selon SymboleLexical Faire Fin Selon
MonAnalyseurSyntaxique.FixerValeurSemantique(ValeurReponse);
Retourner ActionEtapeSucces;
Fin Fonction

Fonction ActionExpressionUnaire(? : Nul Ou Objet, ValeurSemantique : Nul Ou Objet, NumeroLigne : Entier, NumeroColonne : Entier) Retourner ActionEtapeReponse
/***********************************************************************************************************************************************************/
Variable
/******/
Debut
Valeur2=ValeurSemantique;
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
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.