Några fakta om Standard Pascal Serafim Dahl Carina Edlund m.fl. Hösten 2008
Några fakta om Standard Pascal 1 Fördefinierade procedurer och funktioner Typer som anges i denna sammanställning hänför till den i nästa avsnitt redovisade taxonomin över Pascals datatyper och har inte säkert en motsvarighet i Pascals typsystem utan kan motsvaras av en hel mängd möjliga typer. Abs(x: real): real eller Abs(x: Integer): Integer beräknar absolutvärdet av x. ArcTan(x: real): real beräknar det aritmetiska värdet arctangens x där x är uttryckt i radianer. Chr(i: integer): char returnerar det tecken som har ordningstalet i enligt den aktuella teckenkoden. Det blir ett felavbrott om det inte finns något sådant tecken. Cos(x: real): real beräknar cosinus x där x är givet i radianer. Dipose(q: pointer) där pointer måste vara av typen pekare till någon sorts post är en dynamisk allokeringsprocedur som avallokerar en identifierad variabel q och förstör det identifierande värdet q. Dispose(q) ger ett felavbrott om q är nil eller odefinierad. Värdet q måste ha skapats med kortformen för new. Dipose(q: pointer k 1... k n : variant) där pointer måste vara av typen pekare till någon sorts post och variant måste vara väljare för existerande varianta definitioner av den posttyp som q får referera till är en dynamisk allokeringsprocedur som avallokerar en identifierad variabel q och förstör det identifierande värdet q. Dispose(q k 1... k n ) ger ett felavbrott om q är nil eller odefinierad. Värdet q måste ha skapats med kortformen för new och k 1... k n måste välja samma varianter som de som valdes då q skapades. Eof(f: file): boolean där f får vara vilken slags filtyp som helst returnerar true om f är öppnad i skrivmod eller om f är öppnad i läsmod och f positionerats efter sista posten i filen. Eof(f) genererar ett fel om f inte är definierad. I alla andra fall returnerar eof(f) false. Om parametern utelämnas antas input vara parameter. Eoln(f: text): boolean returnerar true om textfilen f är öppnad för läsning och f positionerats på ett tecken som i den aktuella teckenkoden används för radslutsmarkering. Eoln(f) genererar ett fel om f är odefinierad eller om eof(f) är true. I alla andra fall returnerar eoln(f) false. Om parametern utelämnas antas input vara parameter. Exp(x: real): real beräknar det aritmetiska värdet e x (där e är basen för den naturliga logaritmen). Get(f: file) där f får vara vilken slags filtyp som helst är en procedur som avancerar positionspekaren för f så att den pekar på nästa i den sekvens av poster som f utgör om det finns en sådan post och också låter f anta denna posts värde. Om det inte finns någon nästa post i f så kommer eof(f) att få värdet true och f att bli helt odefinierad. Get(f) genererar ett fel om f är odefinierad eller om eof(f) har värdet true. Om parametern utelämnas antas input vara parameter. Ln(x: real): real beräknar den naturlig logaritmen för parametervärdet x som måste vara större än 0 (noll). Ln(x) genererar ett fel om x < 0.
2 Några fakta om Standard Pascal New(p: pointer) där pointer måste vara av typen pekare till någon sorts post är en dynamisk allokeringsprocedur som allokerar utrymme för en identifierad variabel p med samma domäntyp som p och skapar ett nytt identifierande pekarvärde som tilldelas p. Om p är en variant post allokerar new(p) tillräckligt med utrymme för att kunna få plats med den mest utrymmeskrävande varianten. New(p: pointer c 1... c n : variant) där pointer måste vara av typen pekare till någon sorts post och variant måste vara väljare för existerande (nästlade) varianta definitioner av den posttyp som p får referera till är en dynamisk allokeringsprocedur som allokerar utrymme för en identifierad variabel p med samma domäntyp som p med etiketterna c 1... c n för n nästlade varianter och skapar ett nytt identifierande pekarvärde som tilldelas p. Odd(i: integer): boolean returnerar true om i är ett udda heltal och false annars. Ord(x: discrete): integer där x är vilken diskret typ som helst fördefinierad eller användardefinierad returnerar ordningstalet för x i den mängd av värden där x ingår. Pack(a: array i: integer p: packed array) där a är någon sorts array-typ definierad i programmet och p är motsvarande packed array-typ är en dataöverföringsprocedur som packar innehållet i a från och med komponent i och lägger resultatet i p. Page(f: text): boolean lägger in en (implementationsberoende) markering i textfilen f som gör att text som skrivs till f efter anropet till page(f) vid utskrift kommer att hamna högst upp på en ny sida i utskriften. Om parametern utelämnas antas den var output och om f är odefinierad genereras ett fel. Pred(x: discrete): discrete är en funktion som returnerar den symbol i den diskreta ordning som x tillhör som står före x i den aktuella uppräkningen. Om x är det första värdet i den aktuella typens uppräkning genereras ett fel. OBS! att Ord(Pred(x)) = Ord(x) - 1. Put(f: file) där f får vara vilken slags filtyp som helst är en procedur som lägger värdet f sist i filen f. Ett fel genereras om f inte är definierad eller om f inte är öppnad för skrivning eller om f inte är definierad. Efter anropet till Put(f) är f helt odefinierad. Read(f: file v: variable) där v måste vara ett namn som är deklarerat i programmet och av samma typ som elementen i f eller om f är av typen text av någon typ vars literaler automatisk kan konverteras till v:s typ. Read(f v) tilldelar v värdet av nästa komponent i f om v har samma typ som elementen i f eller värdet som nästa literal i filen konverteras till. Positionspekaren i f avanceras till nästa position eller till positionen efter nästa literal vilket som är tillämpligt. Om parametern f utelämnas antas att dess värde är input. Read(f: file v 1 v 2... v n ) fungerar som om det stod read(f v 1 ) read(f v 2... v n ). Readln(f: file v: variable) fungerar som read med det tillägget att readln fungerar endast för textfiler och att resten av aktuell inmatningsrad ignoreras och att nästa läsning sker från nästa rad.
Några fakta om Standard Pascal 3 Readln(f: file v 1 v 2... v n ) fungerar som om det stod read(f v 1 ) readln(f v 2... v n ). Reset(f: file) där f får vara vilken slags filtyp som helst är en procedur som öppnar f för läsning och som positionerar positionspekaren så att f antar värdet av den första posten i den sekvens av poster som f utgör och sätter värdet av eof(f) till false om filen f inte är tom. Om filen är tom sätts värdet av eof(f) till false och värdet av f blir helt odefinierat. Rewrite(f: file) där f får vara vilken slags filtyp som helst är en procedur som öppnar f för skrivning ersätter f med en tom sekvens samt sätter värdet av eof(f) till false. Round(r: real): integer beräknar trunc(r + 0.5) för r 0.0 och trunc(r - 0.5) för r < 0.0 om det existerar ett sådant värde i typen integer. Annars genereras ett fel. Sin(x: real): real beräknar sinus x där x är givet i radianer. Sqr(x: real): real eller Sqr(x: integer): integer beräknar x * x. Om det inte existerar ett sådant värde genereras ett fel. Sqrt(x: real): real beräknar x. Om det inte existerar ett sådant värde genereras ett fel. Succ(x: discrete): discrete är en funktion som returnerar den symbol i den diskreta ordning som x tillhör som står efter x i den aktuella uppräkningen. Om x är det sista värdet i den aktuella typens uppräkning genereras ett fel. OBS!: Ord(Succ(x)) = Ord(x) + 1. Trunc(r: real): integer returnerar det största heltal som är mindre än eller lika med parametern r om r 0.0 och det minsta heltalet som är större än eller lika med r om r < 0.0 om det finns ett sådant tal i mängden av heltal. Annars genereras ett fel. Unpack(p: packed array a: array i: integer) där a är någon sorts array-typ definierad i programmet och p är motsvarande packed array-typ. Unpack är en dataöverföringsprocedur som packar upp innehållet i p och lägger resultatet i a från och med komponent i. Write(f: file v: variable) där v måste vara ett namn som är deklarerat i programmet och av samma typ som elementen i f eller om f är av typen text av någon typ vars värden automatisk kan konverteras till literaler. Write(f v) skriver v:s värde sist i f om v har samma typ som elementen i f eller den literal som värdet konverteras till om f är av typen text. Om parametern f utelämnas antas att dess värde är output. Write(f: file v 1 v 2... v n ) fungerar som om det stod write(f v 1 ) write(f v 2... v n ). Writeln(f: file v: variable) fungerar som write med det tillägget att writeln fungerar endast för textfiler och att nästa skrivning sker på ny rad (en eoln-markering skrivs omedelbart efter variabelns värde). Writeln(f: file v 1 v 2... v n ) fungerar som om det stod write(f v 1 ) writeln(f v 2... v n ).
4 Några fakta om Standard Pascal Förenklad taxonomi över Pascals datatyper Datatyper Enkla typer Pekartyper Strukturerade typer Real Diskreta typer Array Set Record File Uppräknade typer Fördefinierade Intervall Text Boolean Integer Char
Några fakta om Standard Pascal 5 Sammanställning över operatorer Aritmetiska operatorer operator operation operandtyp resultattyp + (unärt) identitet integer integer + (unärt) identitet real real (unärt) negering integer integer (unärt) negering real real + addition integer integer + addition real real subtraktion integer integer subtraktion real real multiplikation integer integer multiplikation real real div division integer integer / division real real mod modulus integer integer Relationsoperatorer operator operation operandtyp resultattyp = likhet enkel boolean = likhet sträng boolean = likhet set boolean = likhet pekare boolean < mindre än enkel boolean < mindre än sträng boolean > större än enkel boolean > större än sträng boolean <= mindre än eller lika med enkel boolean <= mindre än eller lika med sträng boolean <= inklusion mängd boolean >= större än eller lika med enkel boolean >= större än eller lika med sträng boolean >= inklusion mängd boolean in mängdtillhörighet element mängd boolean Booleska operatorer operator operation operandtyp resultattyp not negation boolean boolean or disjunktion boolean boolean and konjunktion boolean boolean
6 Några fakta om Standard Pascal Mängdoperatorer operator operation operandtyp resultattyp + union mängdtyp T T differens mängdtyp T T snitt mängdtyp T T Andra operatorer Tilldelning notation operation operandtyp resultattyp := tilldelning någon typ T ingen Variabelaccess notation operation operandtyp resultattyp [ ] arrayindexering array komponenttyp. fältaccess record fälttyp identifikation pointer post buffertaccess filtyp komponenttyp Konstruktorer notation operation operandtyp resultattyp [ ] mängdkonstruktion bastyp mängd strängkonstruktion teckentyp sträng
Några fakta om Standard Pascal 7 Standardidentifierare (som inte är reserverade ord) Konstanter false true maxint nil Typer boolean char integer real text Variabler input output Funktioner abs arctan chr cos eof eoln exp ln odd ord pred round sin sqr sqrt succ trunc Procedurer dispose get new pack page put read readln reset rewrite unpack write writeln Alfabetisk lista abs false pack sin arctan get page sqr boolean input pred sqrt char integer put succ chr ln read text cos maxint readln true dispose new real trunc eof odd reset unpack eoln ord rewrite write exp output round writeln Fördefinierade symboler Specialtecken + / = < > <= >= <>. : :=.. ( ) [ ]
8 Några fakta om Standard Pascal Reserverade ord 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 Alternativ representation (. för [.) för ] @ eller ^ för Direktiv forward
Några fakta om Standard Pascal 9 Syntax Pascals syntax bestäms av hur man kan vandra genom de här presenterade diagrammen i pilarnas riktning. De här korrigerar dessutom de som finns i kursboken. Symboler i fet stil inom cirklar och ovaler skall skrivas exakt som de står skrivna. Dessa symboler kallas terminaler. Det som står i kursiv stil inom rektanglar beskrivs i andra syntaxdiagram. Observera att syntaxbeskrivningen endast klargör hur satser i språket kan formas. Syntaxen måste kompletteras med en semantisk beskrivning som klargör vilka av de syntaktiskt korrekta konstruktionerna som har en betydelse i språket. En sådan beskrivning ligger utanför ramen för den här sammanställningen och inhämtas lämpligen genom studium av en bok om programmering i Pascal t ex Dahl Lindqvist: Pascal helt enkelt ISBN 91-44-47361-3. I just den boken finns fel i syntaxbeskrivningarna och de nedan givna korrigerar de i boken och (i viss mån) kompletterar dem. Vissa symboler kompletteras med klargöranden inom parentes endast för det som står utanför parentesen finns syntaxdiagram det som står inom parentesen är att betrakta som ett semantiskt förtydligande. program program identifierare ( (fil-) identifierare ) block. block deklarationsdel sammansatt sats
10 Några fakta om Standard Pascal deklarationsdel label lägesdeklaration const konstantdefinition type typdefinition var variabeldeklaration procedurdeklaration funktionsdeklaration lägesdeklaration lägesetikett lägesetikett teckenlöst heltal konstantdefinition identifierare = konstant typdefinition identifierare = typ
Några fakta om Standard Pascal 11 variabeldeklaration identifierare : typ procedurdeklaration procedurhuvud block direktiv funktionsdeklaration funktionshuvud block direktiv procedurhuvud procedure identifierare ( formell parameter ) funktionshuvud function identifierare ( formell parameter ) : (typ-)identifierare
12 Några fakta om Standard Pascal formell parameter var identifierare : (typ-)identifierare procedurhuvud funktionshuvud sträng vilket skrivbart tecken som helst utom identifierare direktiv bokstav bokstav siffra teckenlöst heltal siffra
Några fakta om Standard Pascal 13 konstant teckenlös konstant + teckenlöst heltal teckenlöst reellt tal (konstant-)identifierare teckenlös konstant teckenlöst heltal teckenlöst reellt tal (konstant-)identifierare sträng nil teckenlöst reellt tal teckenlöst heltal. teckenlöst heltal E teckenlöst heltal +
14 Några fakta om Standard Pascal typ (typ-)identifierare uppräknad typ intervalltyp pekartyp arraytyp packed posttyp filtyp mängdtyp uppräknad typ ( (konstant-)identifierare ) intervalltyp konstant.. konstant pekartyp (typ-)identifierare
Några fakta om Standard Pascal 15 arraytyp array [ typ ] of typ posttyp record fältlista end fältlista identifierare : typ variant del variant del case identifierare : (typ-) identifierare of variant variant konstant : ( fältlista )
16 Några fakta om Standard Pascal filtyp file of typ mängdtyp set of (uppräknad eller intervall-)typ sammansatt sats begin sats end sats lägesetikett : tilldelningssats procedursats sammansatt sats IF-sats CASE-sats WHILE-sats FOR-sats REPEAT-sats WITH-sats hoppsats
Några fakta om Standard Pascal 17 tilldelningssats variabel := uttryck (funktions-) identifierare procedursats (procedur-) identifierare ( aktuell parameter ) IF-sats if (villkors-) uttryck then sats else sats CASE-sats case uttryck of konstant : sats end
18 Några fakta om Standard Pascal WHILE-sats while (villkors-) uttryck do sats FOR-sats for (variabel-) identifierare := uttryck to downto uttryck do sats REPEAT-sats repeat sats until (villkors-) uttryck WITH-sats with (post-) variabel do sats hoppsats goto lägesetikett
Några fakta om Standard Pascal 19 aktuell parameter uttryck variabel (funktions-)identifierare (procedur-)identifierare uttryck enkelt uttryck < <= = <> >= > in enkelt uttryck enkelt uttryck term + + or term term faktor * / div mod and faktor
20 Några fakta om Standard Pascal faktor teckenlös konstant variabel funktionsdesignator ( uttryck ) not faktor mängdvärde funktionsdesignator (funktions-) identifierare ( aktuell parameter ) mängdvärde [ ] uttryck.. uttryck
Några fakta om Standard Pascal 21 variabel (variabel-) identifierare [ uttryck ] (fält-) identifierare. (fält-)identifierare bokstav A B... Z a b... z siffra 0 1 2 3 4 5 6 7 8 9
22 Några fakta om Standard Pascal Några rättelser till Pascal-boken Rapportera till Serafim via e-post om ni hittar mera!! sida rad/stycke står skall stå 1. 60 rad 1 I exempel 10 I ex 3 2. 80 rad 2 & 6 currentsegment segm 3. 120 i rutan i retrieve retrieve(alist el) retrieve(alist) 4. 129 mittenstycket rad 2 NextItem next 5. 134 mittenstycket rad 3 readchartypelist readtypelist 6. 137 I procedure readword VAR ch:char Ingenting (används inte) 7. 138 I proc skipblanks VAR ch:char Ingenting (används inte) 8. 145 sista stycket rad 4 konsektivt konsekutivt 9. 196 I function fib inner:=fibn inner:=fibn1 10. 219 I Ex1 rad 3 permits = (DC10 permit = (DC10 OBServera att många syntaxdiagram är felaktiga. Använd de som finns i detta häfte.