Institute of Computer Science
  1. Courses
  2. 2017/18 spring
  3. Automata, Languages and Compilers (LTAT.03.006)
ET
Log in

Automata, Languages and Compilers 2017/18 spring

  • Üldinfo
  1. Õppekorraldus
  2. Eksam
  3. Reeglid
  4. Töövahendid
  5. Projekt
  • Kava
  1. Soojendus
  2. Regulaaravaldised
  3. Olekumasinad
  4. Lõplikud automaadid
  5. Avaldise struktuur
  6. Grammatikad ja lekser
    1. Grammatika mõiste
    2. Grammatika automaadid*
    3. Lekseri soojendus
    4. Kodutöö
    5. Magisiniga masinad*
  7. Käsitsi parsimine
  8. ANTLR intro
  9. AST loomine
  10. Interpretaator
  11. Semantiline analüüs
  12. Kompilaator
  • Moodle
  • Bitbucket
  • Fleep!

6. Käsitsi leksimine ja grammatika mõiste

Kodutöös jätkame veel leksimise teemaga. Me peame ka paari nädala pärast ANTLR tööriista abil lekserit spetsifitseerida, aga alustame kõigepealt grammatikaga. Sellel nädalal võiks endale selgeks teha selle põhilise olemuse ehk mis ta on ja mida ta defineerib.

  • Grammatikate koostamine. Alustame sellega, et üritame mõned lihtsad grammatikad ise koostada. Proovime ka implementeerida süstemaatiline meetod regulaaravaldisi teisendada grammatikaks.
  • Grammatikale vastavad automaadid. Seda maksab vaadata, kui on natuke teoreetilisem huvi asja vastu. Nagu ka regulaaravaldisele vastab automaat, siis kontekstivaba grammatikale vastab magasinmäluga automaat.
  • Lekser. Kodutöö ette valmistamiseks teeme ühe pisikese lekseri siin ka.
Sellel nädalal toome sisse grammatika mõiste. Kontekstivaba grammatika on ise üks elegantne keel (DSL), mis võimaldab hulkasid induktiivselt defineerida. Just sellele tasub tähelepanu pöörata, sest ühelt poolt on see kooskõlas eesmärgiga arendada teil modulaarne ja selge mõtlemine (grammatika on parim viis harjutada selge ja modulaarse disaini põhimõtteid!), aga teiselt poolt on induktiivsed definitsioonid koodi korrektsuse tõestamiseks väga olulised. Kui tahad rohkem teada induktiivsete definitsioonide kohta, siis vajuta

Mis on induktiivne definitsioon? See on täpselt see, kui defineerime hulka selliselt, et anname eeskirja tema elementide koostamiseks. Kõigepealt ütleme, et hulka kuuluvad teatud fikseeritud baaselemendid (aatomid):

  • Iga üksik täht on regulaaravaldis.
  • Episilon on regulaaravaldis.

Edasi anname eeskirju, kuidas väiksematest elementidest moodustada suuremad:

  • Kui R ja Q on regulaaravaldised, siis on ka (RQ) regulaaravaldis.
  • Kui R ja Q on regulaaravaldised, siis on ka (R|Q) regulaaravaldis.
  • Kui R on regulaaravaldis, siis on ka (R)* regulaaravaldis.

Ehk kontekstivaba grammatikana:

  • R → a | b | ...
  • R → ε
  • R → (R R)
  • R → (R | R)
  • R → (R)*

Ok, mis siis? Miks peaks kedagi olema induktiivsetest definitsioonidest nii vaimustuses? Sellepärast, et selliselt defineeritud hulga puhul teame täpselt, millest on tehtud hulga elemendid. Kui väike tüdruk kuulub hulka R, siis on ta kas baaselement (antud juhul üksik täht või epsilon) või siis koosneb ta veelgi väiksematest osadest, mida on kokku liimitud konkatenatsioon, alternatsioon või korduseoperaatori abil. See teadmine, et iga hulga element on selliselt üles ehitatud saame ära kasutada kahel viisil:

  1. Rekursioon! Saame funktsioonid defineerida sellel hulgal kasutades rekursiooni. Kuna meil on eeskirjad, kuidas iga hulga element on moodustatud, siis võime funktsioonid defineerida nende struktuuri järgi. Me peame ainult defineerima, mida funktsioon teeb baasjuhtumitel ja kui element on üles ehitatud väiksematest osadest, siis me peame ainult oskama alamosade tulemusi kombineerida.
  2. Induktsioon! See on nüüd pärlide pärl: me saame selle hulga elementide kohta asju tõestada! Kui me tahame veenduda, et programm töötab õigesti, siis me ei taha lihtsalt testida üks element siin ja üks element seal. Tahaks midagi öelda kõikide sisendite kohta ja induktiivselt defineeritud hulkade korral saame seda teha!!

Üks triviaalne induktsiooni näide. Oletame, et tahame veenduda, et regulaaravaldised ilma tärnita defineerivad lõplikuid keeli. See peaks olema suhteliselt ilmne, aga ka see intuitiivne viis, kuidas ennast selles veenda on sisuliselt üks induktiivne argument. Kõigepealt veendume, et baaselemendid defineerivad lõpliku keele: nad defineerivad kõik ühesõnalisi keeli. (Ka epsiloni keel koosneb ühest sõnast!) Edasi pead lihtsalt veenduma, et alternatsioon ja konkatenatsiooni mõlemad säilitavad keelte lõplikkust. Selline mõttekäik ja induktiivsed andmestruktuurid mängivad olulist rolli programmide versifitseerimises.

  • Institute of Computer Science
  • Faculty of Science and Technology
  • University of Tartu
In case of technical problems or questions write to:

Contact the course organizers with the organizational and course content questions.
The proprietary copyrights of educational materials belong to the University of Tartu. The use of educational materials is permitted for the purposes and under the conditions provided for in the copyright law for the free use of a work. When using educational materials, the user is obligated to give credit to the author of the educational materials.
The use of educational materials for other purposes is allowed only with the prior written consent of the University of Tartu.
Terms of use for the Courses environment