REXX | |
---|---|
Yleinen suoritusmalli | tulkattava |
Julkaistu | 1979 |
Kehittäjä | Mike Cowlishaw |
Merkittävimmät toteutukset | ARexx,Regina REXX |
Vaikutteet | ALGOL |
Murteet | NetRexx,ooRexx |
Infobox OK |
REXX taiRexx (REstructured eXtended eXecutor) onMike Cowlishaw'n vuonna 1979IBM VM -ympäristöön kehittämäohjelmointikieli.[1]
Kieli on yleensä tulkattavaohjelmointikieli, joka suunniteltiin helpoksi käyttää ja oppia. Sitä käytetään sekäkomentosarjakielenä että erilaisten sovellustenmakrokielenä.
Kieli on perinteisestiproseduraalinen, mutta nykyään siitä on olemassa myösoliopohjainen versio nimeltäooRexx (ent.Open Object Rexx).[1]
REXXissä on tehokkaat työkalut tekstimuotoisen tiedon käsittelyyn. Kielenstem-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ähdekoodinRegina REXX toteutuksena.
/* 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=0dowhilelines()>0/* luetaan koko tiedosto */rivi=linein()/* luetaan rivi */callliteral/* poistetaan riviltä merkkijonot */parsevarrivirivi'/*'./* poistetaan rivin lopusta kommentit */lno=lno+1rivi=translate(rivi,' ','.,:=+-/<>*()')/* poistetaan erikoismerkit*/rivi=space(rivi)/* siistitään rivi */doi=1towords(rivi)/* käydään läpi rivin sanat */sana=word(rivi,i)/* otetaan sana */ifdatatype(left(sana,1))='NUM'theniterate/* numerot jätetään pois */ref.sana=ref.sanaright(lno,3)/* rivinumero talteen */ifwordpos(sana,kwdsanat)=0then/* onko sana uusi */sanat=sanatsana/* oli, laitetaan listalle */endenddoi=1towords(sanat)/* käydään läpi sanalista */sana=word(sanat,i)/* poimitaan sana */sayleft(sana,10)ref.sanaendexitliteral:apo=pos("'",rivi)/* löytyykö hipsukka */bpo=pos('"',rivi)/* löytyykö tupla-hipsukka */dowhileapo+bpo>0/* jos löytyy */ifapo*bpo>0then/* oli molemmat */pick=min(apo,bpo)/* niistä ensimmäinen */elsepick=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)endreturn
Esimerkin muuttujaref. on stem. Huomattakoon, että muuttujaankwd 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 toteuttaminenLinux-ympäristössä Regina REXX:llä, kun syötteenä on itse ohjelmakoodi:
>cat rexxsamp.rex | rexx rexxsamp.rex | sortapo 28 30 31 32 34 38bpo 29 30 31 32 34 39datatype 15epo 36 37i 13 14 21 22kwd 4 17left 15 23 37linein 7lines 6literal 8 27lno 5 10 10 16max 34min 32pick 32 34 35 36 37pos 28 29 36 38 39ref 2 16 16 23right 16rivi 7 9 9 11 11 12 12 13 14 28 29 35 36 37 37 37 38 39sanat 3 17 18 18 21 22sana 14 15 16 16 17 18 22 23 23sea 35 36space 12substr 35 37translate 11wordpos 17words 13 21word 14 22