REXX

REXX tai Rexx (REstructured eXtended eXecutor) on Mike Cowlishaw'n vuonna 1979 IBM VM -ympäristöön kehittämä ohjelmointikieli.

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).

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

Aiheesta muualla 
 IBM:n virallinen REXX-sivusto 
 The Rexx Language Association 
 Open Object Rexx 
 Regina REXXin kotisivut

Lähteet 

Ohjelmointikielet
IBM:n ohjelmistot