IV. REXX utasítások (instrukciók), kifejezések és operátorok

Egy programozási nyelv megtanulása nagyon sok mindenben hasonlít egy külföldi nyelv elsajátításához. Mindkét esetben meg kell tanulni a nyelv szókincsét (parancskészletét) és a nyelvtani (szintaktikai) szabályokat. Ha a két összetevô között fontossági sorrendet kellene felállítani, akkor emberi nyelv esetében a szókincset, programozási nyelv esetében pedig a szabályokat sorolnám elôbbre. Idegen nyelven ugyanis az esetek túlnyomó többségében akkor is megértethetjük magunkat, ha a megfelelô szavakat a nyelvtani szabályok teljes mellôzésével egyszerûen egymás után kimondjuk, egy program viszont már a legkisebb szintaktikai pontatlanság esetén sem fog mûködni. A téma fontossága miatt ezt a leckét teljes egészében a REXX szintaktikájának szenteljük.

Kulcsutasítások

Az utasítások vagy más néven instrukciók "mondják meg" a REXX-nek, hogy tulajdonképpen mit is csináljon. Néhánnyal (pl. IF, SAY, EXIT) már találkoztunk az elôzô leckék folyamán. Ezek a REXX kulcsutasításai közé tartoznak, amelyeket felsoroltunk az alábbi táblázatban:

ADDRESSENDLEAVEPULLTHEN
ARGEXITNOPPUSHTO
BYEXPOSENUMERICQUEUETRACE
CALLFOROPTIONSRETURNUNTIL
DOIFOTHERWISESAYWHEN
DROPINTERPRETPARSESELECTWHILE
ELSEITERATEPROCEDURESIGNAL

Lépések/szerkezetek (clauses)

A REXX program egymás után végrehajtott lépésekbôl áll. A lépés egy teljes utasításból áll, azaz tartalmazza a REXX utasítást valamint az összes szükséges információt és az esetleges végrehajtási opciókat. A lépéseknek öt alfajtája létezik:

- Nullalépés: Ezek az üres, vagy csak megjegyzéseket tartalmazó sorok. A REXX parancsértelmezô figyelmen kívül hagyja ezeket a lépéseket.

- Kulcslépések: A fenti táblázatban szereplô kulcsutasításokból és a szükséges kiegészítô információból épülnek fel.

- Hozzárendelések: Itt történik az értékek hozzárendelése változókhoz.

- Címkék: Önmagukban álló szavak, amelyeket kettôspont zár le.

- Parancsok: Olyan lépések, amelyek nem tartoznak az elôzô három kategória egyikébe sem. Ezekre a lépésekre a 6. leckében még részletesen ki fogunk térni.

A lépések mindig pontosvesszôvel záródnak. Ezt azonban általában nem szükséges kitennünk, mivel a REXX automatikusan beteszi a sorok, címkék és bizonyos kulcsszavak után. Általában egy lépés egy sort foglal el. Ez azonban nem kívánalom, s ha a kedvünk úgy kívánja, egy sorba több lépést is írhatunk. Ekkor viszont mindig ki kell tenni a lépés végét jelzô pontosvesszôt!

SAY "Hello!"; SAY "A nevem Kis Pista."; SAY "És a tied?"

Ez persze egyenértékû az alábbi (sokkal átláthatóbb) programrészlettel:

SAY "Hello!"
SAY "A nevem Kis Pista."
SAY "És a tied?"

Egy lépés természetesen egynél több sort is elfoglalhat. Ekkor viszont a sor végén vesszôvel kell jelezni, hogy a lépés még nem ért véget!

SAY "Hello!"; SAY "A nevem",
"Kis Pista."; SAY "És a tied?"

Egy másik módja a lépések több sorra való kiterjesztésének a közbeékelt megjegyzés. Mint már megtanultuk, a megjegyzések több sorra is kiterjedhetnek, így az alábbi megoldás is mûködni fog:

SAY "Hello!"; SAY "A nevem" /* Ez itt egy hosszú
megjegyzés */ "Kis Pista."; SAY "És a tied?"

Ezt a változatot azonban inkább ne használjuk, mivel a programot az esetleges késôbbi átformázás teljesen mûködésképtelenné teheti. Általában azt mondhatjuk, hogy nem ajánlatos a megjegyzések használata a kód bal oldalán.

Kifejezések

A lépésekben elôfordulhatnak kifejezések. Egy kifejezés állhat karakterláncokból, szimbólumokból vagy akár függvényhívásokból is. A karakterláncokat a 3. lecke során már definiáltuk, s azt mondtuk, hogy a REXX-ben minden idézôjelek között álló karaktercsoport karakterláncnak számít. A szimbólumok olyan karaktercsoportok, melyek nem állnak idézôjelek között és nem is megjegyzések. A szimbólumokban szerepelhet minden kis és nagybetû a-tól z-ig, számok, az aláhúzáskarakter, a kérdôjel, a felkiáltójel és a pont. A függvényhívások azok a szavak, amelyeket közvetlenül zárójelek követnek. Annyit már tudunk a függvényekrôl, hogy ezek olyan eljárások, amelyek valamilyen értéket adnak vissza. Részletesebben a 14. leckében lesz róluk szó.

Operátorok

Az operátor egy olyan szimbólum, amely valamilyen mûvelet elvégzésére készteti a REXX-et. Alap operátorok az összeadás (+), a kivonás (-), a szorzás (*) és az osztás (/). Az operátoroknak szükségük lehet egy, vagy több paraméterre. A paraméterek általában azok az adatok, amelyeken a program a mûveletet végrehajtja. Az a + 2 példában az operátor a +, a paraméterek (operandusok) pedig az a és a 2. A matematikai operátorokról a következô leckében lesz részletesen szó. Érdemes még megemlíteni, hogy mûveleteket nem csak számokkal, hanem karakterekkel, vagy akár karakterláncokkal és végezhetünk.

Rakjuk össze a megismert elemeket!

Mint már tudjuk, a REXX program lépésekbôl áll. A lépések kifejezésekbôl, a kifejezések pedig karakterláncokból, szimbólumokból, függvényhívásokból és operátorokból állhatnak. Vizsgáljuk meg az alábbi példaprogramon, hogy a részek hogy állnak össze egy teljes programmá!

 1: /* Példaprogram a számok négyzetének kiszámítására */
 2: 
 3: SAY "Gépelj be egy számot!"; PULL szam
 4: IF Datatype(szam) = 'NUM' THEN
 5: 	valasz = "A" szam "négyzete",
 6:		(szam * szam)
 7: ELSE
 8: 	valasz = szam "nem szám!"
 9: SAY valasz
10: EXIT

Az elsô és második sorok nullalépéseket tartalmaznak, mivel az elsô sor a kötelezô megjegyzés, a második pedig egy üres sor. A harmadik sor két, pontosvesszôvel elválasztott lépésbôl áll. Mindkét lépés egyben kulcsutasítás is. A SAY utasítást egy kifejezés követi, amely egyetlen karakterláncból áll. A PULL utasítást követô kifejezés pedig egy szimbólumot tartalmaz. A negyedik sorban egy IF utasítás áll, amelyet egy, a Datatype függvényhívásból, az egyenlôség operátorból és a 'NUM' karakterláncból felépülô kifejezés követ. A THEN kulcsszó speciális elbánásban részesül, ugyanis a REXX a THEN elé és után pontosvesszôket helyettesít be. Az ötödik és hatodik sor egyetlen lépést tartalmaz. Itt számítjuk ki a begépelt adat négyzetét, már amennyiben az szám. A mûvelet eredményét a valasz változóban tároljuk el egy hozzárendelés után. A hetedik sorban egyetlen kulcslépés, az ELSE áll. A nyolcadik sorban ismét egy hozzárendelést találunk, amely akkor hajtódik végre, ha a bevitt adat nem szám. A kilencedik sor is egy kulcslépés, amelyben a SAY utasítás kerül végrehajtásra. A SAY-t a valasz változót tartalmazó kifejezéssel hívjuk meg, ami a változó tartalmának a megjelenítését végzi el. Az utolsó sor egyetlen kulcsutasítást tartalmaz (EXIT), amely befejezi a program értelmezését.

Hozzárendelések

Láttuk, hogy a hozzárendelések során a változók értéket kapnak. Az általános forma:

változó = kifejezés 

A hozzárendelés legegyszerûbb formáját már eddig is többször használtuk. Néhány példa:

szamlalo = 1
fizetes = 25 * napiber
tipus = Datatype(adat)

A hozzárendelés azonban nemcsak az egyenlôségoperátorral valósítható meg, hanem bizonyos kulcsszavakkal is. Ilyen például a PULL:

PULL bevitt_adat

A fenti utasítás végrehajtásakor a program addig vár, amíg a felhasználó be nem gépel egy adatot, amit aztán a bevitt_adat változóban tárol el.

Címkék:

A címke egy olyan szimbólum, amely egy magányos szóból és az azt lezáró kettôspontból áll. Ha a címke megjegyzésen belül szerepel, akkor a programértelmezô figyelmen kívül fogja hagyni. A címkék segítségével úgymond "könyvjelzôzzük" a programokat. Ez azért hasznos, mert beágyazott függvények meghívásakor, vagy a CALL illetve SIGNAL kulcsszavak paramétereként a címke nevét megadva a vezérlés a címkét követô elsô utasításra kerülhet, azaz beavatkozhatunk az utasítások megszokott végrehajtási sorrendjébe. Lényeges különbség a CALL és a SIGNAL között, hogy a CALL utasítással meghívott programrészlet végrehajtása (tehát az elsô sorrakerülô RETURN) után a vezérlés visszakerül a CALL utáni sorra. A SIGNAL esetében viszont úgymond végérvényesen "kiugrunk" abból a programrészletbôl, ahonnan a SIGNALT-t kiadtuk. Lássunk egy példaprogramot a SIGNAL használatára!

/* Példaprogram a SIGNAL használatára */
 
SAY "Kezdôdik a mese."
SIGNAL jelzes1
jelzes2:
SAY "ahol még a kurta farkú malac sem túr ..."
SIGNAL jelzes3
SAY "Kakukktojás"
jelzes1:
SAY "Hol volt, hol nem volt ..."
SIGNAL jelzes2
jelzes3:
SAY "egy vasorrú bába."
EXIT

Ha futtatjuk a programot, akkor elôször a legelsô SAY utasítás hajtódik végre, majd pedig a vezérlés átkerül a jelzés1 címke utáni sorra. Ennek hatására a "Hol volt, hol nem volt ..." sort megjelenítô SAY utasítás kerül végrehajtásra, és utána rögtön ugrunk is a jelzes2 címkére. A jelzes2 utáni elsô utasítás a SAY "ahol még a kurta farkú malac sem túr ...", amit egy újabb ugrás követ a jelzes3 címkére. Itt találjuk rövidke mesénk utolsó sorát, amelyet a program befejezését jelzô EXIT követ. Figyeljük meg, hogy a SAY "Kakukktojás" sor sohasem hajtódik végre! A példaprogramban elkövetett programozási módszert spagetti-stílusnak is hívják, mivel a végrehajtás sorrendje a spagetti szálainak módjára "gabalyodik össze". Kerüljük ezt a stílust! Az íly módon írt programokat nagyon nehéz késôbb értelmezni!


REXX GYÍK:

K1. Amikor azt adom meg a programomban, hogy SAY "Szia" "Laci!", az ugyanazt eredményezi, mint a SAY "Szia Laci!". Miért?
V1. A karakterláncok közötti szóköz tulajdonképpen egy REXX operátor, amely a két karakterláncot egy szóköz közbeiktatásával összetoldja, s a SAY utasítás már az eredményül kapott karakterláncot jeleníti meg.

K2. Amikor az egyik változó értékét hozzárendelem a másikhoz, mi történik az eredeti értékkel?
V2. A hozzárendelés folyamán csak a bal oldalon álló változó értéke módosul. A hozzárendelés után tehát mindkét változóban az az érték lesz eltárolva, amely a hozzárendelés elôtt a jobb oldali változó tartalma volt.

K3. Ha egy kódrészlet nem kerül sohasem végrehajtásra (pl. átlépjük a SIGNAL utasítással), akkor csinál-e valamit a REXX azzal a részlettel?
V3. Gyakorlatilag semmit. Ha a kódrészlet szintaktikailag helyes, a REXX nem fogja értelmezni az átugrott részt. I'gy abban akár logikai hiba is lehet.


Gyakorlatok:

1. Mely címkék helyesek?
a) teszt:
b) sulyos_hiba :
c) 'hibauzenet:'
d) 25:
e) /* label: */

2. A következô programokban hibák vannak. Javítsa ki!

/* Gyakorlat 2a */
SAY "Gépelje be a teljes nevét:"
CALL GetName
SAY "Összesen"
	Lenght(nev) "karakter van az Ön nevében."
EXIT
GetName
	PULL nev
	RETURN 

/* Gyakorlat 2b */
SAY "Ez csak egy teszt!", SAY "Ez is csak egy teszt!!"
SAY "Most kezdôdik az igazi teszt!!!"; 'dir';
'*.cmd'
EXIT

Kádár Zsolt
1997. 10. 17.
[ Elôzô lecke | Következô lecke | Tartalom ]