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
  7. Käsitsi parsimine
  8. ANTLR intro
    1. Paigaldus
    2. Sissejuhatus
    3. Eksamiülesanded
    4. Kodutöö
  9. AST loomine
  10. Interpretaator
  11. Semantiline analüüs
  12. Kompilaator
  • Moodle
  • Bitbucket
  • Fleep!

Sissejuhatus

.g4 failides kirjeldame grammatikaid, et ANTLR genereeriks meile selle põhjal parseri ja lekseri. ANTLR'i repositooriumist saab väga põhjalikku infot selle kasutuse kohta, aga tähtsamad reeglid toome siin välja.

Grammatikad peavad olema defineeritud g4 failis, mille nimi kattub nende grammatika nimega. Näiteks järgnev näitena toodud grammatika peaks olema defineeritud failis Avaldis.g4.

grammar Avaldis; 
// grammatika nimi peab klappima failinimega

// parseri reeglid algavad väikeste tähtedega
avaldis
    :   avaldis '+' term
    |   avaldis '-' term
    |   term
    ;

term
    :   term '*' faktor
    |   term '/' faktor
    |   faktor
    ;

faktor
    :   '(' avaldis ')'
    |   Muutuja
    |   Konstant
    ;

// lekseri reeglid algavad suurte tähtedega
Muutuja
    :   [a-zA-Z_][a-zA-Z_0-9]*
    ;

Konstant
    :    [0-9]|[1-9][0-9]+
    ;

ANTLR'is eristame kahte tüüpi reegleid - parserireegleid ning lekserireegleid.

Parserireeglite muutujanimed algavad väiketähega ning need tähistavad mitteterminale. Erinevad produktsioonireeglid on eraldatud püstkriipsuga. Parserireegel võib sisaldada ka tühja reeglit, mis teeb selle reegli valikuliseks. Lisaks on võimalik kasutada ka operaatoreid ?*+, mis on analoogid vastavate regulaaravaldiste operaatoritele.

Lekserireeglite muutujanimed algavad suurtähega. Need lubavad meil defineerida terminalsümboleid paindlikumalt, kasutades regulaaravaldistele sarnast süntaksi. Terminalsümboleid võib lisada ka parserireeglite sisse kasutades ülakomasid.

Kurjad lekserireeglid

Kuigi lekserireeglid võivad tunduda teisejärgulised ning "lihtsam" osa grammatika defineerimisest, siis tegelikult nõuavad lekserireeglid palju tähelepanu.

Näiteks juhul kui üks sõnejupp sobitub kahe lekserireegliga, siis sellest sõnejupist saab esimesena defineeritud lekserireegli token. Grammatikas Priority.g4 reegel doubleRule on küll õigesti defineeritud, kuid kuna üldisem lekseegel Kurjus sobitub kõigega, millega sobitub lekserireegel Tere, siis ka õige sisendiga "tere" saame me vea. Ja kahjuks ANTLR'i veateade pole meie jaoks väga abistav:

line 1:0 mismatched input 'tere' expecting 'tere'

Sarnane olukord on ka näites Number.g4, aga seal võib olukorda ka lahendada võtmesõnaga fragment, sest seal on DIGIT ainult vaja täisarvude INT defineerimisel. Fragment tähendab, et lekseem iseseisvalt ei eksisteeri ja seetõttu ei sega lekseri tööd: teda lihtsalt kopeeritakse tähthaaval sinna sisse, kus teda kasutatakse.

Mõnikord on vaja ka arvestada sellega, et korduse kasutamisel on reeglid on võimalikult ahned. Korduse mitte-ahneks tegemine käis küsimärgi lisamisega, st * asemel *? ning + asemel +?.

Lekseri tükeldamise harjutamine

Failis MungeDemo.java ja grammatika Munge.g4 abil saab lahendada ühte tüüpi moodle'i quizi ülesannet. Meil on antud lekseri reeglid ja peame oskama ennustada, kuidas see tükeldub lekseemideks. Kuna seda tüüpi küsimusi meeldib meile eksami moodle quizis küsida, siis oleks hea kui oskate seda ANTLR abil lahendada.

  • 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