Väljundtegevuste lisamine: täisarvude moodustamine

Vaatleme näidete abil, kuidas regulaarse avaldise poolt määratud keelt tunnistavast automaadist võib saada nn. teisendaja (transducer), mis samaaegselt tunnistamisega tõlgib (transleerib) sisendsõna väljundsõnaks.

Täisarvud võib defineerida järgmise lihtsa automaadiga ("tyhjusest" suubuv nool näitab algolekut, kahekordne ring - lõppolekut, lõppolekusse võib peale teksti lõpusümboli # viia ka ükskõik milline numbrist erinev sümbol, DIG on lühend sisendite valikule 0 | 1 | 2 | ... | 9)



Et täisarve tähistavast märgijadast (sisend) saada arvu, tuleb iga uue numbri lugemise järel lisada see juba loetud osale vastavale arvule, s.t. käivitada alamprotseduur NEXT_DIGIT, mis sooritab selle lisamise; kui kogu märgijada on loetud, tuleb saadud arv kuhugi salvestada; seda teeb alamprotseduur OUT_CONST, seega numbrite (märgi)jada arvuks teisendav teisendaja oleks (iga kaare peal on vastava ülemineku põhjustanud sisend ja käivitatav väljund)

ehk väljundtegevustega laiendatud regulaarse avaldisena

INT (DIG NEXT_DIGIT)+ OUT_CONST

Sellele avaldisele vastav programmilõik (ADA-s) oleks (CH oli globaalne sümbolmuutuja, millele protseduur READ annab iga pöördumise ajal väärtuseks sisendteksti järgmise sümboli; protseduuri TÄISARV käivitamisel on CH väärtuseks arvu esimene number; CONST on täisarv (INTEGER)-tüüpi muutuja, millese kogutakse letud täisarvu väärtus, CH algväärtus on 1)

procedure TÄISARV is
FIRST_DIGIT(CH);READ
while CH in DIGIT

loop
NEXT_DIGIT(CH);READ
end loop;
OUT_CONST

Loetud numbri (sümbol-tüüpi!) teisendab alamprotseduur NEXT_DIGIT täisarvuks (ADA tüübiteisendus ORD muudab CHARACTER-tüüpi numbri INTEGER-tüüpi numbriks) ja lisab täisarvu juba loetud osale:

procedure NEXT_DIGIT

(CH: in CHARACTER
CONST: in out INTEGER) is
begin
DIGIT=ORD(CH); -- tüübiteisendus!
CONST = 10*CONST + DIGIT;
end NEXT_DIGIT

Alamprotseduur FIRST_DIGIT algväärtustab (initsialiseerib) muutuja:

procedure NEXT_DIGIT

(CH: in CHARACTER
CONST: in out INTEGER) is
CONST = DIGIT;
end FIRST_DIGIT
Alamprotseduur OUT_CONST kirjutab saadud arvkonstandi nimede tabelisse ja lisab vastava lekseemi väljundisse.


Ülesandeid:


Küsimused, probleemid:
jaak@cc.ttu.ee

Tagasi loengute sisukorra juurde