Tester la syntaxe arithmetique (turbo pascal)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 825 fois - Téléchargée 29 fois

Contenu du snippet

tous simplement pour optimiser surtout je n'arrive pas a trouver une solution pour ignorer l'espace blanc qui se trouve a l'interieur d'expression arithmetique a tester

Source / Exemple :


{/*
   Important    : Compile & Run Under Borland Turbo Pascal 7.1
   Name         : T.A.E
   Author       : Dell Sim2x
   Description  : Evaluator of Aritmetic Expression
   Date         : 28/02/06 14:35
   Copyright    : Sim2x Software GPL L

  • /}
program evaluateur_arithmetique; uses crt; procedure test_first(var test:integer;firstchar:char); begin case firstchar of '+','-','*','/',')':begin textcolor(white); writeln(' !!! ERREUR !!! '); writeln(''); writeln(''); textcolor(yellow); writeln('Entrer une expression commencante par un alphabet ou une parenthese.'); test:=0; end; end; end; procedure Affiche_suppr(var test:integer;lastchar:char) ; begin textcolor(white); writeln(' !!! ERREUR !!! '); writeln(''); writeln(''); textcolor(yellow); writeln(' Supprimer " ',lastchar,' "de la derniere position.' ); test:=0; end; procedure affiche_spc(var test:integer;spc:char;p:integer); begin textcolor(white); writeln(' !!! ERREUR !!! '); writeln(''); writeln(''); textcolor(yellow); if (spc=' ') then writeln(' Expression contient l''espace blanc') else writeln('Expression contient le caractere " ',spc,' " a la position ',p,' .'); test:=0; end; function menu(m:char):char; var c:char; Begin if(m='n') then begin clrscr; writeln(''); writeln(' -------------------'); writeln(' - Menu Principale - '); writeln(' ------------------- '); writeln(''); writeln(''); writeln('==============================================================================='); writeln(''); writeln('= 1 : Evaluer une expression arithmetique = '); writeln(''); writeln('==============================================================================='); writeln(''); writeln('= 2 : Aide ='); writeln(''); writeln('==============================================================================='); writeln(''); Writeln('= 3 : Quitter ='); writeln(''); writeln('==============================================================================='); writeln(''); writeln(' '); writeln(' Votre Choix: '); gotoxy(15,22); readln(c); menu:=c; end; end; procedure test_openprts(var test:integer;prts:char;pos:integer) ; begin case prts of '(': begin textcolor(white); writeln(' !!! ERREUR !!! '); writeln(''); writeln(''); textcolor(yellow); writeln('veulliez fermer la parenthese ouverte de la position ',pos+1); test:=0; end; end; end; procedure test_closeprts(var test:integer;prts:char;pos:integer) ; begin case prts of ')': begin textcolor(white); writeln(' !!! ERREUR !!! '); writeln(''); writeln(''); textcolor(yellow); writeln('veulliez ouvrir la parenthese fermante de la position ',pos+1); test:=0; end; end; end; procedure nbr_parenthese(var nbrprs:integer; prts:char); begin case prts of '(':nbrprs:=nbrprs+1; ')':nbrprs:=nbrprs-1; end; end; procedure test_operateur(var test:integer; oper:char;pos:integer); begin case oper of '+','-','*','/': begin textcolor(white); writeln(' !!! ERREUR !!! '); writeln(''); writeln(''); textcolor(yellow); writeln('Changer " ', oper ,' " par un alphabet a la position ',pos+1); test:=0; end; end; end; procedure test_alphabet(var test:integer;alpha:char;pos:integer); begin case alpha of 'A'..'Z','a'..'z': begin textcolor(white); writeln(' !!! ERREUR !!! '); writeln(''); writeln(''); textcolor(yellow); writeln('Changer " ', alpha ,' " par un operateur a la position ',pos+1); test:=0; end; end; end; procedure test_operprts(var test:integer; operprts:char;pos:integer); begin case operprts of '*','/': begin textcolor(white); writeln(' !!! ERREUR !!! '); writeln(''); writeln(''); textcolor(yellow); writeln('Changer " ',operprts,' " par " + " / " - " a la position ',pos+1); test:=0; end; end; end; var testmenu,c:char; chaine: String; i,x,y,test,nbrprs :integer; label r,cont; begin writeln(''); textcolor(yellow); writeln('==============================================================================='); writeln('* The Aritmetic Evaluator [TAE] *'); writeln('==============================================================================='); writeln(''); writeln(''); writeln(''); writeln(''); writeln('*************************{ Menu Principale }*************************'); writeln('* *'); writeln('* *'); writeln('* *'); writeln('* 1 : Evaluer une expression arithmetique *'); writeln('* *'); writeln('* 2 : Aide *'); writeln('* *'); Writeln('* 3 : Quitter *'); writeln('* *'); writeln('* *'); writeln('* *'); writeln('*******************************************************************************'); writeln(''); writeln(''); writeln(' Votre Choix: '); gotoxy(15,24); readln(c); repeat case c of '1': begin cont: clrscr; writeln(''); writeln('Entrer l''expression arithmetique a Tester'); r: writeln(''); writeln('______________________________________________________________________________'); writeln('/ /'); writeln('/ Votre formule: /'); writeln('/ /'); writeln('______________________________________________________________________________'); gotoxy(18,6); readln(chaine); writeln(''); writeln(''); writeln(''); writeln(''); y:=length(chaine) ; if (y=0) then begin clrscr; writeln(''); writeln(' Veulliez Svp Entrer l''expression arithmetique ') ; goto r ; end else x:=length(chaine)-1; y:=length(chaine) ; test:=1; nbrprs:=0; test_first(test,chaine[1]); for i:=1 to x do if (test=1) then case chaine[i] of 'A'..'Z','a'..'z': begin test_openprts(test,chaine[i+1],i) ; test_alphabet(test,chaine[i+1],i); end; '+','-','*','/' : begin if(chaine[i+1]='(')then test_operateur(test,chaine[i+2],i+1); test_closeprts(test,chaine[i+1],i); test_operateur(test,chaine[i+1],i) ; end; '(': begin nbr_parenthese(nbrprs,chaine[i]); test_closeprts(test,chaine[i+1],i); test_operprts(test,chaine[i+1],i) ; end; ')': begin test_openprts(test,chaine[i+1],i) ; nbr_parenthese(nbrprs,chaine[i]); test_alphabet(test,chaine[i+1],i) ; end; else affiche_spc(test,chaine[i],i); end; {///////////////// Test derniere position /////////////////////////////////////} if (test=1) then case chaine[y]of ')': nbr_parenthese(nbrprs,chaine[y]); '+','-','*','/','(': Affiche_suppr( test,chaine[y]); 'A'..'Z','a'..'z': ; else affiche_spc(test,chaine[y],y); end; {///////////////// Resultat ////////////////////////////////} if((test=1) and ( nbrprs=0))then begin writeln(''); writeln(''); writeln(''); writeln(' Expression Correcte'); end else if ((nbrprs<>0) and (test=1))then begin textcolor(white); writeln(' !!! ERREUR !!! '); writeln(''); writeln(''); textcolor(yellow); writeln(' Verifier le nbr de parenthese.'); test:=0; end; textcolor(yellow); writeln(''); writeln(''); writeln(''); writeln(' Evaluer une autre formule: (o)ui / (n)on [?]'); gotoxy(71,18); readln(testmenu); if (testmenu='o')then goto cont else c:=menu(testmenu) ; end; '2':begin clrscr; writeln(''); writeln(' Aide:'); writeln('------'); Writeln(' Ce petit programme [TAE] vous aide a tester les expression aritmetique'); writeln(''); writeln(' de type parenthese ou non parenthese.'); writeln(''); writeln(' et pour tester une expression saisie la puis taper sur entrer '); writeln(''); writeln(' et expression est evaluer par le programme. '); writeln(''); writeln(' :=Enjoy=:'); writeln(''); writeln(' About:'); writeln('-------'); writeln(''); writeln(' GENERAL PUBLIC LICENSE COPYRIGHT SIM2X SOFTWARE '); writeln(''); writeln(''); writeln(''); writeln(' retour au menu principale Taper " n " '); readln(testmenu); c:=menu(testmenu) ; end; '3':exit; end; until keypressed; readln; end.

Conclusion :


Introduction :

L'un des problème les plus courant quand on fait la programmation par un langage moderne quelconque (Pascal, C++, Java...) on fait des erreur de syntaxe due a la manque de concentration du programmeur, et pour quand puisse savoir l'endroit de cette erreur plus vite et gagne du temps les concepteur du langage de programmation ont fait un programme qui évaluer la syntaxe et indique l'erreur s'il trouve.
Généralement ce évaluateur est intègre au compilateur, et varier selon sa puissance d'indique l'erreur et la cause .et pour illustrer ça en va essayer de faire un simple évaluateur de syntaxe d'une expression arithmétique.

Méthode utilise :(contre exemple)

? Représente l'expression écrite sous forme d'une chaîne de caractère.
? Utiliser la boucle for pour parcourir l'élément d'expression écrite.
? Selon chaque cas d'élément d'expression en cour,Successeur (alphabet, opérateur, parenthèse) on étudier les cas ou la syntaxe (Elm + Succ) est fausse, Les éléments de début et de la fin sont étudiés particulièrement.

Le tableaux suivant uni tous les cas :

Elément en cour (i) Successeur
(i+1) exemple Procédure appeler Etat de syntaxe
Alphabet Alphabet A B Test_alphabet Faux
Alphabet Parenthèse o A ( Test_openprts Faux
Opérateur Parenthèse f + ) Test_closeprts Faux
Opérateur Opérateur + + Test_operateur Faux
Parenthèse o Parenthèse f ( ) Test_closeprts Faux
Parenthèse o Oper (×, ÷) ( × Test_operprts Faux
Parenthèse f Parenthèse o ) ( Test_openprts Faux
Parenthèse f Alphabet ) A Test_alphabet Faux
First char '+','-','*','/',')' Test_first Faux
Last char '+','-','*','/','(' )* Affiche_suppr Faux
Spécial char @ ù é&"'è_ Affiche_spc Faux

? On suppose que l'expression est correcte (test=1) et on essai d'arriver a un contre exemple (tableaux précédent) cad (test=0) .
? A la fin on vérifier si ( test=1 et nombre parenthèses =0) pour dire a utilisateur que l'expression est correcte.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
178
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
2 février 2010

Vi vi j'ai vu .. mais je m'attendais plustot a voir ca dans les swag que dans delphifr ... ce qui me fais penser qu'il y a belle lurette que je suis pas allé fouiner dans les swag ...
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
31
c'est du Pascal JFS, c'est l'ancetre du delphi.

Delphi = Pascal Objet.

Pascal ou Turbo Pascal n'est pas POO.

mais la syntaxe reste identique a peu de chose prés.
Messages postés
178
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
2 février 2010

Hum hum ... c'est pas du code delphi ca ? .. ou alors j'ai rien compris ???

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.