F. Drewes, Inst. f. datavetenskap1 Föreläsning 5: Syntaxanalys (parsning) Syntaxanalysens mål Tillvägagångssätt och komplexitet Syntaxanalys i bilder Top-down-syntaxanalys Lookahead Bottom-up-syntaxanalys
F. Drewes, Inst. f. datavetenskap2 Syntaxanalysens mål kolla syntaktisk korrekthet parserns mest grundläggande uppgift bygga ett deriveringsträd (explicit eller implicit) trädet används senare för att översätta/interpretera programmet om möjligt, fortsätta med analysen efter att fel upptäckts programmeraren behöver inte göra 387 kompileringsförsök om det finns 386 fel ge nyttiga felmeddelanden vilket ställe tycks vara fel? vad förväntades där? vanliga åtgärder (om felet är ett ”standardfel”)
F. Drewes, Inst. f. datavetenskap3 Tillvägagångssätt och komplexitet Nivåer lexikalisk/kontextfri hittas igen i parserns struktur lexikalisk analys=rutiner som läser inputsträngen och producerar token =en ändlig automat (i princip) kontextfri analys= rutiner som läser token och bygger upp deriveringsträdet Kontextfri analys brukar göras top-down eller bottom-up top-down börjar i deriveringsträdets rot (arbetar framåt) bottom-up börjar i deriveringsträdets löv (arbetar bakåt) Komplexitet är viktig i allmänhet O(n 3 ) för kontextfria språk (som ofta är för hög) O(n) för LL- och LR-grammatiker
F. Drewes, Inst. f. datavetenskap4 EQ_SIGN syntaxanalys (operativsystem) lexikalisk analys void advance() (nextToken) kontextfri analys …; count = count + 1; … ? ? top-down ! regelns högersida IDENTIFIER syntaxanalys (operativsystem) lexikalisk analys void advance() (nextToken) kontextfri analys …; count = count + 1; … top-down INTEGER syntaxanalys (operativsystem) lexikalisk analys void advance() (nextToken) kontextfri analys bottom-up …; count = count + 1; … ? INTEGER syntaxanalys (operativsystem) lexikalisk analys void advance() (nextToken) kontextfri analys bottom-up …; count = count + 1; … ! SEMICOLON syntaxanalys (operativsystem) lexikalisk analys void advance() (nextToken) kontextfri analys …; count = count + 1; … bottom-up ? SEMICOLON syntaxanalys (operativsystem) lexikalisk analys void advance() (nextToken) kontextfri analys …; count = count + 1; … bottom-up Syntaxanalys i bilder
F. Drewes, Inst. f. datavetenskap5 Top-down-syntaxanalys (exempel) Varje icketerminal blir en rutin: void S() { P(); while (lex.nextToken {PLUS, MINUS}) { lex.advance(); P(); } } void P() { F(); while (lex.nextToken {TIMES, DIVIDE}) { lex.advance(); F(); } } void F() { S P { ( | ) P } P F { ( | ) F } F | ( S ) EBNF (extended Backus-Naur form) {…}= får upprepas 0,1,2,… gånger …|…= val mellan alternativ if (lex.nextToken==NUMBER) lex.advance(); else if (lex.nextToken==RIGHT_PAR) { lex.advance(); S(); if (lex.nextToken==LEFT_PAR) lex.advance(); else error(”missing ‘)‘”); } else error(“number or ‘(‘ expected”); }
F. Drewes, Inst. f. datavetenskap6 Top-down: För- och nackdelar Fördelar lätt att implementera (även för hand) snabb (dvs linjär) oftast är LL-grammatikklassen tillräckligt stor Nackdelar grammatiken får inte vara vänsterrekursiv (egentligen behövs ”lookahead k”; oftast krävs k=1) LR-grammatikklassen (som bottom-up-analys bygger på) är större än LL-grammatikklassen
F. Drewes, Inst. f. datavetenskap7 Lookahead STMT ( CALL | ASSIGN ) { ; STMT } CALL ( PARAM ) ASSIGN = EXPR PARAM … EXPR … i (???) måste vi kolla toknet efter nextToken (´(´ eller ´=´) lookahead är 2, grammatiken är en LL(2)-grammatik En LL-grammatik är en LL(1)-grammatik void STMT() { if (???) CALL(); ELSE ASSIGN(); while (lex.advance==SEMICOLON) { lex.advance(); STMT(); } }
F. Drewes, Inst. f. datavetenskap8 Bottom-up-syntaxanalys Inputsträngen reduceras till startsymbolen genom att använda reglerna bakåt Det som ännu inte kan reduceras (plus ytterligare statusinformation) lagras på en stack Två typer av steg: ´shift´ och ´reduce´ Vad som görs i varje steg beror på de översta symbolerna på stacken och nextToken ( LR(1)) Informationen om vad som ska göras finns i tabellerna ´action´ och ´goto´ Nackdel: Allmän LR-parsning (Knuth, 1965) kräver för stora tabeller ytterligare restriktioner behövs