{ =========================================================== CECI EST UN COMMENTAIRE qui prendra fin a la prochaine accolade fermante un exemple de programme MiniPasc correct syntaxiquement, mais completement faux semantiquement TP1 - ift2030 - automne 2002 ============================================================ } program tp1Source5; { ==================================================== des variables globales ==================================================== } var x,y: integer; var tab1: array [10..1] of integer; {ERREUR SEMANTIQUE: borne inf > borne sup} var tab2: array [1..10] of integer; var x: integer; {ERREUR SEMANTIQUE: x a deja ete declaree} { ==================================================== une procedure sans parametre, son nom est encore, elle possede une variable locale a ==================================================== } procedure encore ; var a: integer; begin c := 4; {ERREUR SEMANTIQUE: c n'est pas declaree} a:= y[15]; {ERREUR SEMANTIQUE: y n'est pas un tableau} write(a); if (a * 3) then a := a + d {ERREUR SEMANTIQUE: d n'est pas declaree} else a := a + 20; write(a) end; {Note: en Pascal, le ; est indispensable ici (separateur des declarations a venir) } { ==================================================== une procedure avec deux parametres, elle possede une variable locale x et trois parametres: deux entiers a et b et un tableau de 10 entiers t ==================================================== } procedure nouvelleProcedure(a,b:integer; t:array[1..10] of integer) ; var x: integer; {Note: ce x masque le x global (ce qui est autorise en MiniPasc)} var a: integer; {ERREUR SEMANTIQUE: a masque le parmetre formel a} begin x := t[1] + b end {NOTE: en MiniPasc, on ne met pas de ; apres le end de la derniere procedure} { ==================================================== le bloc principal (ne peut acceder qu'aux variables globles (comme en C ou en Java) ==================================================== } begin x := 3+2; x := x + tab2[2]; y := tab2[2] + tab2[2]; tab2[0] := 3; {ERREUR SEMANTIQUE: les indices valides de tab2 sont entre 1 et 10 (inclus)} tab2[1] := 5; tab2[11] := 4; {ERREUR SEMANTIQUE: les indices valides de tab2 sont entre 1 et 10 (inclus)} tab2[1-(100-100)] := 3; {tab[1]} tab2[1+(3*(2*(3-1)))] := 5; {ERREUR SEMANTIQUE CAR tab[13] -- MAIS NECESSITE LE CALCUL DE L'EXPRESSION CST -- CA N'EST PAS DEMANDE} y := tab2[2] + tab2[2+(3*15)]; {idem: c'est une erreur semantique non demandee} tab2[x+y] := 3; {la, on ne peut pas verifier le bon indicage du tableau} maProcedure(); {ERREUR SEMANTIQUE: la procedure maProcedure n' existe pas} tab(); {ERREUR SEMANTIQUE: la procedure tab n' existe pas} nouvelleProcedure(2,3,tab2); encore(); encore(2+3); {ERREUR SEMANTIQUE: la procedure encore n'a pas de parametre} encore(2+3,x) {ERREUR SEMANTIQUE: la procedure encore n'a pas de parametre} end {La par contre il ne faut pas de ; c'est de toute facon decrit dans la BNF}