A PEARL programozási nyelv

Utasítások, vezérlési szerkezetek

Elágazás (IF)

Az elágazás általános alakja:

IF kifejezés THEN utasítás [ ELSE utasítás ] FIN;

A kifejezés eredménye BIT(1) típusú kell legyen. Az '1'B felel meg az igaz eredménynek. ELSE IF is használható a nyelvben.

Példa:

IF gradient > degree_bound
THEN alarm;
ELSE IF gradient > degree_threshold
THEN ALL 1 SEC ACTIVATE measurement; ! measure more often
FIN;
FIN;

Többszörös esetszétválasztás (CASE)

A PEARL a többszörös esetszétválasztás két formáját támogatja. A régebbi formában csak egész érték alapján történhet az esetszétválasztás, míg az újabb karaktert is megenged.

A régebbi forma általános alakja:

CASE kifejezés
ALT utasítás_1
ALT utasítás_2
...
[OUT utasítás_n]
FIN;

A kifejezés értékétől függően, az alternatívák sorban következnek: Az 1-es értékhez tartozó utasítás az első ALT után, a 2-es értékhez tartozó utasítás a második után stb. Az OUT után következő utasítás hajtódik végre minden egyéb esetben. Ennek az alternatívának a megadása nem kötelező.

A CASE után adott kifejezés értéke FIXED kell legyen.

Példa:

supply	TASK PRIO 7;

control: PROC (No FIXED, ! device
order BIT(8)) ! order inf.
RETURNS (FIXED);
! procedure body for carrying out the control order
END; ! control
...
! creating an order for the device with index no

again: CASE control (no, order) ALT ! order carried out
;
ALT ! order inf. wrong
CALL error(2); GOTO end;
ALT ! device dead
ACTIVATE device_breakdown PRIO 2;
CALL error(3); GOTO end;
ALT ! device works incorrectly
CALL device_check; GOTO again;
OUT ! result out of range
CALL error(5);
FIN;
...
end: END; ! supply

Az ALT kulcsszót minden esetben utasítás kell, hogy kövesse, de ez lehet az üres utasítás is.

A többszörös esetszétválasztás másik formájának általános alakja:

CASE kifejezés
ALT (esetek_1) utasítás_1
ALT (esetek_2) utasítás_2
...
[OUT utasítás_n]
FIN;

A CASE után a kifejezés értéke FIXED vagy CHAR(1) lehet. Az ALT után az esetek FIXED, ill. CHAR(1) típusú értékek, vagy intervallumok (int_kezdete:int_vége) felsorolását tartalmazzák vesszővel elválasztva. Az OUT megadása itt is opcionális.

Az esetszétválasztás determinisztikus kell legyen.

Példák:

1.

DCL (Operator, chr)CHAR(1), (x, y) FIXED;
...
CASE Operator
ALT (’+’) x := x + y;
ALT (’-’) x := x - y;
ALT (’*’) x := x * y;
ALT (’/’) CASE y
ALT (0) CALL Error;
OUT x := x//y;
FIN;
FIN;

2.

CASE chr
ALT (’A’:’Z’) CALL uppercase;
ALT (’a’:’z’) CALL lowercase;
FIN;

3.

CASE chr
ALT (’A’, ’E’, ’I’, ’O’, ’U’, ’a’, ’e’, ’i’, ’o’, ’u’) CALL Vocal(chr);
...
FIN;

A CASE két formája nem keverhető, ezért a következő példa hibás:

CASE ErrNum
ALT /* 1 */ CALL ok;
ALT (0) CALL nothing done;
ALT (-99:-1) CALL ErrorMsg (ErrNum);
...

Ugrás az esetszétválasztáson belülre tilos.

Ciklus

A ciklus általános alakja a PEARL-ben a következő:

[ FOR ciklusváltozó ] [ FROM kifejezés-kezdőérték ] [ BY kifejezés-növekmény ] [ TO kifejezés-végérték ] [ WHILE kifejezés-feltétel ]
REPEAT
...
END [azonosító];

A FOR, a FROM, a BY, a TO és a WHILE közül bármelyik elhagyható.

A ciklusváltozót nem kell deklarálni, és nem lehet az értékét a ciklusmagban megváltoztatni. A típusa FIXED.

Ha a kezdőértéket, vagy a növekményt elhagyjuk, akkor az alapértelmezett 1 lesz az értékük. A végérték elhagyásával a ciklusmag lefutásainak számát nem korlátozzuk, ha ezen kívül nem adunk meg ciklusfeltételt (WHILE), akkor végtelen ciklust kapunk. A kezdőérték, a végérték, és a növekmény típusa is FIXED kell legyen.

A ciklusfeltételt adó kifejezés típusa BIT(1).

A ciklusból ugró utasítással, illetve az exit utasítással lehetséges kiugrani a ciklus lefutása közben, de a ciklusmagba való ugrás tilos.

Példák:

1.


FOR i TO num.devices ! vagy: FOR i FROM 1 BY 1 TO num.devices
REPEAT
checking of device(i)
END;

2.

FOR i TO 10
REPEAT
FOR k TO 10
REPEAT
c (i,k) := a (i,k) + b(i,k);
END;
END;

Feltétel nélküli vezérlésátadás (GOTO)

Egy PEARL programban tetszőleges kifejezést jelölhető címkével (akár többször is), és GOTO utasítással elérhető, hogy a program futása egy ilyen címkével jelölt utasításnál folytatódjon. Az egyetlen feltétel, hogy az utasítás ugyanannak a taszknak illetve eljárásnak a törzsében szerepeljen. ahol a GOTO utasítást is meghívtuk.

Példa:

...
measure: read: READ value FROM device;
...
GOTO read;

Az EXIT utasítás

Az EXIT utasítást blokkból, illetve ciklusból való kiugrásra használható. Alapesetben az utasítást tartalmazó legbelső blokk, vagy ciklus után következő utasításnál folytatja a program a futását, de több egymásba ágyazott blokkból, illetve ciklusból is kiléphetünk egyszerre. Ezt akkor tehetjük meg, ha a megfelelő blokkot, vagy ciklust elláttuk címkével.

Az utasítás nem használható eljárásokból, illetve taszkokból való kilépésre.

Példa:

...
BEGIN /* analysis */
...
TO number REPEAT /* comparison */
...
IF MeasuredValue < BoundaryValue
THEN EXIT analysis;
ELSE ...
FIN;
...
END comparison;
...
END analysis;
RETURN (OK);
...

Az "EXIT analysis" utasítás után a program futása a "RETURN (OK)" utasítással fog folytatódni.

A PUT, és a GET utasítás

Mindkét utasítás mögé fel lehet sorolni egy változólistát, majd a TO, illetve FROM után megadhatjuk, hogy melyik kimenetre írunk ki, illetve honnan olvasunk, végül pedig a BY után megadhatjuk a változók formátumának listáját. A változólista elemeihez a felsorolás sorrendjében lesznek hozzárendelve a formátumlista elemei. Amennyiben több elem van a formátumlistán, akkor a felesleges elemeket nem vesszük figyelembe. Ha a formátumlista végére értünk, de még maradt változónk, amit kiíratnánk, akkor a folyamat a formátumlista elejétől újrakezdődik. Az átvitel mindenképp terminál, amennyiben a változólista végére értünk.

Megjegyzés: Az eddig említett változólista a GET parancs használatára vonatkozik. A PUT parancsnál írhatunk változó helyett kifejezést is, hiszen természetesen nem csak változót írathatunk ki.

A következő felsorolás megmutatja, hogy milyen formátumokkal milyen típusú adatokat tudunk kiíratni, illetve beolvasni (zárójelben a formátum egybetűs rövidítése van, melyet a BY szó utáni részben használhatunk):

Példák:

Két változó kiíratása:

a := 5; x := 2.33; ... PUT a, x TO printer BY LIST;

Sorrendben: egy 13 karakteres string, egy négyjegyű egész, majd új sorba ugyanígy egy 13 karakteres string, és egy négyjegyű egész kiíratása:

DCL (artno, stock) FIXED; ... PUT ’article no:’, artno, ’stock:’, stock TO stock monitor BY A(13), F(4), SKIP, A(13), F(4);

Három változó értékének bekérése a megfelelő formátumot használva

article id CHAR(10), quantity FIXED, price FLOAT; ... GET article id, quantity, price FROM input file BY A(10), F(9), E(9), SKIP;