A Simula programozási nyelv

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



Szintaxis

<utasítás>::= <ALGOL feltétel nélküli utasítás>| <feltételes utasítás>| <for utasítás>| <INSPECT utasítás>| <while utasítás>
<címke nélküli alaputasítás>::= <átadó utasítás>| <go to utasítás>| <üres utasítás>| <eljáráshívás>| <ütemező utasítás>| <objektumgenerátor>
<feltételes utasítás>::= <ALGOL feltételes utasítás>| <IF feltétel><INSPECT utasítás>| <IF feltétel><while utasítás>
<átadó utasítás>::= <értékadó utasítás>| <hivatkozásadó utasítás>
<baloldal 1>::= <változó>| <eljárásazonosító>| <egyszerű szövegkifejezés>
<jobboldali érték>::= <érték típusú kifejezés>| <szövegkifejezés>| <értékadó utasítás>
<értékadó utasítás>::= <baloldal 1>:= <jobboldali érték>
<baloldal 2>::= <változó>| <eljárásazonosító>
<jobboldali hivatkozás>::= <hivatkozási típusú kifejezés>| <hivatkozásadó utasítás>
<hivatkozásadó utasítás>::= <balolda 2>:- <jobboldali hivatkozás>

Értékadó utasítások

Az értékadó utasítás jele a ":=" operátor. Egy érték átadását jelöli ki az utasítás bal oldalán szereplő érték típusú változónak, szövegtárolónak vagy függvényeljárás azonosítójának. A hivatkozásadó utasítás jele a ":-" operátor. A hivatkozásadó utasítás a bal oldalon szereplő hivatkozás típusú változónak, ill. függvényeljárás azonosítójának szóló hivatkozásadást jelöli ki. Bármely, az átadás bal oldalán szereplő vagy annak részét képező kifejezés a jobboldali rész kiértékelését megelőzve értékelődik ki. Az értékadó utasítás objektumokra nem használható.

Példa: X := If a>b Then a Else b; X:=Y:=0;

Objektumhivatkozások átadásakor három eset lehetséges:

Szekvencia

Az utasítások elválasztása ';'-vel történik;

Elágazás

Egyirányú elágazásra a szokásos szerkezetet használhatjuk.

if boolean_expression then  ...

Többirányú elágazásra az else if szerkezet használható.

if boolean_expression then ... else if boolean_expression then ... else ...

Ha az elágazás ágai több utasítás szekvenciájából állnak, akkor azokat begin ... end blokkba kell zárni. Ennek használatával elkerülhető az if else összetartozásának problémája. Egy változó, vagy kifejezés lehetséges értékei alapján történő "case" típusú elágazásra nincs lehetőség.

Ciklusok

Számlálós ciklus

A ciklusfej végrehajtásának eredményétől függően a ciklustörzset egyszer sem, vagy pedig egymás után többször is végre kell hajtani. A törzs minden egyes végrehajtását megelőzi a ciklusváltozó módosítása és annak vizsgálata, hogy a cikluslista végrehajtás alatt lévő eleme nem merült-e már ki. A ciklusváltozó egyszerű változó, amely nem lehet eljárásazonosító és névszerint átadott formális paraméter. Értéke a for utasítás elhagyásakor az utolsó átadási művelet eredményét jelöli. A ciklustörzs mindig blokkszerűen működik, ezért a törzs elején, vagy azon belül definiált címkékhez a ciklustörzsön kívülről nem lehet hozzáférni.

integer i; for i:=1 step 2 until k do ...

A for ciklus rendkívül gazdag módon támogatja a ciklusváltozó értékeinek beállíthatóságát. Tekintsük az alábbi összetett példát:

integer i; for i:= 1, 13, ! először felveszi ezeket a konstans értékeket ; 20 step 10 until 40, ! majd 20-tól 40-ig tízesével lépked ; 70, ! ezután felveszi a 70 értékét ; i+1 while i lt 76, ! majd az aktuális értéket növeli, míg kisebb mint 76 ; 100 step 50 until 250, ! majd 100-tól 250-ig ötvenesével lépked ; 1000, 1500 ! végül az 1000 és az 1500 értékét veszi fel ; do OutInt(i,5);

Az eredmény a következő:

1 13 20 30 40 70 71 72 73 74 75 100 150 200 250 1000 1500

Előltesztelős ciklus

A while utasítás törzse olyan programrész, amelyet egyszer sem, vagy pedig többször kell végrehajtani. Ha a kiértékelt logikai kifejezés true, akkor a ciklustörzs végrehajtódik, majd a vezérlés ismét visszatér a while utasítás kezdetére, ahol a logikai kifejezés újra kiértékelődik. Ha a kifejezés false, akkor a vezérlés a while utasítást követő programrészre kerül.

while boolean_expression do ...

Mindkét esetben begin ... end blokkba kell zárni a ciklusmagot, ha az több utasítás szekvenciájából áll.

Feltétlen vezérlésátadás

Bármely időpontban jelölje PVP (Program Végrehajtási Pont) azt a programpontot, ahol a program végrehajtása pillanatnyilag tart. Ez a pont egy blokkpéldányhoz tartozik. A helymegjelölő kifejezés valamely blokkpéldányon belül egy programpontot definiál. A goto utasításnak egy ilyen helymegjelölő kifejezést kell megadni.

Prefixes blokkok

A prefixes blokk olyan összetett objektumnak egy példánya, amelynek prefix része a blokk prefixe által azonosított osztály objektuma, fő része pedig maga a blokk. A prefixes blokk létrehozásával kapcsolatban két korlátozást kell betartani:

A prefixes blokk segítségével programjainkat előre megírt környezetben futtathatjuk. Hatására az osztály és a blokk összeolvad (, mint az osztály a részosztályával), és létrejön egy objektum példány a megfelelő aktuális paraméterekkel. Erre példa, amikor egy szimulációs programot egy, a SIMULATION osztállyal minősített prefixes blokkba zárunk. Ekkor az osztályban definiált publikus fogalmakat használhatjuk, hivatkozhatunk rájuk. A blokk prefixálás művelete nem túl hasznos egyszerű osztályok esetében.

Például a:



prefix_obj begin ... end

prefixes blokkban elérhetők a prefix_obj objektum műveletei.

Csatolás(Inspect)

Ez az utasítás szolgál a csatolás megvalósítására. Blokkszerűen viselkedik, a blokkban elérhetők a csatoló objektum attribútumai. Az utasításnak kétféle előfordulása lehet:

inspect X do utasítás_1 otherwise utasítás_2

Ez egy olyan összetett objektumpéldány, melyben az X-ben deklarált attribútumok (adatok és algoritmusok) használhatók. Ha az X objektumkifejezésre X == none teljesül, akkor az otherwise ág fut le, különben utasítás_1. Ez lényegében a pont-jelölés általánosítása.

inspect X when osztály_1 do utasítás_1 when osztály_2 do utasítás_2 ... when osztály_n do utasítás_n otherwise utasítás_0

Ilyenkor kiértékelődik az X in osztály_1 kifejezés, és ha igaz, akkor végrehajtódik az utasítás_1. Ha nem, akkor a következő, X in osztály_2, majd így tovább, amíg nem talál egy igaz ágat. Az otherwise ág mindenképpen igaz lesz. Egy ág végrehajtása után a vezérlés az inspect utasítás mögé kerül.

Minősítés az Inspect kulcsszóval: