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
    1. JFLAP
    2. Challenge*
    3. HtmlStrip
    4. PlusMiinus
    5. Kodutöö
  4. Lõplikud automaadid
  5. Avaldise struktuur
  6. Grammatikad ja lekser
  7. Käsitsi parsimine
  8. ANTLR intro
  9. AST loomine
  10. Interpretaator
  11. Semantiline analüüs
  12. Kompilaator
  • Moodle
  • Bitbucket
  • Fleep!

3. kodutöö

Selle lahendamiseks tasub kõigepealt natukene tutvuda meie abimaterjalidega JFLAP ja olekumasina kohta, sest siin on mõned uued teemad ja tahame ka Java lahendust teatud kujul.

1. JFlap harjutused (5p)

Koosta JFLAP-is järgenevatele kirjeldustele vastavad lõplikud automaadid ja lae failid Moodle'isse.

NB! JFlap lubab teha ka üleminekuid, mis loevad sisendist korraga mitu tähte, aga automaatkontroll ei saa selliste üleminekutega hakkama. Seepärast ärge oma lahendustes sellist võimalust kasutage.

Kasuta failinimesid kujul yl<ülesande nr>.jff nt. yl1.jff.

  1. Sõnad üle tähestiku {a,b}, mis algavad või lõppevad tähega 'a'.
  2. Sõnad üle tähestiku {a,b}, mis algavad ja lõppevad tähega 'a', muuhulgas "a" ise.
  3. Sõnad üle tähestiku {a,b}, mis sisaldavad vähemalt üks 'a'.
  4. Sõnad üle tähestiku {a,b}, mis sisaldavad vähemalt üks 'a' ja täpselt üks 'b'.
  5. Sõnad üle tähestiku {a,b}, mis sisaldavad vähemalt üks 'a' ja paaritu arv 'b'-sid.

2. Olekumasin (5p)

Selle kodutöö eesmärk on kirjutada olekumasin, mis aitab meid teksti korrastamisega. Sisendiks saame näiteks sellise tekstijuppi:

This     text (all of it   )has occasional lapses .. .in
  punctuation( sometimes,pretty bad ; sometimes ,not so).

( Ha ! )Is this  :fun ! ? !  Or   what  ?

Ja me tahaks, et tulemuseks oleks ilus korrastatud tekst:

This text (all of it) has occasional lapses... in
punctuation (sometimes, pretty bad; sometimes, not so).

(Ha!) Is this: fun!?! Or what?

Korrastatud tekst vastab järgmistele nõuetele:

  • Sõnade vahel on täpselt üks tühik.
  • Kirjavahemärkidena arvestame selles kodutöös järgmiseid: koma, koolon, semikoolon, punkt, hüüumärk ja küsimärk. Eraldi käsitleme ka sulgusid.
  • Sõna ja temale järgneva kirjavahemärgi vahel ei ole tühikut, aga kirjavahemärgi ja temale järgneva sõna vahel on: "Tere, Maailm!"
  • Kirjavahemärkide vahel ei ole tühikut, näiteks "Mis asja?!".
  • Avav sulg käitub vastupidiselt teistele kirjavahemärkidele: sellel on ees tühik, aga järel mitte.
  • Lõppev sulg käitub põhimõtteliselt nagu teised kirjavahemärgidki.
  • Rea algul ei ole ühtegi tühikut! (Uue rea sümbol on \n). NB! Ka esimesel real ei tohiks olla algul ühtegi tühikut.

Esitamine

FormatMachine.java tuleb esitada siin.

Kuidas seda lahendada

Me oleme ainult paari miljoni euro eest saanud sellise üldise raamistiku seda tüüpi ülesannete lahendamiseks. Raamistiku töö on sisendit kuskilt lugeda ja tähthaaval meie olekumasinale sööta. Meie olekumasin annab iga tähe jaoks vastuseks sõne (mis võib ka olla tühi), millega tuleks antud tähe asendada. Raamistiku kood on järgmine:

import week3.FormatMachine;

public class FormatText {
    public static String cleanUp(String s) {
        StringBuilder sb = new StringBuilder();
        FormatMachine machine = new FormatMachine();
        for (char c : s.toCharArray()) {
            sb.append(machine.process(c));
        }
        return sb.toString();
    }

    // Meetodi käivitame näiteks nii:
    public static void main(String[] args) {
        String input =
                "This     text (all of it   )has occasional lapses .. .in\n" +
                "  punctuation( sometimes,pretty bad ; sometimes ,not so).\n" +
                "\n" +
                "( Ha ! )Is this  :fun ! ? !  Or   what  ?";
        System.out.println(cleanUp(input));
    }
}

Me oleme väga tänulikud, sest nüüd jääb ainult implementeerida olekumasin "FormatMachine", mis sisulise töö ära teeb. See peab siis vastama järgmisele mallile:

package week3;

public class FormatMachine {
    public String process(char c) {
        // TODO: Asendada millegagi, mis midagi asjaliku teeb.
        return "" + c; //  ehk Character.toString(c)
    }
}

Kui raamistiku kirjeldus on segane, siis proovige kõigepealt katsetamise teel aru saada, mis ta teeb. Käivitage ülalolev kood, kui process on täpselt nii nagu ta üleval on. Tehke siis väiksed muudatused. Proovige näiteks, mis juhtub, kui process teeb ainult return " " + c;, jne. Oluline on kõigepealt aru saada raamistikust, sest me oleme sinna palju raha investeerinud ja seda enam muuta ei saa. Teie saate ainult FormatMachine koodi üles laadida!

NB! Kui ülesanne ise tundub raske, siis alustage ikkagi lihtsamate testjuhtumitega:

Üks kaks  kolm   neli    viis
Tere , maailm  !
Tere ,maailm !  !

Järgmisena proovige mõned testid sulgudega. Ja lõpuks peab reavahetust käsitlema ('\n'), et meie esialgne näide ka töötaks.

Kui ka peale pikemat pusimist jääd hätta, siis loe vihjeid.

Allikas

Ülesanne on inspireeritud Victor Eijkhout'i juhendist "A Lex Tutorial". Võib-olla seal olev lahendus on abiks, aga sealsest kontekstist aru saamine võib rohkem aega nõuda, kui ülesanne otse 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