Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avAlexandra Håkansson
1
Växjö 22 april -04Språk & logik: Parsning med kontextfria grammatiker1 DAB760:Språk och logik: 22 aprilParsning Leif Grönqvist (leif.gronqvist@msi.vxu.se) Växjö Universitet (MSI) GSLT (Sveriges nationella forskarskola i språkteknologi) Göteborg Universitet (Institutionen för lingvistik)
2
2Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Dagens föreläsning Lite om ambiguitet som inte hanns med igår Parsning I allmänhet Recursive-Descent-parsning Problem Tabelldriven parsning
3
3Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Ambiguitet För uttrycket 1+2+3 finns två olika parsträd: 1+2 + 3 Eftersom det finns uttryck som kan beskrivas av flera olika parsträd så är grammatiken ambiguös Att en grammatik är icke-ambiguös är mycket svårt att bevisa Problem kan uppstå om evaluering av uttryck i språket blir olika beroende på parsträd: 1-2+3 if a then if b then c else d
4
4Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Icke-ambiguös grammatik för aritmetiska uttryck Vi lägger till nya syntaktiska kategorier för termer och faktorer: 1. + | - | 2. * | / | 3. ( ) | 4. | 5. 1|2|3|4|5|6|7|8|9|0 e=expression, t=term, f=factor, n=number, d=digit Regel 1 och 2 garanterar att 1-2+3 och 1/2*3 grupperas korrekt
5
5Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Parsning Vi vill lösa två olika uppgifter Givet en kontextfri grammatik G vill vi klara: Igenkänning: avgör om en sträng s є Σ T * ingår i språket L(G) Parsning: bygg upp ett parsträd för s om s є L(G) Vi har sett hur parsträdet kan se ut men inte hur man systematiskt kan konstruera det Vi skall titta på två parsningsalgoritmer som inte klarar riktigt alla kontextfria grammatiker Att klara alla CFG går men algoritmerna är långsammare (CYK, Earley) En annan känd algoritm är LR-parsning (Left to Right)
6
6Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Recursive-Descent-parsning Fungerar top-down Metoden bygger på idén att göra en funktion för varje icke-terminal-symbol Denna funktion skall avgöra om en sträng kan härledas från sin symbol och göra ett parsträd Fungerar bara för vissa typer av grammatiker (inte så allvarligt – se lite senare)
7
7Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Recursive-Descent, algoritmen för igenkänning Strängen som skall parsar finns i x 1 …x n NextTerminal innehåller x i, den senast inlästa symbolen s Σ N finns en funktion f s som: Returnerar True om x i …x j kan härledas från s Sätter NextTerminal till x j+1 Igenkänning av x 1 …x n som en s (startsymbolen) sker genom att anropa f s Om svaret blir True och NextTerminal är x n+1 så ingår x 1 …x n i språket, annars inte
8
8Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Recursive-Descent-igenkänning, algoritmens funktioner f s där s är en icke-terminal symbol med m produktionsregler (exklusive en eventuell s ε) kan konstrueras enligt: m-1 if-satser efter varandra: if(cond 1 ) { }; if(cond 2 ) { }; if(cond m ) { }; Om s ε finns returneras true, annars false
9
9Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Recursive-Descent-parsning, algoritmens funktioner, forts. if-satsen som svarar mot s x 1 …x k matchar symbolerna x 1 …x k enligt: Om x i är en terminal symbol: om x i =NextTerminal fortsätt till nästa symbol, annars returnera false Om x i är en icke-terminal t: om f t returnerar true så fortsätt, annars returnera false Om x 1 …x k matchats returneras true
10
10Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Funktionen för “faktor”- projektionen Pseudokoden svarande mot: ( ) | Boolean function factor(void) { if(*NextTerminal==‘(‘)) { NextTerminal++; if(expr()) { return *NextTerminal==‘)’; } else return false; } if(num()) return true; return false; }
11
11Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Recursive-Descent-parsning Liknar igenkänningsalgoritmen men funktionerna modifieras: De skall returnera träd istället för boolean (misslyckad parsning returnerar NULL) Rotnoden skapas som A och svarar mot en projektion s x 1 …x n, och har n barn: Om x i är en terminal så skapas barn i som ett löv med etiketten x i. Om x i är en icke-terminal så är barn i det träd som returneras av f x i
12
12Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Funktionen för “faktor”- projektionen (parsning) Pseudokoden svarande mot: ( ) | Tree *function factorTree(void) { if(*NextTerminal==‘(‘)) { NextTerminal++; if(expr()) { if(*NextTerminal==‘)’) return node3(“factor”, node0(‘(‘), expTree(), node0(‘)’)); else return NULL; } else return NULL; } if(num()) return node1(“factor”, numTree()); return NULL; }
13
13Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Funktionen för “balanced”- projektionen (parsning) Pseudokoden svarande mot: ε, ( balanced> ) Tree *function balancedTree(void) { if(*NextTerminal==‘(‘)) { NextTerminal++; if(balanced()) { if(*NextTerminal==‘)’) { if(balanced()) return node4(“balanced”, node0(‘(‘), balancedTree(), node0(‘)’), balancedTree()); else return NULL; } else return NULL; } return node0(””); }
14
14Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Exempel på Recursive-Descent- parsning Svårt att handexekvera rekursiva funktioner… I boken finns exempel 11.9 som är rätt bra, med tillhörande riktig C-kod 1. ε 2. ( balanced> ) | Parsa: ( ) ( ) ENDM
15
15Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Problem med Recursive-Descent- parsning Vänster-rekursion får inte förekomma, dvs regler av typen s s x 2 …x n Dessa skulle leda till oändlig rekursion Den vänsterrekursiva regeln a | b kan skrivas om som två regler: b och a | ε Valet av produktion för en icke-terminal måste vara entydigt bestämd av första symbolen i kroppen. Problem: → | Kan skrivas om som: → → | ε
16
16Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Tabelldriven parsning Den stora nackdelen med Recursive-Descent- parsning är att man måste skriva ett nytt program för varje grammatik En tabelldriven parser lagrar grammatiken i en tabell men programmet är samma för alla grammatiker Två strukturer behövs: En (tvådimensionell) tabell T: En rad för varje icke-terminal symbol En kolumn för varje symbol s som kan inleda en sträng, härledbar från en icke-terminal symbol Produktionsregler i cellerna En stack för återstående symboler att matcha
17
17Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Tabelldriven parsning, algoritmen 1.Först läggs startsymbolen på stacken och NextTerminal är första symbolen i strängen som skall parsas 2.Om stacken inte är tom så poppas översta symbolen på stacken x: 1.Om x är en terminal så matchas den mot NextTerminal, om lika så läser vi nästa symbol i strängen, annars misslyckas parsningen 2.Om x är en icke-terminal så slås x, NextTerminal upp i T. Om platsen är tom så misslyckas parsningen, annars om x x 1 …x n hittas så läggs x n …x 1 på stacken (x 1 hamnar överst). 3.Om strängen är slut och stacken tom så lyckas parsningen annars misslyckas den
18
18Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Exempel på tabelldriven parsning På sidan 627 i boken finns i fig 11.33 en grammatik: 1. w c 2. { 3. s ; 4. 5. } Tabellen T blir: Låt oss testa att parsa: {w c s ; s ; } END wc{}s;END 123 4454
19
19Språk & logik: Parsning med kontextfria grammatikerVäxjö 22 april -04 Reguljära uttryck (RE) vs. kontextfria grammatiker (CFG) I boken finns bevis för att: Varje språk som kan beskrivas av ett RE kan också beskrivas av en CFG I beviset gås varje konstruktion i RE igenom för att visa att man kan skapa en CFG för ett godtyckligt RE RE är inte tillräckligt kraftfullt för att beskriva alla språk som kan beskrivas av en CFG Se exempelvis på det oändliga språket: {01, 0011, 000111, …} Beskrivs som CFG: 0 1 | 01
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.