Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 1 Föreläsning 4: Syntaxdefinition Formell syntaxdefinition Lexikalisk och kontextfri syntax Flertydighet i kontextfri syntax Syntaxgrafer
Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 2 Formell syntaxdefinition Syntaxen för ett språk definierar mängden av alla strängar som betraktas som program (där man bortser från betydelsen). Man skiljer alltså syntaxen (formen) från semantiken (betydelsen) Syntaktisk korrekthet är nödvändig men inte tillräcklig för semantisk korrekthet Att definiera syntax är betydligt enklare än att definiera semantik
Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 3 Formell syntaxdefinition Ett programspråk är ett formellt språk syntaxen kan definieras formellt (=otvetydigt), t.ex. med grammatiker Fördelar med en formell syntaxdefinition är exakt ”standard” för datavetare, alla vet hur den ska läsas kompatibla kompilatorer automatisk generering av kompilatorer inget tvivel om korrekthet/inkorrekthet av program algoritmer och resultat från teorin för formella språk kan användas gör det enklare att definiera semantiken
Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 4 Lexikalisk och kontextfri syntax Syntaxdefinitioner brukar delas upp i två nivåer: lexikalisk syntax kontextfri syntax Den lexikaliska nivån består av enkla syntaktiska kategorier för identifierare, tal, nyckelord, … Centrala begrepp: token= en av kategorierna(t.ex. integer) lexem= en sträng i en av kategorierna(t.ex. 5317) På den kontextfria nivån behandlas de syntaktiska kategorierna som har en högre komplexitet (satser, uttryck, …)
Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 5 lexem (token IF_TOKEN) lexem (token LEFT_PAR) lexem (token IDENTIFIER) lexem (token LESS_THAN) lexem (token INTEGER) Exempel uttryck sats reguljära språk lexem (token IF_TOKEN) lexem (token LEFT_PAR) lexem (token IDENTIFIER) lexem (token LESS_THAN) lexem (token INTEGER) kontextfria språk satsuttryck sats if ( count < 3 * x ) { count++; x = x / 2; }
Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 6 Flertydighet Den kontextfria syntaxen är flertydig om det finns ett program som har fler än ett deriveringsträd (= fler än en vänsterderivering) Vänsterderivering = derivering där man i varje steg ersätter den första icketerminalen i strängen En flertydig grammatik är inte felaktig i sig men ger upphov till problem när semantiken definieras Exempel: * | + | |
Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 7 Flertydighet (2) Några vanliga tekniker för att undvika flertydighet Bindningsregler t.ex. ^ binder starkare än * som binder starkare än + Höger- eller vänsterassocierande operatorer t.ex. a + b + c betyder (a + b) + c eftersom + associerar till vänster Parenteser t.ex. (a + b) * (a + c) för att sätta bindningsreglerna ur kraft
Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 8 Syntaxgrafer (ett exempel) Syntaxgrafer är ekvivalent med kontextfria grammatiker. Adas if-then-else: ifthen else end if; condstmts else_ifstmts if_stmt cond stmts else_if terminal icketerminal
Lennart Edblom, Frank Drewes, Inst. f. datavetenskap 9 Extended BNF Några vanliga tekniker för kompaktare grammatik Valfrihet markeras med [ ] IF -> if E then S [else S] Upprepning (noll eller fler ggr) IDLIST -> ID {, ID} Val (en av) T -> T (* | / | %) F