Grammatikate elustamine JFLAPiga Vesal Vojdani (TÜ Arvutiteaduse Instituut)
Otse Elust: Java Spec https://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? Iseseisvaks uurimiseks Skip! 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
Automaat! (Me ju teame, et iga regulaaravaldis Automaat)
Võite ise katsetada! Idee: igale olekule vastab mitte-terminaal sümbol
Lõppolek S ε
Lõppolek B ε
Üleminekud S aa
Üleminekud A ba
Üleminekud A bb
Üleminekud B ab
Epsiloniga B A
Valmis! (nüüd tagasi )
There and back again! Teeme väikese muudatuse, et oleks kõik kaetud.
Teisendame automaadiks Grammatika on endiselt parem-lineaarne.
Igale mitte-terminalile olek Lisame uue oleku lõpp-oleku jaoks.
Sama põhimõtte S aa
Sama põhimõtte A bb
Sama põhimõtte A ba
Sama põhimõtte B ab
Sama põhimõtte A B
Ainult terminaliga S ε
Ainult terminaliga B b
Regulaarne keel Iga regulaaravaldis saab teisendada paremlineaarseks 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: a n cb n (n > 0). Selle keele jaoks ei leidu parem-lineaarne grammatika. Saab tõestada, et keelele vastav automaat ei leidu.
Parsimine Meile tuttav avaldiste grammatika, aga ainult ühe terminalsümboliga x.
Jõumeetod Kui me parsimisest veel midagi ei tea, siis on kõige lihtsam kasutada brute force parse
Sisendsõne x+x+x
Start! Derivatsioon on leitud ja nüüd JFLAP laseb meil sammhaaval sõne tuletada.
E E+E E E+E
E E+E E E+E E+E+E
E x E E+E E+E+E x+e+e
E x E E+E E+E+E x+e+e x+x+e
E x E E+E E+E+E x+e+e x+x+e x+x+x
Vaatame derivatsiooni E E+E E+E+E x+e+e x+x+e x+x+x
Vaatame derivatsiooni E E+E E+E+E x+e+e x+x+e x+x+x
Teine parsepuu Proovime ise juhtida parsimist, et kätte saada teistsugune parsepuu.
Sisestame sama sõne x+x+x
Start! Nüüd saame ise valida reegli!
Start! Valime ära ja vajutame step!
E E+E Siiamaani kõik tuttav, aga nüüd peab valima!
Valime vasakpoolset (sest JFLAP oli parempoolne )
Tegime ära! Nüüd tahame E asendada x-iga.
E x Nüüd peaks jälle valima, milline E asendada
E x Teeme kõik korraga, sest siin ei ole ju vahet!
Valmis!
Ühene grammatika E E + T E T avaldis on liidetavate list paremal ainult liidetav: (x+x)+x Liitmine ainult vasakul! T T * F T F liidetav on tegurite list F ( E ) F x suvaline avaldis sulgudes on samasugune aatom nagu x 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!