280 likes | 299 Vues
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
E N D
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 • Sammensætning af brikker til sætninger, som opfylder en velbeskrevet struktur (mønster)
EBNF – Elementer • En EBNF-grammatik består af • Produktionsregler • Terminaler • Nonterminaler • Startsymbol
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 • 3 metoder • Regelstyret indlæsning • Tabelstyret indlæsning • State Pattern • "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: Brikkens værdi: 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 rekursivGrammatik, 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
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 • Gør brug af tilstandstabel • Gør brug af aktionstabel • Gør brug af "Single Symbol Lookahead" • Krav 1 og 2 stilles til grammatikkerne • Kan ikke håndtere rekursive grammatikker
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