340 likes | 466 Views
VPR - Repetition. Trådning Distribueret Programmering Sprogteori Grafer. Sproghistorie. Syntaks (struktur) Semantik (Indhold). Sproghistorie. Sprog Lavniveau (maskinkode)
E N D
VPR - Repetition • Trådning • Distribueret Programmering • Sprogteori • Grafer
Sproghistorie • Syntaks (struktur) • Semantik (Indhold)
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
Sprogteori – Kompiler • Kompiler • Kildekode –> Kompiler –> Binær kode
Sprogteori – Kompiler • Kompilertyper • Single Pass • Multi Pass • Load and go • Debugging • Optimering
Sprogteori – Kompiler • Kompiler • Analyse (nedbryde) • Leksikalsk analyseScanning, Tokenizing • Syntaksanalyse– ParsingHierarkisk analyse, • Semantisk analyse • Syntese (sammensætte)
Sprogteori – EBNF • BNF • Backus-Naur-Form • EBNF • Extended Backus-Naur-FormUdvidet med { } og [ ] • Findes i flere varianter
Sprogteori - Analyse • Leksikalsk analyse • Opsplitning af input i brikker • Syntaksanalyse – Parsing • Samling af brikker til sætninger, som opfylder en velbeskrevet struktur (mønster)
EBNF – Elementer • En EBNF-grammatik består af • Terminaler • Nonterminaler • Startsymbol • Produktionsregler
EBNF – Produktionsregler • Produktionsregler • Afsluttes med punktum • | betegner valgmuligheder • { } betegner nul eller flere gentagelser • [ ] betegner nul eller én forekomst • ( ) anvendes til at samle enheder
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"|.
EBNF • EBNF-grammatikken • Syntaktiske reglerBeskriver, hvordan ”byggeklodserne” sammensættes • Semantiske reglerBeskriver hvilke sammensætninger, der giver mening
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!
Syntaksstyret indlæsning • 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
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
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
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
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 = navnfødselsår [kategori] semikolon. kategori = junior|senior. Valgte brikker semikolon, navn, fødselsår, junior, senior, andet, slut
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 [punktumheltal]. fortegn = plus | minus. Valgte brikker komma, heltal, punktum, plus, minus, andet, slut
EBNF – Produktionsregler • Typer af produktionsregler • RekursivRegel, der beskrives vha. sig selv • RegulærRegel med gentagelser { } • SimpelAlle andre regler
EBNF-grammatikker • Typer af EBNF-grammatikker • Direkte rekursivGramatik, der indeholder en rekursiv produktionsregel • Indirekte rekursivGrammatik, der indeholder en produktionsregel, der anvender en non-terminal, der andetsteds direkte eller indirekte refererer til reglen • RegulærEj-rekursiv grammatik, der indeholder regulære produktionsregler • SimpelAlle andre grammatikker
Regelstyret indlæsning • Betegnelser • f, f1, f2, … , fn 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
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
first • first(b) = {b} • first() = • n = f1f2 • first(n) = first(f1f2) = first(f1), f ≠ • first(n) = first(f1f2) = first(f1) first(f2) • n = f1|f2 • first(n) = first(f1|f2) = first(f1) first(f2) • n1 = [f1] • first(n1) = first(|f1) = first(f1) • n2 = [f1] • first(n2) = first(|f1n2) = first(f1)
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}
follow • follow(startsymbol) = • n = f1sf2n = f1[s]f2n = f1{s}f2 • follow(s) indeholder first(f2) • follow(s) indeholder follow(n), hvis f2 kan være • n = f1{s} • follow(s) indeholder first(s)
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}
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}
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
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
Krav til EBNF-grammatikken • Hvis krav 1 og 2 ikke er opfyldte • Omskriv EBNF’en vha. venstrefaktorisering • Lav ny EBNF
Venstrefaktorisering • Givet n = ff1 | ff2| ... | ffn | andet(valgmulighed medfælles præfix f) • Erstat n medfølgende: n = f tmp | andet tmp = f1 | f2 | ... | fn • Gentag indtil alle produktionsregler er renset for valgmuligheder med fælles præfix • Bemærk, at produktionsregler med { } og [ ] implicit indeholder en valgmulighed
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
Tabelstyret indlæsning • 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