REXX tai Rexx (REstructured eXtended eXecutor) on Mike Cowlishaw'n vuonna 1979 IBM VM -ympäristöön kehittämä ohjelmointikieli.[1]
Kieli on yleensä tulkattava ohjelmointikieli, joka suunniteltiin helpoksi käyttää ja oppia. Sitä käytetään sekä komentosarjakielenä että erilaisten sovellusten makrokielenä.
Kieli on perinteisesti proseduraalinen, mutta nykyään siitä on olemassa myös oliopohjainen versio nimeltä ooRexx (ent. Open Object Rexx).[1]
REXXissä on tehokkaat työkalut tekstimuotoisen tiedon käsittelyyn. Kielen stem-käsite ja toiminta mahdollistaa moniulotteisen taulukoinnin, jossa indeksit ovat vapaasti asetettavia merkkijonoja.
REXX on saatavissa lähes kaikkiin käyttöjärjestelmiin sekä kaupallisena että avoimen lähdekoodin Regina REXX toteutuksena.
Esimerkkiohjelma
/* ohjelma lukee ohjelmakoodia standard-inputista ja muodostaa ristiviitelistan */
ref. = ''
sanat = ''
kwd = 'if then else do end to while iterate say call return parse var exit' /* ei mukaan listalle*/
lno = 0
do while lines() > 0 /* luetaan koko tiedosto */
rivi = linein() /* luetaan rivi */
call literal /* poistetaan riviltä merkkijonot */
parse var rivi rivi '/*' . /* poistetaan rivin lopusta kommentit */
lno = lno + 1
rivi = translate(rivi,' ','.,:=+-/<>*()') /* poistetaan erikoismerkit*/
rivi = space(rivi) /* siistitään rivi */
do i = 1 to words(rivi) /* käydään läpi rivin sanat */
sana = word(rivi,i) /* otetaan sana */
if datatype(left(sana,1)) = 'NUM' then iterate /* numerot jätetään pois */
ref.sana = ref.sana right(lno,3) /* rivinumero talteen */
if wordpos(sana,kwd sanat) = 0 then /* onko sana uusi */
sanat = sanat sana /* oli, laitetaan listalle */
end
end
do i = 1 to words(sanat) /* käydään läpi sanalista */
sana = word(sanat,i) /* poimitaan sana */
say left(sana,10) ref.sana
end
exit
literal:
apo = pos("'",rivi) /* löytyykö hipsukka */
bpo = pos('"',rivi) /* löytyykö tupla-hipsukka */
do while apo + bpo > 0 /* jos löytyy */
if apo * bpo > 0 then /* oli molemmat */
pick = min(apo,bpo) /* niistä ensimmäinen */
else
pick = max(apo,bpo) /* vain toinen oli */
sea = substr(rivi,pick,1) /* tätä merkkiä haetaan */
epo = pos(sea,rivi,pick+1) /* haetaan merkkijonon loppu*/
rivi = left(rivi,pick-1) substr(rivi,epo+1) /* riville jää alku ja loput rivistä */
apo = pos("'",rivi) /* onko toinenkin merkkijono */
bpo = pos('"',rivi)
end
return
Esimerkin muuttuja ref. on stem. Huomattakoon, että muuttujaan kwd on asetettu vain ne avainsanat, joita tässä esimerkissä käytetään. Niitä on paljon muitakin. Lisäksi on oletettu, että kommentit ovat rivin lopussa eivätkä ne jatku toiselle riville. Samoin merkkijonojen on oletettu olevan yhdellä rivillä. REXX ei rajoita näitä, mutta hyvä koodaustyyli ei suosi niiden käyttöä.
Yllä olevan esimerkin toteuttaminen Linux-ympäristössä Regina REXX:llä, kun syötteenä on itse ohjelmakoodi:
>cat rexxsamp.rex | rexx rexxsamp.rex | sort
apo 28 30 31 32 34 38
bpo 29 30 31 32 34 39
datatype 15
epo 36 37
i 13 14 21 22
kwd 4 17
left 15 23 37
linein 7
lines 6
literal 8 27
lno 5 10 10 16
max 34
min 32
pick 32 34 35 36 37
pos 28 29 36 38 39
ref 2 16 16 23
right 16
rivi 7 9 9 11 11 12 12 13 14 28 29 35 36 37 37 37 38 39
sanat 3 17 18 18 21 22
sana 14 15 16 16 17 18 22 23 23
sea 35 36
space 12
substr 35 37
translate 11
wordpos 17
words 13 21
word 14 22
Kirjallisuutta
- Hauru, Aarno: Johdatus REXX-kieleen. (Asiakaspalveluopas) Otaniemi: Teknillinen korkeakoulu, Laskentakeskus, 1988.
Aiheesta muualla
Lähteet