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 == Luokka:Ohjelmointikielet Luokka:IBM:n ohjelmistot