Arvutiteaduse instituut
  1. Esileht
  2. Automaadid, keeled ja translaatorid
EN
Logi sisse

Automaadid, keeled ja translaatorid

  • Üldinfo
  • Ajakava
  • Eksami näidised
  • Teemad
    • 1. Soojendus
    • 2. Regulaaravaldised
      • Regex
      • Java API
      • Challenge*
      • Kodutöö
    • 3. Automaadid
    • 4. Avaldise struktuur
    • 5. Grammatikad ja lekser
    • 6. Käsitsi parsimine
    • 7. ANTLRiga töötamine
    • 8. Interpretaator
    • 9. Kompilaator
    • 10. Edasi!
  • Süvendus
  • GitHub
  • Moodle
  • Zulip
  • Zoom

Java regulaaravaldiste API kasutamine

Teemat tutvustav video: Java Regex API (slaidid).

Meelde tuletamiseks võib uurida Java API dokumentatsiooni:

  • Regex Tutorial
  • java.util.regex.Pattern sisaldab kõige rohkem infot Java regulaaravaldiste süntaksi kohta, muuhulgas kõik täheklasside definitsioonid. Teine asi siin on Pattern.compile kirjeldus, mis võtab ka soovi korral teist argumenti, millega saab käitumist konfigureerida.
  • java.util.regex.Matcher klassi kolm meetodit võib üle vaadata, aga enamasti läheb meil siin vaja find ja group, mille kohta on näide allpool.
  • Lisaks saab regulaaravaldisi anda ka paljudele sõne klasside meetoditele: matches, replaceAll, replaceFirst ja split.

Kasutusnäide

    public static void main(String[] args) {
        String input =
                "1, 2, Polizei, 3, 4, Grenadier...\n" +
                "Jenny, don't change your number, 867 5309.\n" +
                "666 the number of the Beast. Hell and fire was spawned to be released.\n" +
                "87, 87 var har du tagit vägen nu?\n" +
                "Olen su poole teel. Aa-ha-ha-haaaaaaa-haa-haaaaaa. 581C.";

        Pattern pattern = Pattern.compile("\\d+");
        Matcher matcher = pattern.matcher(input);

        List<Integer> numbers = new ArrayList<>();

        while (matcher.find()) {
            String match = matcher.group();
            numbers.add(Integer.parseInt(match));
        }

        System.out.print("Tekstis esinevad arvud: ");
        System.out.println(numbers);

        pattern = Pattern.compile("(\\d+) (\\d+)");
        matcher = pattern.matcher(input);
        if (matcher.find()) {
            System.out.println("Jenny number: " + matcher.group(0)); // = matcher.group()
            System.out.println("Esimene osa: " + matcher.group(1));
            System.out.println("Teine osa: " + matcher.group(2));
        }
    }

Esimene ülesanne

Lahenduse ideed kirjeldav video: Regulaaravaldised (video lõpupool).

Implementeeri meetod extractAddresses, mille sisendiks on sõne, millest on vaja regulaaravaldisi kasutades tuvastada aadressid ning luua nendest sõnede list. Aadressideks loeme sõnesid kujul
"<MAAKOND>, <ALEV>, <TÄNAV> <MAJANR>" või "<MAAKOND>, <ALEV>, <TÄNAV> <MAJANR>, <TÄPSUSTUS>"

  • <MAAKOND> koosneb ühest suurtähega algavast sõnast millele järgneb sõna "maakond".
  • <ALEV> koosneb ühest suurtähega algavast sõnast, millele võib (aga ei pruugi) järgneda üks väikese tähega algav sõna.
  • <TÄNAV> koosneb ühest suurtähega algavast sõnast, millele võib (aga ei pruugi) järgneda üks väikese tähega algav sõna.
  • <MAJANR> koosneb mingist ühe- või mitmekohalisest arvust.
  • <TÄPSUSTUS> koosneb ühest valikulisest väiketähega sõnast (st seda ei pruugi esineda). Sellele järgneb üks arv (võib olla mitmekohaline).

<MAAKOND>, <ALEV>, <TÄNAV> <MAJANR> näide:
Pärnu maakond, Pärnu linn, Mingi tänav 777
<MAAKOND>, <ALEV>, <TÄNAV> <MAJANR>, <TÄPSUSTUS> näide:
Cumberlandi maakond, Sydney, Wallaby tee 42, akvaarium 1

Teine ülesanne

Implementeeri meetod extractFunctions. Sisendsõnest on vaja regulaaravaldisi kasutades tuvastada programmeerimiskeeles Python kirjutatud kahe argumendiga funktsioonide definitsioonid ning luua nende funktsioonide nimedest koosnev sõnede list.

Funktsioonid on defineeritud lausetega kujul:

    def <funktsiooni nimi>(<esimene argument>,<teine argument>):

Võtmesõna def ja funktsiooni nime vahel peab olema vähemalt üks whitespace sümbol. Muude lause fragmentide vahel võib, aga ei pruugi, olla whitespace-i. Funktsiooni nimi ja mõlemad argumendid on Pythoni muutujanimed. Need algavad kas alakriipsuga _ või mingi tähega. Esimesele sümbolile järgnevad sümbolid võivad olla lisaks tähtedele ja alakriipsule ka numbrid. Näide sisendist:

"def funktsioon(a,b): …. siin programm … def _a(B,C): … veel … . def FIBO("

Sellise sisendi puhul peaks meetod tagastama listi järgnevate sõnedega: ["funktsioon", "_a"]

  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Courses’i keskkonna kasutustingimused