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
    1. Avaldisgrammatikad
    2. Implementatsioon
    3. Vasakrekursioon
    4. Ennustav parsimine*
    5. Kodutöö
    6. Lausearvutus*
    7. Eksami parser*
  8. ANTLR intro
  9. AST loomine
  10. Interpretaator
  11. Semantiline analüüs
  12. Kompilaator
  • Moodle
  • Bitbucket
  • Fleep!

5. lisatöö: Väiksed Parserid

Selles kodutöös harjutame natuke kontekstivabade grammatikate teisendamine käsitsi parseriteks ja parsepuu loomist. Projekti aluseks tuleks võtta "lisa5" paketti klassid. Kõik parserid tuleb ehitada tutorial koodi põhjal, s.t. nad võiksid olla Parser.java alamklassid. Praktikumi materjalid tasub üle vaadata, eriti ASTi genereerimise kohta vasakrekursiooni eemaldamisel.

Kokku on võimalik saada 10 punkti. Kaks punkti saab iga ülesanne juures saama ainult keele ära tundmise eest ja siis on iga ülesanne juures mõned natuke raskemad ülesanded, mis puudutavad puude ehitamist või veatöötlust.

1) SAParser


Esimesena tuleks kirjutada Parser järgmise keele jaoks:

S → aSb | aA | c
A → bAb | d | Ac

Esimeses reeglis on kaks valikut, aSb ja aA, mis algavad sama tähega. Teine reegel on vasakrekursiivne. Grammatika peab seega teisendama: paneme esimese reegli jaoks uue mitte-terminali nimeks R ja teise reegli jaoks uue mitte-terminali nimeks Q. Paremal on toodud parsepuu näide sisendi abdb korral. (See on muide see puu, mida me kontrolltööl ei taha!)

2) AC/DCParser

Järgmises grammatikas peab samuti vasakrekursiooni elimineerima:

S → aSdS | CS | ε
C → c | C/

Seekord tuleb aga originaalse grammatika parsepuu tagastada. Näiteks ac/dc parsepuu peaks tulema nagu paremal joonisel.

3) TypeParser

Viimane grammatika on inspireeritud C keele tüübideklaratsioonide grammatikast:

S → TD
T → int | void
D → *D | A
A → (D) | A[] | ε

Siin tuleb kõigepealt lithsalt parsida. See vajab vasakrekursiooni elimineerimist. Lisaks tahame aga ka luua abstraktne süntakspuu, mis kirjeldab tüübide päris tähendusi:

  • int*[] → TArray(TPtr(TInt)).
  • int(*)[] → TPtr(TArray(TInt)).

Kahjuks ei ole C keel eriti LL-parsimiseks sõbralik keel ja see ülesanne on oluliselt raskem, kui esialgu võib tunduda. Väga puhtalt või ilusasti ei õnnestugi seda ära teha.

  • 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