ANTLR eksamiülesannete näited
Siin on mõned näited eelmistest aastatest. Avalikus repos on nendele vastavad testid paketis week8.eksam. Selle aasta eksamil tuleb sarnane ülesanne, kus peab grammatika kirjutama ja parserpuu töödelda. Järgmine nädal vaatame puu töötlemist.
Wiki.g
Kirjuta ANTLR-i grammatika wikilehe kirjutamise formaadi jaoks.
- Wikileht koosneb pealkirjast ja ühest või rohkemast sektsioonist. Sektsioonid on üksteisest eraldatud tühja reaga.
- Pealkiri on tekstirida, millele järgneb 5 või rohkemast miinusmärgist koosnev rida.
- Sektsioone on kolme tüüpi: paragrahvid, koodiplokid ja loetelud.
- Paragrahvid koosnevad ühest või rohkemast reast. Rea sisu koosneb ladina suur- või väiketähtedest, punktidest, komadest ja tühikutest. Rea lõpus on alati reavahetus (ka viimase rea järel). Paragrahvi rida ei või olla tühi (st. ei või koosneda ainult reavahetusest).
- Koodiplokid on peaaegu nagu paragrahvid. Ainuke erinevus on selles, et iga rea alguses on suurem-kui sümbol ja tühik.
- Loetelud meenutavad samuti paragrahve (kuna tegemist on jällegi ilma tühjade ridadeta tekstiplokiga), aga iga rea alguses on tärn(id). Loetelu esimese taseme moodustavad read, mis algavad ühe tärni ja sellele järgneva tühikuga. Igale sellisele reale võib järgneda mitu teise taseme rida, mis erinevad esimese taseme ridadest selle poolest, et rea alguses on ühe tärni asemel kaks tärni. Analoogselt võib teise taseme rea all olla mitu kolmanda taseme rida (kolme tärniga). Kolmanda taseme ridadel alluvaid olla ei saa.
See siin on pealkiri ---------------------- Esimese paragrahvi esimene rida. Esimese paragrahvi teine rida. Teine paragrahv * See siin on esimese taseme loetelupunkt. * Uskumatu, aga see on samuti esimese taseme loetelupunkt. ** teise taseme loetelupunkt ... * esimese taseme loetelupunkt ... ** teise taseme loetelupunkt ... ** teise taseme loetelupunkt ... *** kolmanda taseme loetelupunkt ... *** kolmanda taseme loetelupunkt ... > koodiploki esimene rida > koodiploki teine rida
NB! Pane tähele, et näite lõpus, peale koodiploki teist rida on üksainus reavahetus, millele ei järgne mitte midagi.
Quiz.g
Kirjuta lihtsustatud ANTLR-i grammatika elektroonilise testi (ingl. k. quiz) kirjeldamiseks. Testi kirjeldus koosneb kahest sektsioonist – üldinfo ja küsimused.
Üldinfo sektsioon algab pealkirjareaga --- YLDINFO ---
. Selle all tulevad eraldi ridadel info pealkirja ja ajapiirangu kohta. Pealkiri antakse võtmesõna pealkiri ja sellele järgneva kooloni ja tühiku järel. Pealkirja tekst koosneb ladina suur- või väiketähtedest, punktidest, komadest, küsimärkidest ja tühikutest. Ajapiirang antakse võtmesõna ajapiirang ja sellele järgneva kooloni ning tühiku järel. Sinna kirjutatakse märgita positiivne täisarv ja selle järel tühik ning võtmesõna min. NB! Grammatika peab toetama nii seda varianti, kus pealkiri on enne, kui ka seda varianti, kus ajapiirang on enne.
Küsimuste sektsioon algab pealkirjareaga --- KYSIMUSED ---
. Selle all tuleb 1 või rohkem küsimust. Iga küsimus võtab enda alla vähemalt ühe rea. Küsimusi on 5 tüüpi: ARVUVASTUSEGA
, LYHIVASTUSEGA
, VALIKVASTUSEGA
, JAH-EI
ning ESSEE
. Kõikidel juhtudel algab küsimus küsimuse tüübi nimetusega, millele järgneb koolon, tühik ja seejärel küsimuse tekst. Mõnede küsimuse tüüpide korral (ARVUVASTUSEGA
, LYHIVASTUSEGA
, JAH-EI
) on järgmisel real antud õige vastus (võtmesõna oige
, koolon, tühik ja vastuse tekst). Arvuvastusega küsimuse puhul peab õige vastus olema märgita täisarv ja sellele võib järgneda +/-
ning veel üks märgita täisarv. Jah-ei küsimuse puhul peab õige vastus olema kas jah
või ei
.
Valikvastusega küsimuse puhul järgneb küsimusele valikute loetelu, iga valik eraldi real. Valede valikute read algavad miinuse ja tühikuga, õigete valikute read algavad plussi ja tühikuga. Õigete ja valede valikute järjekord pole oluline. Valikute hulgas peab olema vähemalt üks õige vastus. Esseeküsimuse korral õiget vastust pole antud.
Küsimuse tekstile ja vastusevariantide tekstile kehtivad samad reeglid nagu testi pealkirjale (vt. ülaltpoolt). Küsimuste vahel võib olla 1 või rohkem tühja rida, aga ei pea olema. Sektsioonide vahel on vähemalt 1 tühi rida. Sektsioonide järjekord pole oluline, aga mõlemad sektsioonid (st. üldinfo ja küsimused) peavad eksisteerima. Faili lõpus võib olla suvaline arv reavahetusi.
NB! Tühikute kasutamine ei ole paindlik – tühikute lubatud esinemiskohad on ülalpool ära toodud.
--- YLDINFO --- pealkiri: AKT test ajapiirang: 105 min --- KYSIMUSED --- ARVUVASTUSEGA: Mitu mulli on mullivees? oige: 4958 +/- 3 LYHIVASTUSEGA: Millal maksad eide vaeva? oige: homme VALIKVASTUSEGA: Kuidas sai moos kommi sisse? - Komm kasteti moosi sisse ja keerati pahupidi - Systlaga pandi + See on seal koguaeg olnud JAH-EI: Hunt hunti ei murra oige: jah ESSEE: Miks mulle meeldib AKT? ARVUVASTUSEGA: Mitu linna on Eestis? oige: 47
NB! Pane tähele, et näite lõpus on üksainus reavahetus, millele ei järgne mitte midagi.
Oldie.g
Selles ülesandes tuleb kirjutada lihtsustatud grammatika keelele OLDIE-2. Paremal on toodud üks näide OLDIE-2 programmist.
10 INPUT "What is your name ", U$ 20 PRINT "Hello "; U$ 30 INPUT "How many stars ", N 40 S$ = "" 50 I = 0 60 S$ = S$ + "s" 65 I = I + 1 70 IF I < N THEN GOTO 60 80 PRINT S$ 90 INPUT "Do you want more ", A$ 100 IF LEN(A$) == 0 THEN GOTO 90 120 IF (A$ == "Y") OR (A$ == "y") THEN GOTO 30 130 PRINT "Goodbye "; U$ 140 END
Selles keeles on iga lause eraldi real. Programm koosneb vähemalt ühest reast. Iga rida lõpeb reavahetusega, tühje ridu programmis ei ole. Rea alguses on märgita täisarv, mida võiks nimetada lause identifikaatoriks ja mida kasutatakse peamiselt programmis edasi või tagasi hüppamiseks (antud näites GOTO 30
liigutab täitmise järjehoidja programmi kolmanda lause ette).
Loodav grammatika peab toetama 6 lauseliiki: 5 lihtlause liiki ja IF-lauset. Kirjeldame kõigepealt lihtlauseid.
- Omistamine koosneb muutujanimest (täpsustatud allpool), võrdusmärgist ja avaldisest.
- GOTO-lause koosneb võtmesõnast
GOTO
ning sellele järgnevast lause identifikaatorist. - INPUT-lause koosneb võtmesõnast
INPUT
, millele peab järgnema küsimus (esitatud suvalise avaldisena), seejärel koma ja lõpuks muutujanimi, kuhu sisestatud tekst salvestatakse. - PRINT-lause algab võtmesõnaga
PRINT
, sellele järgnevad semikoolonitega eraldatuna 0 või rohkem avaldist (mis määravad, mida ekraanile kuvatakse). Kui pole antud ühtegi avaldist, siis see tähendab ainult reavahetuse kuvamist. (Lihtsustus (-1p): võite nõuda, et alati on antud vähemalt üks avaldis) - END-lause koosneb võtmesõnast
END
. Selle käivitamisel lõpetatakse programmi töö. - IF-lause koosneb võtmesõnast
IF
, tingimust esitavast avaldisest, võtmesõnastTHEN
ning sellele järgnevast lihtlausest.
Järgmiseks kirjeldame avaldise liike.
- Täisarvuliteraal (lihtsuse mõttes olgu see praegu ilma märgita). Nullist erinevad täisarvud võivad alata ka 0-ga.
- Sõneliteraal koosneb jutumärkide vahel olevast 0 või rohkemast sümbolist. Lubatud sümbolid on ladina suur- või väiketähest ja tühik.
- Muutuja nimi koosneb 1 või enamast ladina suurtähest, millele võib järgneda üks dollari märk.
- Binaarne operatsioon koosneb vasakpoolsest avaldisest, operaatorist (lubatud on
+
,-
,*
,/
,==
,<>
,<
,>
,<=
,>=
,AND
,OR
) ja parempoolsest avaldisest. Tehete prioriteetide pärast muretsema ei pea, eeldame, et programmeerija kasutab vajalikes kohtades sulge. - Funktsiooni väljakutse koosneb funktsiooni nimest (sellele kehtivad samad reeglid nagu muutujanimele), millele järgneb üks sulgudes olev avaldis.
- Suluavaldis moodustatakse avaldisest, mille ümber pannakse üks paar ümarsulge.
Keele elementide vahel võib suvaliselt kasutada tühikuid ja tabulaatoreid.