FEN Sprog1 Lidt om sprog Definition: Et sprog over et endeligt alfabet (sigma) er en mængde af strenge dannet af tegn fra . Eksempel: Lad = {a, b} Sprog over alfabetet kan være: { , a, aa, aab}-- er den tomme streng { , a, b, aa, ab, ba, bb}-- og kan dannes over et- {abba, baba} -- hvert alfabet
FEN Sprog2 Programmeringssprog Et program i et programmerings-sprog, P er en streng dannet af sprogets grundsymboler: –Hvad er det? som overholder visse regler givet ved P’s grammatik /* hello.cs */ public class Startup { public static void Main() { System.Console.WriteLine("Hello World!"); } }//class En parser er et program, som afgør om en streng til hører et sprog
FEN Sprog3 Lidt om sprog * betegner mængden af alle strenge, som kan dannes over alfabetet . For = {a, b} er: * = {a, b}* = { , a, b, aa, ab, ba, bb, aaa, aab, aba,…} Med denne notation kan vi beskrive flere sprog over : –{x {a, b}* x < 8}-- x betegner længden af x -- ( == antal tegn i x) –{x {a, b}* n a (x) n b (x)}-- n a (x) betegner antal a-er i x Sproget med mindst 4 a’er og højest 12 b’er?
FEN Sprog4 Sprog er mængder… Derfor kan vi danne nye sprog ved mængdeoperationer: –Lad L 1 og L 2 være sprog over , da er L 1 L 2, L 1 L 2 og L 1 - L 2 også sprog over Da ethvert sprog L over er en delmængde af *, kan vi tale om det komplementære sprog L’ = * - L
FEN Sprog5 Konkatenering Vi kan konkatenere sprog ligesom strenge: –Lad x og y *, så er xy strengen, hvor symbolerne i y er skrevet efter x –Tilsvarende definerer vi for L 1, L 2 * konkateneringen af L 1 og L 2: L 1 L 2 = { xy x L 1 y L 2 }
FEN Sprog6 Mere om konkatenering Det ses let, at konkatering bl.a. er associativ, hvorfor vi kan snakke om konkatenering af mere end to strenge: –Lad a , x * og L * for et eller andet alfabet –Vi skriver da: a k = aa … a-- k a’er x k = xx … x-- k x’er k = … = {x * x = k} Er k=0, så definerer vi: a 0 = , x o = og 0 = { }
FEN Sprog7 Kleene Star (Closure) Vi kan også konkatenere sprog: –Lad a , x * og L * for et eller andet alfabet –Vi skriver da: L k = LL … L-- k L’er L * betegner tilsvarende sproget af alle strenge, som kan dannes ved at konkatenere 0 eller flere strenge i L. Hermed: L * = {L k | k N} Specielt er L 0 = { } Operationen L * kaldes Kleene Star eller Kleene closure af L
FEN Sprog8 Eksempel: Regulære Sprog Regulære sprog er strenge over et alfabet, som kan dannes ud fra regulære udtryk: Lad være et alfabet, a og r og s strenge over Regulære udtryk: –Basis: r = a er et regulært udtryk. Den tomme streng ε er et regulært udtryk. –Operationer: Hvis r og s er regulære udtryk, så er: Alternativer’|’ r | s | ε Konkatenering:rs | ε Gentagelse (0 eller flere)’*’(r | s)* –også regulære udtryk.
Flere eksempler: Det tomme sprog Sproget Pal: alle palindromer over {a, b} (fx strenge som abba eller bab). Mængden af valide Java identifiers Sproget Expr: lovlige regneudtryk med identifieren a, de binære operationer + og * samt parenteser (fx strenge som a, a+a*a og (a+a*(a+a))) FEN Sprog9
Flere eksempler: Sproget Bal: strenge indeholdende parenteser, hvor parenteserne balancerer (fx strenge som , (), (a+a*a) og (a+a*(a+a)), men også ((()))). FEN Sprog10