Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
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!