Vous êtes sur la page 1sur 22
APPENDICE A PROCEDURE E FUNZIONI, STANDARD Procedure per il trattamento dei flussi put (f) get (f) reset (f) rewrite (f) page (f) appende, al flusso f, il valore della variabile buffer ft; 2 applicabile solo se prima dell’esecuzione eof (f) é vero; eof (f) rimane vero e ft diviene indefinito. posiziona sulla prossima componente del flusso ed assegna questa componente alla variabile buffer f1. Se non esiste una “prossima componente”, eof (f) diventa vero ed il valore di ft & indefinito. E applicabile solo se eof (f) é falso prima dell’esecuzione. riposiziona, per permettere una lettura, all’inizio del flusso la posizione corrente: assegna cioé alla variabile buffer ft il valore del primo elemento di f; eof (f) diviene falso se f non é vuoto, altrimen- tio ft & indefinito ed eof (f) rimane vero. sostituisce il valore corrente di f con il flusso vuoto. eof (f) diventa vero e pud essere scritto con nuovo flusso. fa si che la stampante passi all’inizio della nuova pagina prima di stampare la prossima linea di un flusso-testo. read, readIn, write, writeln, sono analizzate nel capitolo 12. Procedure di allocazione dinamica new (p) alloca una nuova variabile v ed assegna I'indirizzo div alla variabile puntatore p. Se vé tipo record con variante, la forma new (p, tl,...tn) ud essere usata per allocare una variabile con valore di 114 campo discriminatore t1...tn. I valori dei campi discrimi- natori devono essere elencati in modo contiguo e nello stesso ordine della loro dichiarazione; non possono essere cambiati durante l’esecuzione. dispose (p) indica che la memoria occupata dalla variabile p non é pid necessaria. dispose (p, tl,...,tn) pudessere usata per indicare che memoria occupata dalla variabile p (con valore di campo discriminatore t1...tn) non é pitt necessaria, I valori dei campi devono essere identici a quelli usati nell’allocazione della variabile. Procedure per trasformazione dati pack (a, i, z) se a é una variabile vettore del tipo array [m..n] of T ez & una variabile di tipo packed array [u..v] of T in cui n-m >= v-u, allora la procedura @ equivalente a: for u to v doz [i] =a [j-uti] unpack (z, a, i) & equivalente a for j u to v doa [j-uti Funzioni aritmetiche abs (x) _calcola il valore assoluto di x. X pud essere sia intero che reale ed il risultato é dello stesso tipo di x. sqr (x) calcola x*x. X pud essere sia intero che reale ed il risultato é dello stesso tipo di x. sin (x) mentre il risultato @ sempre reale, x pud essere intero o reale (Questo vale anche per le funzioni che seguono). cos (x) arctan (x) exp (x) In (x) (logaritmo naturale) sqrt (x) (radice quadrata) Predicati (funzioni booleane) odd (x) x deve essere intero; il risultato & vero se x é dispari e falso se é pari. 115 coln (f) dail valore vero quando, leggendo il flusso-testo f, é raggiunta la fine della linea corrente. eof (f) da il valore vero quando, leggendo il flusso-testo f, é raggiunta la fine del flusso. Funzioni di trasformazione trunc (x) x deve essere reale; il risultato él'intero pit grande minore od eguale ad x per x>=0, ed il pit’ piccolo intero maggiore od eguale ad x per x<=0. round (x) x deve essere di tipo reale; il risultato - intero é il valore arrotondato. Vale a dire: round (x) = trunc (x+0.5), per x > 0 trunc (x-0.5), per x < 0 ord (x) dail numero associato ad x nell’insieme dei valori definiti dal tipo x. chr (x) x deve essere intero ed il risultato é il carattere il cui numero ordinale é x (se esiste). Altre funzioni standard succ (x) x pud essere di qualunque tipo scalare, eccettuato reale, ed il risultato @ il successore di x (se questi esiste) pred (x) x pud essere di qualunque tipo scalare, eccettuato reale, ed il risultato @ il predecessore di x (se questi esiste). 116 Operatore aritmetici: + (unario) - (unario) div / mod relazioni: So < > logici: not or and su insiemi: ee * APPENDICE B SOMMARIO DEGLI OPERATORI Operazione assegnamento identita inversione di segno addizione sottrazione moltiplicazione divisione intera divisione reale modulo uguaglianza disuguaglianza minore di maggiore di minore o uguale inclusione maggiore 0 uguale inclusione appartenenza negazione disgiunzione congiunzione unione differenza di insiemi intersezione Tipo operanat qualunque tipo eccettuati flussi Tipo risultato intero o reale stesso dell’operando intero o reale intero 0 reale intero intero intero o reale reale intero intero scalare, stringa, set 0 puntatore scalare o stringa Booleano scalare o stringa set scalare o stringa set primo operando scalare, il secondo & il suo tipo set Booleano Booleano qualsiasi ins.tipoT — T 17 APPENDICE C TAVOLE A. Identificatori standard Costanti: false, true, maxint Tipi: integer, Boolean, real, char, text Parametri di programma: input, output Funzioni: abs, arctan, chr, cos, eof, eoln, exp, In, odd, ord, pred, round, sin, sqr, sqrt, succ, trunc Procedure: get, new, pack, page, put, read, readln, reset, rewrite, unpack, write, writeln B. Parole delimitatrici (parole riservate) and end nil set array file not then begin for of to case function or type const goto packed until div if procedure var do in program while downto label record with else mod _ repeat C. Identificatori non standard predefiniti in PASCAL 6000 - 3.4 Tipi: alfa Funzioni: card, clock, eos, expo, undefined Procedure: date, getseg, halt, linelimit, message, putseg, time 118 APPENDICE D SINTASSI Formalismo di Backus-Naur (BNF) Si noti che i simboli non sono simboli del linguaggio PASCAL ma dei meta-simboli del formalismo BNF. Le parentesi graffe stanno ad indicare 0 o pit ripetizioni dei simboli racchiusi; quindi: A {B} @ una formulazione sintetiga della regola puramente recursiva: A = | AB ::= ::= program ( {, } ); { } {lettera o cifra> = | {blocco} ::= ::= | label {, }; ::= intero senza segno> | const {, }; ::= = ::= | | | | ::= | = { } 119 . { } | . { } E | E ::= | ::= ::= ’ { }* ::= | type {; }; ::= = | | ::= | | ::= ( {, } ) .. ::= tipo strutturato> ::= | packed tipo strutturato disimpaccato> ::= | | | array [ {, } ] of ::= ::= ::= record end ::= | ; | ::= {; } ::= {, } : | ::= case of {; } ::= : | ::= : () | {, } ::= ::= set of ::= ::= file of ::= 1 120 | var {; }; {, {identificatore> } : > | procedure ; | procedure ( } ); ::= | var | function | procedure {, } identificatore> {, } : = intestazione funzione> function : ; function ( {; }): ; : ::= ::= begin {; istruzione } end ::= | : | = | | | := | := ::= | | [ {, } ] 121 = . :: ::= 1 t ::= | = = | <> | <| <=|>=|>| in | | +1 - lor | * | / | div | mod | and | | ( ) | | | not = | | | | nil | ( {, } ) ::= [ ] ::= . {, } | vuoto ::= | .. ::= | ( parametro effettivo {, } ) = | | | goto 122 | | | | = if then | if then else ::= case of {; } end ::= : | {, } | | while do repeat {; } until for := do to | downto {I ::= with do {, } 123 euwesBorg 29018 ba 126 ee 12: 13: 14: 1S: 16: 17: 18: 19: 20: are Sowmrianavne APPENDICE E NUMERAZIONE ERRORI errore su tipo semplice é richiesto un identificatore é richiesto *program’ é richiesto *)’ é richiesto *:” simbolo non permesso errore nell’elenco parametri é richiesto ‘of & richiesto °° errore su tipo é richiesto * [ é richiesto ‘ é richiesto ‘end’ é richiesto *y é richiesto un intero é richiesto ’=" é richiesto ’begin’ errore nella sezione dichiarazione errore nell’elenco campi é richiesto *.” é richiesto * ** errore in una costante é richiesto *:=" é richiesto ‘then’ é richiesto ‘until’ é richiesto ‘do’ é richiesto "to’ / *downto’ é richiesto "if é richiesto ‘file’ errore di fattore errore di variabile identificatore dichiarato due volte limite inferiore superiore al limite superiore identificatore non della classe corretta identificatore non dichiarato 127 105: 106: 107: 108: 109: 110: M1: eee oe 114: ase: 116: Tihs 118: epee 120: 121: 122: Reais 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138 : 139: 140: 141: 142: 143: 144: 145: 128 non é permesso il segno é richiesto un numero tipi sottocampo incompatibili qui non é concesso un flusso il tipo non deve essere reale il campo discriminatore deve essere scalare 0 sottocampo non compatibile con il campo discriminatore Pindice non pud essere reale lindice deve essere scalare 0 sottocampo il tipo base non deve essere reale il tipo base deve essere scalare 0 sottocampo il tipo del parametro di una procedura standard é errato riferimento in avanti non soddisfatto riferimento in avanti per identificatore tipo in dichiarazione variabile dichiarato in “avanti”; non @ concesso ripetere elenco parametri il tipo del risultato di una funzione deve essere scalare, sottocampo 0 puntatore non é permesso un valore flusso come parametro funzione dichiarata in avanti; non é permessa la ripetizione del tipo del risultato é@ stato omesso il tipo del risultato nella dichiarazione di funzione formato F solo per reali é errato il tipo di un parametro di una funzione standard il numero dei parametri non si accorda con la dichiarazione sostituzione non legale di parametri non c’é accordo tra dichiarazione ed il tipo del risultato di un parame- tro funzione conflitto tra il tipo degli operandi l’espressione non é di tipo set & concessa solo la verifica di disuguaglianza non é concessa inclusione stretta non é concesso confronto di flussi il tipo degli operandi non é tra quelli consentiti il tipo degli operandi deve essere booleano il tipo degli elementi di un insieme deve essere scalare 0 sottocampo i tipi degli elementi di un insieme non sono compatibili la variabile non é di tipo vettore il tipo dell’indice non é compatibile con la dichiarazione la variabile non é di tipo record la variabile deve essere di tipo flusso 0 puntatore sostituzione non legale di parametri la variazione di controllo della ripetizione é di tipo non consentito espressione di tipo non consentito conflitto di tipi 146: 1 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: ioe 160: 161: 162: 163: 164: 165: 166: its 168: 169: 170: 171: 172: ee 174: 175: 176: aes a 179: 180 : 181: 201: 202: 203: 204: non é concesso l’assegnamento a flussi il tipo dell’etichetta ¢ incompatibile con l’espressione di selezione i limiti di un sottocampo devono essere scalari Vindice non pud essere di tipo intero non é concesso I’assegnamento a funzioni standard non é concesso l’assegnamento a funzioni formali non c’é un campo come questo nel record errore di tipo in lettura il parametro effettivg deve essere una variabile la variabile di controllo non deve essere dichiarata in un livello intermedio definizione multipla di etichetta in una selezione troppi casi in un’istruzione di selezione omessa la dichiarazione della variante corrispondente non sono permessi reali o stringhe come campi selezionatori la dichiarazione precedente non era "in avanti” ancora dichiarata in avanti la dimensione del parametro deve essere costante variante omessa nella dichiarazione non é connessa la sostituzione di proc/funzioni standard etichetta con definizioni multiple etichetta con dichiarazioni multiple etichetta non dichiarata etichetta non definita errore nell’insieme base é richiesto un parametro valore flusso standard ri-dichiarato flusso esterno non dichiarato é richiesta una procedura o funzione fortran @ richiesta una procedura o funzione pascal omesso il flusso “input” nell'intestazione del programma omesso il flusso “output” nell’intestazione del programma qui non sono concessi assegnamenti a identificatori di funzione variante di record con definizioni multiple X-opt di proc/funz. effettive non in accordo con dichiarazione for- male la variabile di controllo non deve essere formale la parte costante indirizzo fuori dai limiti errore in costante reale: é richiesta cifra una costante stringa non deve superare una linea costante intera oltre i limiti 8 o 9 in numero ottale 129 205 : 206 : 250 : eee 252: oat 254: 255: 256 : 257: 258 : 259 : 260 : 300: 301: 302 : 303 : 304 : 398 : 399: 130 ci deve essere almeno una stringa parte intera di una costante reale oltre i limiti troppe nidificazioni di identificatori troppe nidificazioni di procedure e/o funzioni troppi riferimenti in avanti di ingressi di procedure procedura troppo lunga costanti troppo lunghe in questa procedura troppi errori in questa linea sorgente troppi riferimenti esterni troppi esterni troppi flussi locali espressione troppo complicata troppe etichette d’uscita divisione per zero non é previsto un caso per questo valore espressione dell’indice oltre i limiti il livello che va assegnato é oltre i limiti elemento dell’espressione non nei limiti restrizione implementativa non sono implementate dimensioni variabili per vettori APPENDICE F ESEMPI DI PROGRAMMAZIONE {procedure per leggere e scrivere dei numeri reali usate dalle procedure stan- dard read (f, x) e write (f, x:n) } procedure rdr (var f: text; var x: real); { legge i numeri reali in formato libero } const t4 8 = 28147976710656; limit = 56294995342131; z= 27; { ord (0’) } liml = 322; { esponente massimo } lim2 = -292; { esponente minimo } type posint = 0..323; var ch: char; y: real; a, i, e: integer; s, 8s: boolean { segni } function ten (e: posint): real; { = 10**e, 0 liml then begin message (’** numero troppo grande’); halt end; { 0 =t48 then y else y ((at+]) div 2)* 2.0 a; [= y/ten (-e) else if e <> O then x = *ten (c) else x = y; end; procedure wre (var f : text; x : real; n : integer); { scrive un numero reale x con n caratteri nel formato decimale virgola mobile. Le costanti che seguono sono vincoli del CDC. } const t48 = 28147497710656, = 2**48 2 = 27; {ord ('0")} type posint = 0..323; var c, d, e, e0, el, €2, i: integer; function ten (e:posint) : real; {10**e, 0 = 10 then begin x := x/100; ¢ == e+1 end end else begin e := (e+1)* 77 div 256; x == x/ten (-e)* x; if x < 0.1 then 134 end; begin x := 10.0 * x;e == e-1 end 0.1 << =x < 1.0} case n of {arrotondamento} end end 2:x 32x 4:x 5:x 6:x Tix Bix 9: x = x40.5e9; 10 : x = x+0.5e-10; I: x = x+0.5e11; 12: x := x+0.5e-12; 13: x = x+0.5e-13; 14: x = x+0.5e-14; 15: x := x+0,5e-15; end; if x > = 10 then begin x := x * 0.1; := e+]; end; trunc (x, 48); 10 * c; d = c div 148; chr (d-+z); put (f); "75 put (f); 2 tondo (c-d * t48)* 10; d chr (d-+z); put (f) © div t48; *e’; put (A); € if < 0 then begin f t end else begin f 1 put (f); end; el = e * 205 div 2048; e2 :-= € -10 * el; 0 = el * 205 div 2048; e := el -10 * e0; chr (e0-+2); put (); chr (e1+z); put (); ft := chr (€2+2); put (f); end {wre}; 135

Vous aimerez peut-être aussi