VPG/Otto Knudsen1 VPR - Repetition Trådning Distribueret Programmering Sprogteori Grafer
VPG/Otto Knudsen2 Sproghistorie Syntaks (struktur) Semantik (Indhold)
VPG/Otto Knudsen3 Sproghistorie Sprog Lavniveau (maskinkode) Højniveau (C#, Java, Pascal, osv.) Maskinuafhængig kode, som omsættes til maskinkode via kompilering, fortolkning eller en mellemting af disse
VPG/Otto Knudsen4 Sprogteori – Kompiler Kompiler Kildekode –> Kompiler –> Binær kode
VPG/Otto Knudsen5 Sprogteori – Kompiler Kompilertyper Single Pass Multi Pass Load and go Debugging Optimering
VPG/Otto Knudsen6 Sprogteori – Kompiler Kompiler Analyse (nedbryde) Leksikalsk analyse Scanning, Tokenizing Syntaksanalyse – Parsing Hierarkisk analyse, Semantisk analyse Syntese (sammensætte)
VPG/Otto Knudsen7 Sprogteori – EBNF BNF Backus-Naur-Form EBNF Extended Backus-Naur-Form Udvidet med { } og [ ] Findes i flere varianter
VPG/Otto Knudsen8 Sprogteori - Analyse Leksikalsk analyse Opsplitning af input i brikker Syntaksanalyse – Parsing Samling af brikker til sætninger, som opfylder en velbeskrevet struktur (mønster)
VPG/Otto Knudsen9 EBNF – Elementer En EBNF-grammatik består af Terminaler Nonterminaler Startsymbol Produktionsregler
VPG/Otto Knudsen10 EBNF – Produktionsregler Produktionsregler Afsluttes med punktum | betegner valgmuligheder { } betegner nul eller flere gentagelser [ ] betegner nul eller én forekomst ( ) anvendes til at samle enheder
VPG/Otto Knudsen11 EBNF – Eksempel Medlemsliste-EBNF medlemsliste = medlem {medlem}. medlem = navn fødselsår [kategori] ";". navn = bogstav {bogstav}. fødselsår = ciffer, ciffer, ciffer, ciffer. kategori = "junior"|"senior". bogstav = "a"|...|"å"|"A"...|"Å". ciffer = "0"|...|"9"|.
VPG/Otto Knudsen12 EBNF EBNF-grammatikken Syntaktiske regler Beskriver, hvordan ”byggeklodserne” sammensættes Semantiske regler Beskriver hvilke sammensætninger, der giver mening
VPG/Otto Knudsen13 EBNF Semantiske krav i EBNF-grammatikken Kan komplicere i unødig grad Undgå derfor: at inddrage semantiske krav, hvis det går ud over overskueligheden at rense helt for semantiske krav, hvis det går ud over forståeligheden Balancér overskuelighed og forståelighed!
VPG/Otto Knudsen14 Syntaksstyret indlæsning Kontrol af, hvorvidt inddata overholder de syntaktiske krav beskrevet i EBNF- grammatikken 2 metoder Regelstyret indlæsning Tabelstyret indlæsning Single Symbol Lookahead
VPG/Otto Knudsen15 Syntaksstyret indlæsning Metode: Indlæsning af brikker Haves: Abstrakt beskrivelse af, hvorledes inddata skal se ud (EBNF) Konkret inddata-strøm Mål: Kontrol af overensstemmelse mellem konkret inddata og abstrakt beskrivelse (EBNF) Strategi: Konkretisér EBNF’en og abstrahér over inddata
VPG/Otto Knudsen16 Syntaksstyret indlæsning Begreber Brik: Udeleligt sprogelement. Følge af tegn, som har selvstændig betydning i forhold til inddata Leksem: Den originale streng, som indeholder en brik. Det er som regel det længste leksem, der afgør en brik
VPG/Otto Knudsen17 Syntaksstyret indlæsning Konkretisering af EBNF Fjern alle produktionsregler, hvor en brik findes på venstresiden Fjern derved overflødiggjorte produktionsregler Indsæt de valgte brikker på pladserne svarende til terminalerne
VPG/Otto Knudsen18 EBNF – Eksempel 1 Medlemsliste-EBNF medlemsliste = medlem {medlem}. medlem = navn fødselsår [kategori] ";". navn = bogstav {bogstav}. fødselsår = ciffer, ciffer, ciffer, ciffer. kategori = "junior"|"senior". bogstav = "a"|...|"å"|"A"...|"Å". ciffer = "0"|...|"9"|. Konkretiseret EBNF medlemsliste = medlem {medlem}. medlem = navn fødselsår [kategori] semikolon. kategori = junior|senior. Valgte brikker semikolon, navn, fødselsår, junior, senior, andet, slut
VPG/Otto Knudsen19 EBNF – Eksempel 2 Talfølge-EBNF talfølge = tal {"," tal}. tal = [fortegn] ciffer {ciffer} ["." ciffer {ciffer}]. ciffer = "0" |... | "9". fortegn = "+" | "-". Konkretiseret EBNF talfølge = tal {komma tal}. tal = [fortegn] heltal [punktum heltal]. fortegn = plus | minus. Valgte brikker komma, heltal, punktum, plus, minus, andet, slut
VPG/Otto Knudsen20 EBNF – Produktionsregler Typer af produktionsregler Rekursiv Regel, der beskrives vha. sig selv Regulær Regel med gentagelser { } Simpel Alle andre regler
VPG/Otto Knudsen21 EBNF-grammatikker Typer af EBNF-grammatikker Direkte rekursiv Gramatik, der indeholder en rekursiv produktionsregel Indirekte rekursiv Grammatik, der indeholder en produktionsregel, der anvender en non-terminal, der andetsteds direkte eller indirekte refererer til reglen Regulær Ej-rekursiv grammatik, der indeholder regulære produktionsregler Simpel Alle andre grammatikker
VPG/Otto Knudsen22 Regelstyret indlæsning Betegnelser f, f 1, f 2, …, f n betegner en følge af brikker og non-terminaler n betegner en non-terminal b betegner en brik s betegner en non-terminal eller en brik betegner den tomme mængde betegner den tomme følge
VPG/Otto Knudsen23 Regelstyret indlæsning first Mængden af brikker, som følgen kan starte med follow Mængden af brikker, som kan efterfølge en given non-terminal eller brik
VPG/Otto Knudsen24 first first(b) = {b} first( ) = n = f 1 f 2 first(n) = first(f 1 f 2 ) = first(f 1 ), f ≠ first(n) = first(f 1 f 2 ) = first(f 1 ) first(f 2 ) n = f 1 |f 2 first(n) = first(f 1 |f 2 ) = first(f 1 ) first(f 2 ) n 1 = [f 1 ] first(n 1 ) = first( |f 1 ) = first(f 1 ) n 2 = [f 1 ] first(n 2 ) = first( |f 1 n 2 ) = first(f 1 )
VPG/Otto Knudsen25 first Buttom-up-strategi first(navn) = {navn}... osv. med alle brikkerne first(kategori) = first(junior|senior) = first(junior) first(senior) = {junior, senior} first(medlem) = first(navn fødselsår [kategori] semikolon) = first(navn) = {navn} first(medlemsliste) = first(medlem {medlem}) = first(medlem) = {navn}
VPG/Otto Knudsen26 follow follow(startsymbol) = n = f 1 sf 2 n = f 1 [s]f 2 n = f 1 {s}f 2 follow(s) indeholder first(f 2 ) follow(s) indeholder follow(n), hvis f 2 kan være n = f 1 {s} follow(s) indeholder first(s)
VPG/Otto Knudsen27 follow Top-down-strategi follow(medlemsliste) = follow(medlem) = first({medlem}) = first(medlem) = {navn} follow(medlem) = follow(medlemsliste) = follow(medlem) = {navn} follow(navn) = first(fødselsår) = {fødselsår} follow(fødselsår) = first([kategori] semikolon) = {junior, senior, semikolon} follow(kategori) = first(semikolon) = {semikolon} follow(semikolon) = follow(medlem) = {navn} follow(junior) = follow(kategori) = {semikolon} follow(senior) = follow(kategori) = {semikolon}
VPG/Otto Knudsen28 Eksempel – first / follow Sportsklub-EBNF sportsklub = medlem {medlem}. medlem = navn junior semikolon | navn senior semikolon. Brikker: navn, junior, senior, semikolon Bottom-up: first(navn) = {navn} first(junior) = {junior} first(senior) = {senior} first(semikolon) = {semikolon} first(medlem) = {navn} first(sportsklub) = {navn} Top-down: follow(sportsklub) = Ø follow(medlem) = {navn} follow(navn) = {junior, senior} follow(junior) = {semikolon} follow(senior) = {semikolon} follow(semikolon) = {navn}
VPG/Otto Knudsen29 Krav til EBNF-grammatikken Krav 1 Lad n = f1|f2 så må der gælde, at first(f1) first(f2) = En EBNF opfylder krav 1, hvis alle produktionsregler med valgmuligheder opfylder krav 1
VPG/Otto Knudsen30 Krav til EBNF-grammatikken Krav 2 Hvis n kan være den tomme følge så må der gælde, at first(n) follow(n) = En EBNF opfylder krav 2, hvis alle produktionsregler, der kan være tomme opfylder krav 2
VPG/Otto Knudsen31 Krav til EBNF-grammatikken Hvis krav 1 og 2 ikke er opfyldte Omskriv EBNF’en vha. venstrefaktorisering Lav ny EBNF
VPG/Otto Knudsen32 Venstrefaktorisering Givet n = ff 1 | ff 2 |... | ff n | andet (valgmulighed med fælles præfix f ) Erstat n med følgende: n = f tmp | andet tmp = f 1 | f 2 |... | f n Gentag indtil alle produktionsregler er renset for valgmuligheder med fælles præfix Bemærk, at produktionsregler med { } og [ ] implicit indeholder en valgmulighed
VPG/Otto Knudsen33 Regelstyret indlæsning Baserer sig på 7 regler: Erklær en metode for hver produktionsregel/non-terminal [ ] medfører en if-sætning { } medfører en while-sætning | medfører en if-elseif-konstruktion Kan håndtere rekursive grammatikker
VPG/Otto Knudsen34 Tabelstyret indlæsning Tilstandstabel Indeholder tilstandsovergange Tilstandsovergange beskriver, hvilke tilstande der efterfølger den aktuelle tilstand ved givent inddata Aktionstabel Indeholder aktioner Aktioner beskriver, hvad programmet skal udføre i en given tilstand ved givent inddata