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:
| ADDRESS | END | LEAVE | PULL | THEN |
| ARG | EXIT | NOP | PUSH | TO |
| BY | EXPOSE | NUMERIC | QUEUE | TRACE |
| CALL | FOR | OPTIONS | RETURN | UNTIL |
| DO | IF | OTHERWISE | SAY | WHEN |
| DROP | INTERPRET | PARSE | SELECT | WHILE |
| ELSE | ITERATE | PROCEDURE | SIGNAL |
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 ] |