Syntax/semantics - I Program <> program execution Compiling/interpretation Syntax Classes of langauges Regular langauges Context-free langauges Scanning/Parsing Meta models INF 3/4-25 8/29/25
Program <> program execution Syntax Semantics INF 3/4-25 8/29/25 2
Syntax <> Semantics A description of a programming language consists of two main components: Syntactic rules: what form does a legal program have Semantic rules: what the sentences in the langauge mean Static semantics: rules that may be checked by the compile before the execution of the program, eg: All variables must be declared Declaration and use of variables coincide (type check) Dynamic semantics: rules saying what shall hapen during (as part of) the execution of the program, eg In terms of an operational semantics, that is a semantics that describes the behaviour of a (idealised) abstract prosessor/machine performing a program INF 3/4-25 8/29/25 3
Programming/Modeling Programming Real World/ Problem/ Program Programming Machine Program execution INF 3/4-25 Program Machine Program execution 8/29/25 4
Compiling/interpretation An interpreter reads a program and simulates its operations Program Data Interpreter Data A compiler/ translator translates a program to another language, typically a machine language or to a language for a virtual machine Program Compiler/ Translator Data Program Interpreter/ Machine Data INF 3/4-25 What do we need to know in both cases? Syntax and semantics of the language 8/29/25 5
Hvordan beskrive syntaks I BNF-grammatikk <tall> - <siffer> <tall> <sifffer> <siffer> <sifre> <siffer> <sifre> <sifre> <sifre> <sifre> <sifre> <sifre> Syntaksdiagram ( jernbanediagram ) tall INF 3/4-25 - 8/29/25 6
Utvidet BNF (Extended BNF) I utvidet BNF kan vi bruke følgende metasymboler i høyresiden: skiller alternativer? angir at noe kan forekomme eller gang * angir at noe kan forekomme eller flere ganger + angir at noe kan forekomme eller flere ganger {} grupperer symboler INF 3/4-25 <tall> - <siffer> <sifffer> <siffer> <sifre> <sifre> <sifre> <sifre> <sifre> <tall> {-}?{ }+ 8/29/25 7
Hvordan beskrive syntaks II Ikke-deterministiske automater Deterministiske automater INF 3/4-25 8/29/25 8
Eksempel BNF-grammatikk produksjon (production, rule) <> <term> venstrerekursjon Syntaksdiagram <> + <term> <term> <term> * navn navn + term grunnsymbol (terminals) metasymbol (non-terminals) INF 3/4-25 term term term * navn navn 8/29/25 9
Avledning av setninger (Derivation of sentences) De mulige setningene i et språk definert av en BNF-grammatikk er nøyaktig de som fremkommer ved å benytte følgende prosedyre: Start med startsymbolet 2 For hvert metasymbol, erstatt dette med et av alternativene på høyresiden i den tilhørende definisjonen 3 Gjenta forrige punkt til vi står igjen med bare grunnsymboler Dette kalles for en avledning (derivation) fra startsymbolet til en ferdig setning, og kan representeres som et syntakstre (syntax tree) INF 3/4-25 term venstreavledning term navn * navn + navn 8/29/25
Entydige/flertydige grammatikker Dersom enhver setning i språket kan avledes ved ett og bare ett syntakstre, er grammatikken entydig (unambiguous), ellers er den flertydig (ambiguous) <> navn <> + <> <> * <> INF 3/4-25 navn + navn * navn navn + navn * navn 8/29/25
Språktyper og syntaksanalyseteknikker Regulære språk (type 3-språk) En BNF-grammatikk med ett metasymbol på venstresiden og kun grunnsymboler på høyresiden, eventuelt med et metasymbol til slutt Kan analyseres med ikke-deterministiske og deterministiske automater Kontekstfrie språk (type 2-språk) En BNF-grammatikk med bare ett metasymbol på venstresiden Nesten alle programmeringsspråk er av denne typen Kan analyseres med parsere (syntakstolkere) Type -språk («kontekst-sensitive») krever at høyresiden er minst like lang som venstresiden Dette gjør det mulig å sjekke navnebindinger og finne typefeil Ble brukt til Algol-68, men lite siden Type -språk har ingen restriksjoner Disse har bare teoretisk interesse INF 3/4-25 8/29/25 2
Bruk av deterministisk automat En deterministisk automat brukes typisk for å sjekke om en gitt streng er med i det aktuelle regulære språket eller ikke: INF 3/4-25 8/29/25 3
Bruk av deterministiske automater Hva hvis strengen ikke er med i språket? INF 3/4-25 8/29/25 4
Hvordan lage en deterministisk automat? En deterministisk automat (D-automat) er lett å bruke, men ikke nødvendigvis så intuitiv å forstå eller lage Fra et regulært (evt via et jernbanediagram) er det imidlertid ganske lett å lage en ikke-deterministisk automat (ID-automat) Kan ha: Tomme kanter (såkalte -kanter) Flere kanter fra samme node med samme symbol INF 3/4-25 Deretter kan vi bruke en standard-algoritme for å gjøre om IDautomaten til en D-automat 8/29/25 5
Example <tall> <FP> <IFP> <tall> { { }* } {{ }+ }? <IFP> <IFP> <IFP> <FP> <FP> <EP> <EP> <EP> <EP> Allowed words are INF 3/4-25 However, not allowed with leading or decimalpoint without preceeding or following ciffers, so the following is not allowed: 8/29/25 6
Parse tree tall IFP IFP FP INF 3/4-25 EP 8/29/25 7
Fra jernbanediagram til ID-automat Hver pens blir til en node i ID-automaten 2 Linjene (med eventuelle symboler) blir merkede kanter mellom nodene Noen kanter får et tomt symbol () 3 Merk nodene hvor man skal begynne og slutte INF 3/4-25 8/29/25 8
Eksempel INF 3/4-25 8/29/25 9
8/29/25 2 INF 3/4-25 Fra ikke-deterministisk til deterministisk automat Ikkedeterministisk: Deterministisk: a, a, a, a, a, a,b, a, a,b, a, a,b, a, a,b, a, a,b, a, a,b, a, a,b, c a, a,b, c a, a,b, c a, a,b, c a, a,b, c c,d, a, a,b, c c,d, a, a,b, c c,d, a, a,b, c c,d, a, a,b, c c,d, a b c d 2 3 4 5
As a table 2 3 4 5 error 2 error 3 5 5 3 error 3 5 5 error 4 4 error error INF 3/4-25 end ok ok 8/29/25 2
Sjekkalgoritme Gitt en slik tabell t, finnes det en enkel sjekkalgoritme: tilstand := ; while <flere tegn igjen> do begin c := <neste tegn>; tilstand := t(tilstand,c); end while; if ok(tilstand) then <match funnet> else <ingen match>; Oppsummering: Hvordan lage raske sjekkprogrammer: Sett opp en ikke-deterministisk automat for det regulære et Lag en deterministisk automat ut fra den ikke-deterministiske automaten Sett opp tilstandstabellen t Bruk søkeløkken over til å sjekke input mot et INF 3/4-25 8/29/25 22
Enkel forklaring på kompilering/interpretering Ved å legge inn programsetninger for å generere kode eller kalle på rutiner får vi henholdsvis en kompilator eller en interpreter tilstand := ; while <flere tegn igjen> do begin c := <neste tegn>; tilstand := t(tilstand,c); // generering av kode (kompilering) eller // kall på rutiner (interpretering) end while; if ok(tilstand) then <match funnet> else <ingen match>; INF 3/4-25 8/29/25 23