Finit utomter, reguljär uttryck och prefixträd Algoritmer och Dtstrukturer Mrkus Sers mrkus.sers@lingfil.uu.se Upplägg Finit utomter Implementtion Reguljär uttryck Användningr i Jv Alterntiv till inär sökträd för strängr Klls oft trie Finit utomter Består v: en mängd tillstånd (K) en mängd symoler (Σ) ett strttillstånd (q 0 ) en mängd giltig vslutningstillstånd (F) en mängd övergångr (δ) Funktion: K Σ K Finit utomter K = {,, } Σ = {, } q 0 = δ = {<, >=, <, >=, <, >=} F = {} Olik finit utomter Indeterministisk Tillåter epsilonövergångr Tillåter tt δ är en reltion Fler måltillstånd för vrje tillstånd symol-pr Kn determinisers mskinellt Deterministisk Tillåter ing epsilonövergångr Tvingr δ tt vr en funktion I ll prktisk hänseenden kn mn etrkt finit utomter som deterministisk Finit utomter Beskriver reguljär språk Vrje finit utomt motsvrr ett reguljärt språk Om mn driver en utomt med en sträng hmnr mn i ett giltigt vslutningstillstånd om strängen ingår i det reguljär språk utomten eskriver Mn kn etrkt strängr som en slgs drivmedel för utomter Sträng = Σ*
Provkörning med Provkörning med Provkörning med Provkörning med Totl funktion som δ δ ör vr en totl funktion Potentiell övergångr som utelämns ehndls som om de gick till ett återvändstillstånd x Implementtioner v finit utomter Hur sk mn gå till väg för tt modeller en finit utomt? Modeller delrn för sig K: All tillstånd Σ: All symoler q 0 : Strttillståndet F: All giltig vslutningstillstånd δ: Övergångsfunktionen
K och q 0 All tillstånd måste vr unik Vnligtvis numrerde Kn modellers som heltl Vrje heltl motsvrr ett tillstånd Vi kn modeller K som ntlet tillstånd q 0 är i så fll ett specifikt heltl som pekr ut strttillståndet Σ En mängd unik symoler Kn modellers som en list med tecken Teckenuppsättningen är en list med tecken! Kn li joigt med UTF-8 Läs yteström istället? Vrje tecken tolks som en egen utomt, somlig med ett tillstånd, ndr med fler Begränsr teckentellen till 55 unik symoler Kn modellers genom en seprt klss Måste kunn ge ett heltl givet en symol F Eftersom tillstånden modellers som heltl ehöver en oolen ssociers till vrje heltl Svrr på frågn är dett ett giltigt vslutningstillstånd? En rry med oolener pssr δ En funktion sk leverer ett svr för vrje tänkrt input Tänkr input är komintioner v tillstånd och symoler (K Σ) Tillstånd och symoler är heltl Vi ehöver ssocier två heltl (strttillståndet och en symol) till ett tredje (måltillståndet) Arry med rryer med heltl! Mtris med heltl Smmnfttning K: Heltl (ntl tillstånd) Σ: Assocition: symol heltl Dtorns egn teckentell Måste kunn svr på ntlet tecken q 0 : Heltl (som pekr ut strttillståndet) F: Arry (storlek = K) med oolener δ: Mtris (storlek = K size(σ)) med heltl I Jv pulic clss FSA { privte int k; privte int q0; privte oolen[] f; privte int[][] delt; pulic FSA(int k, int q0) { this.k = k; this.q0 = q0; f = new oolen[k]; delt = new int[k][56]; } pulic oolen ccepts(string s) { int q = q0; for (yte : s.getbytes()) { -= Byte.MIN_VALUE; //Sklning q = delt[q][]; } return f[q]; } }
Exempelutomten i Jv 0 k = 4 q0 = f = [ flse, flse, flse, true ] delt = [ [, 0, 0, ], [,, 0, ], [,,, ], [, 0, 0, ] ] Smmnfttning Finit utomter Beskriver reguljär språk Genom tt svr på frågn om en given sträng ingår i språket eller inte Kn implementers reltivt enkelt Reguljär uttryck Beskriver ett reguljärt språk Kn kominers med Kleene stjärn (*) Union (U) Snitt ( ) Konktenering (_) Exempel A = {}, B = {} A_B = {} AB U BA = {, } A*B = {,,,, } Reguljär uttryck Reguljär språk kn vr oändlig Vi kn inte räkn upp ll strängr som ingår i ett språk Kn vi vgör ifll en given sträng tillhör ett givet reguljärt språk? Om vi hde en utomt Reguljär uttryck och finit utomter Båd eskriver reguljär språk Går tt översätt mskinellt melln reguljär uttryck och finit utomter Två spekter v smm sk Reguljär språk Reguljär uttryck i Jv (.4 +) jv.util.regex Pttern Klss som representerr reguljär uttryck Byggs med en strängrepresenttion v det reguljär uttrycket Dokumenttionssidn innehåller llt mn kn tänks vilj vet om Jvs reguljär uttryck Mtcher Byggs med ett Pttern och en String Svr på frågor om hur strängen mtchr det reguljär uttrycket 4
Reguljär uttryck i String Vnligste nvändningsområden finns inäddde i String oolen mtches(regex) String replceall(regex, replcement) String replcefirst(regex, replcement) String[] split(regex) String[] split(regex, limit) Reguljär uttryck i progrmmering Förkorts oft re (regulr expression) perlre = Perls mnulsid för reguljär uttryck regex (regulr expression) Jv.util.regex regexp (regulr expression) re(gex(p)?)? Oft utyggd för tt t tillvr på sker mn får grtis vid implementering Stöd för dtorns inyggd teckentell Reguljär uttryck i progrmmering Bonusfunktioner Färdig symolklsser Anpssning till dtorns teckentell Mång tecken är redn klssificerde Exkt vd i strängen vr det som mtchde uttrycket? Möjlighet tt få ut delsträngr som mtchde delr v uttrycket Reguljär uttryck i Jv Tecken Teckenklsser [-zåäö] All tecken melln och z smt åäö (intervll enligt gällnde teckentell) [^ ] Negerd klss Mång färdig klsser Kvntifierre Hur mång v föregående tecken, klss eller grupp? Grupperingr Görs med prenteser Teckenklsser (se jv.util.regex.pttern) Mängdteoretisk opertioner [-z&&[def]] = [def] [-z&&[^def]] = [-cg-z] Escpetecken \\ ckslsh \n \t \r \f Vnlig system etydelse \Onn Tecken nn enligt oktl värde \xnn Tecken nn enligt hexdecimlt värde Fördefinierde klsser. Mtchr vilket tecken som helst \s \S spce \w \W word \d \D digit \p{nmn} \P{nmn} posix Ankre ^ Börjn v input $ Slutet v input Kvntifierre Grundkvntifierre? Noll eller en gång * Noll eller fler gånger + En eller fler gånger {n} Exkt n gånger {n,} Minst n gånger {n,m} Minst n gånger, högst m gånger Är normlt girig Kn görs ovillig genom tt lägg på ett? efter (??, *?, +?, ) 5
Girig/ovillig kvntifierre (greedy/reluctnt) Viktigt koncept när mn fångr olik grupper Girig kvntifierre försöker mtch så mycket som möjligt Ovillig kvntifierre försöker mtch så lite som möjligt, 0, 4, 4 sk mtchs mot.*, Girig mtchning:, 0, 4, Ovillig mtchning:, Grupperingr Hel uttrycket etrkts som en grupp Grupper kn skps genom prenteser Grupper fångr upp den delsträng de mtchr Går tt stäng v: (?:RegExp) Exempel: (A)(B(C)) Hel uttrycket lir grupp 0 Därefter ts vrje strtprentes från vänster till höger ut som en grupp: A, BC, C Mtchnde delsträngr i Jv Klssen Mtcher kn hämt ut en grupp efter index Exempel: (A)(B(C)) groupcount() = 4 group(0) = ABC group() = A group() = BC group() = C Förhållndet melln Pttern, Mtcher och String Pttern hr en sttisk metod som heter compile Tr en strängrepresenttion v ett reguljärt uttryck och returnerr en Pttern Pttern hr en metod som heter mtch Tr en ChrSequence (supertyp till String) som rgument och returnerr en Mtcher Mtcher representerr resulttet v en mtchning Hr metoder för tt eskriv hur det gick (se grupper) Förhållndet melln Pttern, Mtcher och String Smmnfttning: reguljär uttryck String String Pttern compile Pttern mtch Enkelt tt ehndl strängr Krftfull meknism Tidskomplexitet: O(n) där n är strängens längd Mtcher group(int) String 6
(trie) Aretr på sekvenser ex. strängr Jg kommer genomgående tl om strängr istället för sekvenser v tecken Hr mycket gemensmt med utomter Informtionen om vd mn läst in hittills i en utomt vspegls i vilket tillstånd mn efinner sig i I prefixträd motsvrr vrje tillstånd (eller nod om mn så vill) ett unikt prefix Nodern kn ssociers med informtion om det ktuell prefixet egenskper Vi kn ssocier informtion med en sträng Vi kn komm åt informtionen i O(n) tid där n är längden på strängen Jättesnt! Lexikon? Exempel Insättning v runjörn : Automtsättet run i s t j ö r n e r i s t j ö r n e r? run i Insättning v runjörn : s j ö r n t j ö r n e r Skillnder melln utomter och prefixträd Automter Går tt minimer Kn svr på ifll strängen tillhör språket eller inte Går inte tt minimer spretigre och större Vet lltid vilken sträng som krävdes för tt hmn där mn efinner sig 7
eller inär sökträd? s = stränglängd, n = ntl noder Binär sökträd O(log n) Behöver gör log n strängjämförelser Hur lång tid tr en strängjämförelse? O(s) O(s) Behöver gör s symolssocitioner Hur lång tid tr en symolssocition Beror på vilken meknism som nvänds eller inär sökträd? Symolssocition Omvndl symolen till ett nummer Slå upp i rry Snt Tr stor plts Slå upp med hshning Långsmmre Tr mindre plts Prioriteringsfråg Svårt tt säg vd som är snst Beror till stor del på konstnter som inte syns i O-nottion eller inär sökträd? Snre Tr större plts Binär sökträd Långsmmre Tr mindre plts Avvägning melln tid och plts Hur ser växlingskursen ut? Olik tillämpningr hr olik ehov Stämmer det? Smmnfttning nses r för lexikonhntering Br tt känn till som språkteknolog Frmtiden (för kursen) Br len på måndg kvr! Kursutvärdering kommer upp på hemsidn inom kort Gör den! Tvek inte tt kontkt mig om ni undrr något mrkus.sers@lingfil.uu.se 8