grammatikate elustamine jflapiga - ut€¦ · kodutöö (2. nädalat) 1. avaldise grammatika...

50
Grammatikate elustamine JFLAPiga Vesal Vojdani (TÜ Arvutiteaduse Instituut)

Upload: others

Post on 02-Feb-2021

5 views

Category:

Documents


0 download

TRANSCRIPT

  • Grammatikate elustamine JFLAPiga

    Vesal Vojdani (TÜ Arvutiteaduse Instituut)

  • Otse Elust: Java Spechttps://docs.oracle.com/javase/specs/jls/se8/html/

    jls-14.html#jls-14.9

    https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.9https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.9

  • Kodutöö (2. nädalat)

    1. Avaldise grammatika moodustamine 
AST klassidega tutvumine

    2. Käsitsi parseri implementeerimine
Vasakrekursiooni elimineerimine

    Paljud lisatööd! (Need on just kontrolltööks valmistamiseks olulised!)

  • JFLAP

    • JFLAP võib meid aidata grammatikatest aru saada!

    • Sellega tuleb lihtsalt ise mängida.

    • Siin teen ainult väike demo…

  • Regex → Grammatika?

    • Väidetavalt peaks siis saama iga regulaaravaldis ümber kirjutada grammatikaks?

    • Võite proovida näiteks ε | a(b|ba*)*ba* grammatikana kirja panna?

    • Üldiselt võib defineerida rekursiivne definitsioon nagu meie kodutöödes, aga saab lihtsamalt…

    Iseseisvaks uurimiseks Skip!

  • Automaat!(Me ju teame, et iga regulaaravaldis → Automaat)

  • Võite ise katsetada!Idee: igale olekule vastab mitte-terminaal sümbol

  • LõppolekS → ε

  • LõppolekB → ε

  • ÜleminekudS → aA

  • ÜleminekudA → bA

  • ÜleminekudA → bB

  • ÜleminekudB → aB

  • EpsilonigaB → A

  • Valmis!(nüüd tagasi…)

  • There and back again!Teeme väikese muudatuse, et oleks kõik kaetud.

  • Teisendame automaadiksGrammatika on endiselt parem-lineaarne.

  • Igale mitte-terminalile olekLisame uue oleku lõpp-oleku jaoks.

  • Sama põhimõtteS → aA

  • Sama põhimõtteA → bB

  • Sama põhimõtteA → bA

  • Sama põhimõtteB → aB

  • Sama põhimõtteA → B

  • Ainult terminaligaS → ε

  • Ainult terminaligaB → b

  • Regulaarne keel

    • Iga regulaaravaldis saab teisendada parem-lineaarseks grammatikaks.

    • Iga (parem-)lineaarne grammatika saab teisendada regulaaravaldiseks.

    • Ka mitte-lineaarne grammatika võib defineerida regulaarse keele…

  • Grammatika versus keel• S → aS


    S → Sb
S → c

    • Keel: a*cb*.

    • Selle keele jaoks ikkagi leidub parem-lineaarne grammatika.

    • Me olime lihtsalt ise rumalad!

    • S → aSb
S → c


    • Keel: ancbn (n > 0).

    • Selle keele jaoks ei leidu parem-lineaarne grammatika.

    • Saab tõestada, et keelele vastav automaat ei leidu.

  • ParsimineMeile tuttav avaldiste grammatika, aga…


    ainult ühe terminalsümboliga ‘x’.

  • JõumeetodKui me parsimisest veel midagi ei tea, siis on kõige

    lihtsam kasutada “brute force parse”…

  • Sisendsõnex+x+x

  • Start!Derivatsioon on leitud ja nüüd JFLAP laseb meil

    sammhaaval sõne tuletada.

  • E → E+EE → E+E

  • E → E+EE → E+E → E+E+E

  • E → xE → E+E → E+E+E → x+E+E

  • E → xE → E+E → E+E+E → x+E+E → x+x+E

  • E → xE → E+E → E+E+E → x+E+E → x+x+E → x+x+x

  • Vaatame derivatsiooniE → E+E → E+E+E → x+E+E → x+x+E → x+x+x

  • Vaatame derivatsiooniE → E+E → E+E+E → x+E+E → x+x+E → x+x+x

  • Teine parsepuuProovime ise juhtida parsimist, et kätte saada

    teistsugune parsepuu.

  • Sisestame sama sõnex+x+x

  • Start!Nüüd saame ise valida reegli!

  • Start!Valime ära ja vajutame step!

  • E → E+ESiiamaani kõik tuttav, aga nüüd peab valima!

  • Valime vasakpoolset(sest JFLAP oli parempoolne…)

  • Tegime ära!Nüüd tahame E asendada x-iga.

  • E → xNüüd peaks jälle valima, milline E asendada…

  • E → xTeeme kõik korraga, sest siin ei ole ju vahet!

  • Valmis!

  • Ühene grammatika

    E → E + T 
E → T

    T → T * F 
T → F

    F → ( E )
F → x

    avaldis on liidetavate list 
paremal ainult liidetav: (x+x)+x

    liidetav on tegurite list


    suvaline avaldis sulgudes on 
samasugune aatom nagu x

    Liitmine ainult vasakul!

    https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.18

    https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.18

  • Ainult üks puu!Nüüd on hea ennast veenda, et tõesti ei ole võimalik

    teistmoodi puu keerata!