grammatikate elustamine jflapiga - ut€¦ · kodutöö (2. nädalat) 1. avaldise grammatika...
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!