• No results found

Några fakta om Standard Pascal. Serafim Dahl, Carina Edlund, m.fl.

N/A
N/A
Protected

Academic year: 2022

Share "Några fakta om Standard Pascal. Serafim Dahl, Carina Edlund, m.fl."

Copied!
24
0
0

Loading.... (view fulltext now)

Full text

(1)

Några fakta om Standard Pascal

Serafim Dahl, Carina Edlund, m.fl.

Hösten 2008

(2)
(3)

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 qoch 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 fatt 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.

(4)

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.

(5)

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).

(6)

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

(7)

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

(8)

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

(9)

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

+ − ∗ / =

< > <= >= <>

. , : ; := ..

( ) [ ] ↑

(10)

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

(11)

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

(12)

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

(13)

variabeldeklaration

identifierare ,

: typ

procedurdeklaration

procedurhuvud ; block

direktiv

funktionsdeklaration

funktionshuvud ; block

direktiv

procedurhuvud

procedure identifierare ( formell

parameter )

;

funktionshuvud

function identifierare ( formell

parameter )

;

: (typ-)identifierare

(14)

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

(15)

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 +

(16)

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

(17)

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 )

,

(18)

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

(19)

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

,

;

(20)

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

(21)

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

(22)

faktor

teckenlös konstant

variabel funktionsdesignator

( uttryck )

not faktor

mängdvärde

funktionsdesignator

(funktions-) identifierare

( aktuell parameter )

,

mängdvärde

[ ]

uttryck

.. uttryck

,

(23)

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

(24)

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.

References

Related documents

Abstract: In this second article on q-Pascal matrices, we show how the previous factorizations by the sum- mation matrices and the so-called q-unit matrices extend in a natural way

[r]

[r]

SCANNING MIRROR

När jag läser boken kan jag inte låta bli att tänka på om bacha posh är ett sätt för afghanska flickor att förbigå de många hindren i kampen för jämställdhet och

The main contributions of the thesis are a quality model for feature models, procedures for prioritizing and evaluating quality in feature models, and an initial set

Man kan inte alltid vara uppe på koturnen —• jag önskar ofta att man kunde få se sådana som äro det, när de komma för sig själva.. Men i och för sig är småpratet en

D˚ a str˚ alen forts¨atter rakt fram m˚ aste dessa tv˚ a krafter vara