390 likes | 545 Views
Begreber og Redskaber 1. BRP. Syntaksbeskrivelse. Oversigt Formelle og naturlige sprog Syntaks, semantik, pragmatik Jernbanediagram og EBNF Genkendelse af sprog Videre perspektiv – historie, teori, resultater. Formål. Kunne læse syntaksbeskrivelse af Java
E N D
Syntaksbeskrivelse Oversigt • Formelle og naturlige sprog • Syntaks, semantik, pragmatik • Jernbanediagram og EBNF • Genkendelse af sprog • Videre perspektiv – historie, teori, resultater
Formål • Kunne læse syntaksbeskrivelse af Java • Nyttigt redskab i en værktøjskasse • Forstå hvad en syntaksbeskrivelse er • Se om tekster er syntaktisk korrekt • Skrive syntaks ud fra eksempler • Omskrive EBNF til jernbanediagram • Give et videre perpektiv • Historie • Videnskab mellem lingvistik og matematik
Sprog • Formelt vs. Naturligt sprog • Programmering sker i formelle sprog • Maskinel analyse af naturlige sprog er kompliceret aktivt forskningsfelt • Eksempler på formelle sprog • Telefonnumre • Email adresser • HTML dokumenter • Java programmer
Syntaks, semantik,.. • Syntaks • Hvilke sætninger må man skrive og hvordan hænger ordene sammen i sætninger • Semantik • Hvad betyder sætningerne i sproget • Pragmatik • Hvordan bruger man sproget i praksis • Idiomer (talemåder, fast vendinger)
Begreber • I Formelle sprog siger vi at • Et sprog er mængden af syntaktisk korrekte tekster i sproget • Et sprogs syntaks kan beskrives med en grammatik • Jernbanediagrammer og EBNF er eksempler på måder at angive grammatikker på • Tekster i det formelle sprog Java er altså de syntaktisk korrekte programmer
Jernbanediagrammer og EBNF • Email adresser • Om EBNF navn ”@” { navn ”.” } navn ”.” navn navn @ navn . navn
Notation • Terminaler: Det der skal stå direkte i tekster (f.eks. Dele af Javaprogram ) • I Jernbanediagram: • I EBNF f.ex. class • Nonterminaler: dele af tekster som forklares andetsteds i grammatikken • I Jernbanediagram • I EBNF Expression class Expression
Mer notation • EBNF udtryk bruger: • [ .. ] mulighed 0-1 • { .. } gentagelse 0-flere • (.. | .. ) valgmulighed • EBNF regler har ofte formen Nonterminal: udtryk1 udtryk2 Det skal læses som: (udtryk1 | udtryk2)
Fra EBNF til jernbanediagram • (Den anden vej er ikke helt så triviel) • udtryk1 udtryk2 (sammensætning) • {udtryk} (gentagelse 0-flere) • [udtryk] (mulighed 0-1) • (udtryk1 | udtryk2) (valg) udtryk1 udtryk2 udtryk udtryk udtryk1 udtryk2
Et Java Program public class A { public static void main(String[ ] args) { System.out.println(”Hello”); } }
Compilation Unit (Baseret på L&L – men som EBNF) Compilation Unit: [PackDecl] {ImportDecl} {TypeDeclaration} Vi vælger TypeDeclaration TypeDeclaration: ClassDeclaration InterfaceDeclaration Vi vælger ClassDeclaration
Class Declaration ClassDeclaration: {Modifier} classid ClassAss ClassBody Vi vælger en Modifier: public Vi vælger: public class AClassBody ClassBody: ”{” {ClassMember} ”}” Vi tager en enkelt: { ClassMember }
Et Java Program public class A { public static void main(String[ ] args) { System.out.println(”Hello”); } }
ClassMember ClassMember FieldDeclaration ConstructorDeclaration MethodDeclaration ClassDeclaration InterfaceDeclaration staticBlock Vi vælger MethodDeclaration
MethodDeclaration MethodDeclaration: {Modifier} (Type|void) id par thrw MethBody Modifier: public | private | protected | static | final | abstract | native | synchronized | transient | volatile Vi vælger: public static Vi vælger: void (ikke Type) og id: main
Et Java Program public class A { public static void main(String[ ] args) { System.out.println(”Hello”); } }
Parameters Par ”(” [ Typeid { ”,” Typeid } ] ”)” Vi vælger en enkelt med id: args Type: (PrimType | Name){ ”[” ”]” } Vi vælger: String[ ] Og får: (String[ ] args)
MethodBody MethBody: Block ”;” Block: ”{” {BlockStatement} ”}” BlockStatement: LocalVariableDeclaration ”;” Statement ClassDeclaration
Et Java Program public class A { public static void main(String[ ] args) { System.out.println(”Hello”); } }
Statement Statement: Block | ExpressionStatement | BasicAssignment | IfStatement | SwitchStatement | WhileStatement | DoStatement | ForStatement | ReturnStatement | ThrowStatement | TryStatement | SynchronizedStatement | EmptyStatement | BreakStatement | ContinueStatement | LabeledStatement
ExpressionStatement ExpressionStatement: Expression ”;” (Lige her er der et par små trykfejl i de to grammatikker: JLS har glemt ExpressionStatement, og L&L får begrænset Expression for meget)
Expression Expression: PrimaryExpression | Assignment | EqualityExpression | RelationalExpression | LogicalExpression | BitwiseExpression | ConditionalExpression | InstanceExpression | CastExpression | UnaryExpression Vi vælger PrimaryExpression
PrimaryExpression Primary: Primary1 { PrimSuffix } Primary1: Literal Name this super ”.” id ”(” Expression ”)” Allocation
Primary Name: Id {”.” Id } PrimSuffix: ”.” Id ”.” this ”.” class ”.” Allocation ”[” Expression ”]” Arguments
Arguments Arguments: ”(” [ Expression { ”,” Expression } ] ”)” Literal: IntegerLiteral | FloatingPointLiteral | CharacterLiteral | StringLiteral | BooleanLiteral | null StringLiteral: ””” { Character } ”””
Primary fortsat En mulighed for PrimaryExpression er derfor: Id {”.” Id} (Expression {”,” Expression}) Vi vælger System.out.println(”Hello”)
Et Java Program public class A { public static void main(String[ ] args) { System.out.println(”Hello”); } }
Afledning: Syntakstræ Compilation Unit: [PackDecl] {ImportDecl} {TypeDeclaration} ClassDeclaration class A{ClassBody}
EBNF • Extended Backus Naur Form • 1963: Brugt i Algol rapport (Peter Naur ed.) John Backus medforfatter. (De brugte en simplere version uden ”{” og ”}”) • Variant af Kontekst-fri grammatikker (Chomsky 1956) • Variant brugt af Panini, indisk grammatiker ca. 300 BC, til beskrivelse af Sanskrit
Regulære udtryk • Regulære udtryk er en variant af EBNF hvor man kun har et udtryk og ikke mulighed for ekstra regler • Kendes fra søgninger i mange tekstbehandlingssystemer • Bruger ofte lidt andre symboler: • ( .. )* betyder gentag 0-flere gange • ( .. )+ betyder gantag 1-flere gange • ( .. )? betyder mulighed 0-1
Chomsky hierarkiet • Type 0 sprog: Uindskrænkede sprog (sprog med en formel syntaks) • Type 1 sprog: Kontekst-følsomme sprog (hvad der må stå hvor i tekster afhænger af kontekst) • Type 2 sprog: Kontekst-frit sprog (sprog der kan beskrives med EBNF eller tilsv.) • Type 3 sprog: Regulære sprog (sprog der kan beskrives ved en enkelt regel i EBNF eller tilsv. Dvs. regulære udtryk)
Chomsky • Noam Chomsky: lingvist og samfundsdebatør (f. 1928) • Chomsky hierarkiet er fra 1956 og primært tænkt til beskrivelse af naturlige sprog (vha transformationsgrammatikker..)
Et par resultater • Sproget: ”ab”,”aabb”,”aaabbb”,... er kontekstfrit men ikke regulært. • Sproget: ”abc”,”aabbcc”,”aaabbbccc”,.. er ikke kontekstfrit men kontekstafhængigt. Sprog1: ab aSprog1b
Et par resultater • Der findes ingen generelle teknikker til at undersøge om to EBNF’er beskriver samme sprog (Det kan bevises at en sådan teknik heller ikke kan findes!) • En sådan teknik findes for regulære udtryk.
Hvad kan det bruges til? • Regulære udtryk → søgninger i store datamængder • Genkendelse kan klares af endelige automater (uden hukommelse) • Kontekst fri sprog → oversættere • Genkendelse kræver hukommelse • Særligt effektive genkendere findes for klasser af kontekst-fri grammatikker (LL(1), LALR(1),..) • De kan konstrueres automatisk ud fra grammatikken (YACC, Bison, Antlr)
Afrunding • EBNF og Jernbanediagrammer er redskaber til at beskrive tekster i formelle sprog • Undersøge om en given tekst hører til sproget: Genkendelse, afledning • Afklare hvad der er korrekt Java