Några fakta om Standard Pascal
Serafim Dahl, Carina Edlund, m.fl.
Hösten 2008
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, k1, . . . , kn: 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, k1, . . . , kn) ger ett felavbrott om q är nil eller odefinierad. Värdet q måste ha skapats med kortformen för new och k1, . . . , knmå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ärdetex(däre ä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.
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, c1, . . . , cn: 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 c1, . . . , cnförn 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, v1, v2, . . . , vn) fungerar som om det stod read(f, v1); read(f, v2, . . . , vn).
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.
Readln(f: file, v1, v2, . . . , vn) fungerar som om det stod read(f, v1); readln(f, v2, . . . , vn).
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, v1, v2, . . . , vn) fungerar som om det stod write(f, v1); write(f, v2, . . . , vn).
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, v1, v2, . . . , vn) fungerar som om det stod write(f, v1); writeln(f, v2, . . . , vn).
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
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
Mängdoperatorer
operator operation operandtyp resultattyp
+ union mängdtypT T
− differens mängdtypT T
∗ snitt mängdtypT T
Andra operatorer
Tilldelning
notation operation operandtyp resultattyp
:= tilldelning någon typT 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
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
+ − ∗ / =
< > <= >= <>
. , : ; := ..
( ) [ ] ↑
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
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
deklarationsdel
label
const
type
var
lägesdeklaration
konstantdefinition
typdefinition
variabeldeklaration
procedurdeklaration funktionsdeklaration
;
;
;
;
;
;
lägesdeklaration
lägesetikett ,
lägesetikett
teckenlöst heltal
konstantdefinition
identifierare = konstant
typdefinition
identifierare = typ
variabeldeklaration
identifierare ,
: typ
procedurdeklaration
procedurhuvud ; block
direktiv
funktionsdeklaration
funktionshuvud ; block
direktiv
procedurhuvud
procedure identifierare ( formell
parameter )
;
funktionshuvud
function identifierare ( formell
parameter )
;
: (typ-)identifierare
formell parameter
identifierare : (typ-)identifierare
var ,
procedurhuvud
funktionshuvud
sträng
vilket skrivbart tecken som helst utom ’
’ ’
identifierare, direktiv
bokstav
bokstav siffra
teckenlöst heltal
siffra
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 +
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
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 )
,
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
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
,
;
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
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
faktor
teckenlös konstant
variabel funktionsdesignator
( uttryck )
not faktor
mängdvärde
funktionsdesignator
(funktions-) identifierare
( aktuell parameter )
,
mängdvärde
[ ]
uttryck
.. uttryck
,
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
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.