Automaadid, keeled, translaatorid Kompilaatori struktuur Leksiline analüüs Regulaaravaldised
Leksiline analüüs Süntaks analüüs Semantiline analüüs Analüüs Masinkoodi genereerimine Teisendamine (opt, registrid) Vahekoodi genereerimine Süntees Kompileerimise faasid
Lähtekood Leksilise analüüsi sisend
Lekseemide jada Süntaksanalüüsi sisend
Süntaksipuu Semantilise analüüsi sisend
Dekoreeritud puu Selle põhjal hakkame koodi genereerima
R1 := y R2 := 60 R3 := R1 * R2 R4 := x R5 := R3 + R4 x := R5 Vahekood Seda võib nüüd optimeerima hakkata
R1 := y R2 := 60 R1 := R1 * 60 R4 := x R1 := R1 + x x := R1 Optimeeritud vahekood Sellel kursusel me ei optimeeri. Me ei pea ka registrite pärast muretsema.
MOV R1, SP + $8 MULI R1, 60 ADD R1, $4000 MOV $4000, R1 Assemblerkood Olemegi valmis! (Ka linker/loaderi temaatika jääb siin käsitlemata)
Leksiline analüüs lähtetekst leksiline analüüs lekser = skanner (ingl. scanner) lekseemide jada ingl. tokens süntaksanalüüs süntaksipuu semantiline analüüs atrib. süntaksipuu
Regulaaravaldiste süntaks a
RE defineerib keele "" a "a" ""
Näited a b "a" "b" abba "abba" a b c d "ac" "ad" "bc" "bd" ab a "aa" "aba" "abba" "abbba" ab "" "ab" "abab" "ababab" a b "" "a" "b" "aa" "ab" "ba" "aaa" "aab" "aba" "baa" "abb" "bab" "bba" "bbb"
RE algebralised omadused (r s) t = r s t = r (s t) is associative. s t = t s s s = s is commutative. is idempotent. s? = s ε by definition. (rs)t = rst = r(st) sε = s = εs concatenation is associative. ε is a neutral element for concatenation. r(s t) = rs rt concatenation distributes over. (r s)t = rt st concatenation distributes over. (s ) = s is idempotent. s s = s 0ormoretwiceisstill0ormore. ss = s + = s s by definition.
Näiteid regulaarsetest kirjeldustest a za Z 0 9 + - 0 1 9. E
Regexite praktiline kasutus Perekonnanimi, Nimi Nimi Perekonnanimi
Capturing Groups Tihti on sõnes alamrühmitusi vaja kätte saada. Rühmitamine: Vene, Varmo ära tunda kui (Vene) 1, (Varmo) 2 Väljastamine: \2 \1 Kõik tähed enne koma Kõik tähed koma järel Näiteks: sed -E 's/(.*), (.*)/\2 \1/' Punkt on kõik tähestiku tähed
Word: Use Wildcards (Advanced Find & Replace )
Peaaegu Ma ei oska Wordile selgitada, et võtaks terve rida. Selleks on muidu operaatorid ^ ja $.
Proovime Javaga Java regexite teek on java.util.regex Nende funktsionaalsus on ka otse sõnede kaudu kättesaadavad. str.split(regex) = Pattern.compile(regex).split(str) str.split(, ) on aga kiirem. (fast-track lihtsate juhtumite jaoks)
public class Demo { public static void main(string[] args) throws IOException { Path path = Paths.get(args[0]); Files.lines(path).forEachOrdered(Demo::printline); } private static void printline(string line) { String edited = line.replaceall("(.*), (.*)", "$2 $1"); System.out.println(edited); } } Java kood line.replaceall("(.*), (.*)", "$2 $1")
Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(input); while (matcher.find()) { String match = matcher.group();... } Sisend (sõne) Tere, maailm! regex (string) a* b compile Pattern <puu esitus> matcher Matcher <pos, tulemus> Regex API Kohtadele (compile) valmis-olla (matcher) läks (find)
Maskeerimistähed!? (Escape characters / Maskierungszeichen) Regulaaravaldiste kompilaatori jaoks on tärn erilise tähendusega. Kui me lihtsalt tahame seda sümbolit regexis kasutada, siis peab kaldkriips ette panema. (Regex kompilaatori sisend "\d") Aga kaldkriips on ju eritähendusega ka Java jaoks, kui kirjutad sõnena Javas "\d", siis saame veatede.
System.out.println("??? ") Midagi tuleks kirjutada küsimärkide asemele, et ekraanile ilmuks järgmist kaks tähte: \d Sest selline peaks olema sisend regexi kompilaatorile!
IDE on abiks IntelliJ lubab lihtsalt teksti lõigata ja jutumärkide vahele kleepida, siis lisatakse automaatselt maskeerimistähti. Eclipse il seadistus Escape text when pasting into a string literal