Grundläggande datalogi - Övning 9



Relevanta dokument
Föreläsning 7: Syntaxanalys

Reguljära uttryck Grammatiker Rekursiv nedåkning Allmänna kontextfria grammatiker. Syntaxanalys. Douglas Wikström KTH Stockholm

Grundläggande datalogi - Övning 1

Parsning. TDP007 Konstruktion av datorspråk Föreläsning 6. Peter Dalenius Institutionen för datavetenskap

Inlämningsuppgift MiniPlotter

Övning 6. Komprimering, kryptering, dokumentering & testning

Automatateori (2) Idag: Sammanhangsfria språk. Dessa kan uttryckas med Grammatik PDA

Föreläsning 9: Turingmaskiner och oavgörbarhet. Turingmaskinen. Den maximalt förenklade modell för beräkning vi kommer använda är turingmaskinen.

Programkonstruktion och Datastrukturer

Träd och koder. Anders Björner KTH

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

i=1 c i = B och c i = a i eller c i = b i för 1 i n. Beskriv och analysera en algoritm som löser detta problem med hjälp av dynamisk programmering.

Klassdeklaration. Metoddeklaration. Parameteröverföring

Objektorienterad programmering

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

Språket Python - Del 2 Grundkurs i programmering med Python

HI1024 Programmering, grundkurs TEN

Grundläggande logik och modellteori

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Mer källkod. Styrstrukturer Val Slingor Operatorer Källkodsexempel med minne. Erik Forslin. Rum 1445, plan 4 på Nada

Idag: Reguljära språk Beskrivs av Reguljära uttryck DFA Grammatik

Dynamisk programmering

Programdesign. minnesutrymme storlek på indata. DA2001 (Föreläsning 15) Datalogi 1 Hösten / 20

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Introduktion till programmering SMD180. Föreläsning 7: Strängar

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Tommy Färnqvist, IDA, Linköpings universitet. 2 Strukturer Domäner Tolkningar... 3

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

729G75: Programmering och algoritmiskt tänkande. Tema 1. Föreläsning 1 Jody Foo

Övning 6 - Tillämpad datalogi 2012

Backcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet

Föreläsning 2 5/6/08. Reguljära uttryck 1. Reguljära uttryck. Konkatenering och Kleene star. Några operationer på språk

Dynamisk programmering

Kompilatorer och interpretatorer

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Turingmaskiner och oavgörbarhet. Turingmaskinen. Den maximalt förenklade modell för beräkning vi kommer använda är turingmaskinen.

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

Programdesign. Dokumentera. Dokumentera

DD1361 Programmeringsparadigm. Carina Edlund

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Block 2 Algebra och Diskret Matematik A. Följder, strängar och tal. Referenser. Inledning. 1. Följder

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Övning 5 - Tillämpad datalogi 2013

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Programmering A. Johan Eliasson

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13:15

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Programmering i C. Christer Sandberg, Gunilla Eken, Stefan Bygde Olof Andersson Linus Källberg Caroline Uppsäll Johan Hägg

Definition. Mängden av reguljära uttryck på alfabetet Σ definieras av. om α och β är reguljära uttryck så är (α β) ett reguljärt uttryck

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

Viktiga begrepp. Algoritm. Array. Binärkod. Blockprogrammering. Bugg / fel och felsökning. Dataspel. Dator

Formell logik Kapitel 1 och 2. Robin Stenwall Lunds universitet

Tentamen i kurserna Beräkningsmodeller (TDA181/INN110) och Grundläggande Datalogi (TDA180)

Multipel tilldelning. Introduktion till programmering D0009E. Föreläsning 6: Iteration. while-satsen. Kom ihåg. Snurror kontra rekursion

Tekniker för storskalig parsning: Grundbegrepp

Om semantisk följd och bevis

Praktisk hantering av automatiserade testfall T U A C A P T M F T W!

Föreläsning 2 Programmeringsteknik och C DD1316

kind spelling Scanning

Formell logik Kapitel 9. Robin Stenwall Lunds universitet

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

Föreläsning 7: Syntaxanalys

Tentamen i Introduktion till programmering

Grammatik. BNF-grammatik

Introduktion till programmering och Python Grundkurs i programmering med Python

Föreläsning 5: Modellering av frasstruktur. 729G09 Språkvetenskaplig databehandling Lars Ahrenberg

BER AKNINGSBARHET F OR DATALOGER. Kent Petersson. Institutionen for Datavetenskap Goteborgs Universitet / Chalmers Goteborg, Sweden

TDDC74 Lab 02 Listor, sammansatta strukturer

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

DD1314 Programmeringsteknik

Tentamen , Introduktion till Java, dtaa98, dtea53

MÖNSTER OCH TALFÖLJDER

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

HI1024 Programmering, grundkurs TEN

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

PROV I MATEMATIK Automatateori och formella språk DV1 4p

Uppgift 1 (grundläggande konstruktioner)

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

10. Mängder och språk

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Inlämningsuppgift : Finn. 2D1418 Språkteknologi. Christoffer Sabel E-post: csabel@kth.se 1

7, Diskreta strukturer

Konstruktion av datorspråk

Primitivt rekursiva funktioner och den aritmetiska hierarkin

Programmeringsteknik med C och Matlab

729G09 Språkvetenskaplig databehandling

Laboration: Whitebox- och blackboxtesting

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Np MaB vt Låt k = 0 och rita upp de båda linjerna. Bestäm skärningspunkten mellan linjerna.

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Alfabeten, strängar och språk. String

Planering av ett större program, del 2 - for och listor. Linda Mannila

Transkript:

Grundläggande datalogi - Övning 9 Björn Terelius January 30, 2009

Ett formellt språk är en (oftast oändlig) mängd strängar. Språket definieras av en syntax som är en samling regler för hur man får bilda giltiga strängar. Om syntaxen inte är alltför komplicerad kan den beskrivas i BNF (). Till exempel definieras syntaktiskt giltiga kemiska formler av <formel> ::= <mol> \n <mol> ::= <group> <group><mol> <group> ::= <atom> <atom><num> (<mol>)<num> <atom> ::= <LETTER> <LETTER><letter> <LETTER> ::= A B C... Z <letter> ::= a b c... z <num> ::= 2 3 4...

Syntaxanalys/parsning ska: undersöka om strängen är giltig översätta strängen till intern representation (ofta ett träd) Ofta kan man i stort sett mekaniskt konstruera en parser från grammatiken genom att för varje symbol skriva en inläsningsfunktion som rekursivt anropar de inläsningsfunktioner som specificeras i grammatiken. Den här formen av parsning kallas rekursiv medåkning (recursive descent).

Betrakta följande enkla grammatik för en viss sorts satser. <Mening> ::= <Sats>. <Sats><Konj><Mening> <Sats> ::= <Subj> <Pred> <Subj> ::= JAG DU <Pred> ::= VET TROR <Konj> ::= ATT OCH Vilka av följande meningar är korrekta (enligt syntaxen) DU VET. DU TROR ATT DU VET DU VET OCH JAG VET. JAG OCH DU TROR ATT JAG VET.

De 5 omskrivningsreglerna behöver var sin inläsningsfunktion. För <Mening> kan den t.ex. se ut på följande sätt: def read_mening(q): read_sats(q) if q.peek()=='.' q.get() else: read_konj(q) read_mening(q) Hur ser de andra funktionerna ut?

Den bruna gladan är ovanlig i Sverige, men häckar emellanåt i Skåne. Lätet är ett skriande HYHYHYHYHIHYYYYY som består av ett eller flera HY, följt av ett HIH och noll eller flera Y. 1. Skriv en syntax för den bruna gladans skri. 2. Beskriv kortfattat hur ett program som kontrollerar syntaxen i ett fågelskri kan fungera.

Lösning 1. <skri> ::= <start><mitt> <start><mitt><slut> <start> ::= HY HY <start> <mitt> ::= HIH <slut> ::= Y Y <slut> 2. Skapa en funktion för varje icke-slutsymbol i grammatiken ovan. Tjuvkika på nästa tecken (eller två tecken i start) för att avgöra vilken funktion som ska anropas i de fall då det finns flera alternativ.

För att göra en Dagobertmacka lägger man en brödskiva i botten, sen lägger man på ett eller två pålägg, sen en brödskiva till, följt av ett eller två pålägg, följt av en brödskiva och så vidare (alltid ett eller två pålägg mellan brödskivorna). Allra överst ska det vara en brödskiva. Mackan kan bli hur stor som helst! *om+f+bj* är ett exempel på en liten macka med ost, marmelad, fisk, banan, och jordnötssmör. Brödskivorna representeras av * (mörkt bröd) och + (ljust bröd) och för påläggen tar vi bara med begynnelsebokstaven. Här är ett förslag på en syntax för Dagobertmackor <macka> ::= <bröd><pålägg><bröd> <pålägg>::= abcdefghijklmnopqrstuvwxyz

Tala om vad som är fel med syntaxen! Mackan kan bara ha två bröd, så den kan inte bli hur stor som helst Mackan kan bara ha ett pålägg mellan bröden Det finns ingen definition av <bröd> <pålägg> är hela alfabetet istället för en godtycklig bokstav i alfabetet

Det har gjorts olika utvidgningar av BNF som tillåter en mer kompakt representation av en grammatik. Utvidgningar som baseras på reguljära uttryck använder oftast konventionen att <symbol>? betyder 0 eller 1 förekomst av <symbol> <symbol>* betyder 0 eller flera förekomster av <symbol> <symbol>+ betyder 1 eller flera förekomster av <symbol> Utvidgningar som baseras på Wirth s notation använder istället [ <symbol> ] betyder 0 eller 1 förekomst av <symbol> { <symbol> } betyder 0 eller flera förekomster av <symbol>

Hur undviker man buggar? 1. Tänk igenom vad funktionen ska göra. Vad ska den ta för indata och vad ska den ta för utdata? 2. Strukturera koden och använd tydliga variabelnamn. 3. Kommentera koden. Om koden är tydlid behövs inga kommentarer om vad koden gör, men däremot hur och varför. 4. Kan algoritmen bevisas vara korrekt för alla giltiga indata?

Hur hittar man buggar i programmet? 1. Testa enkla indata med kända utdata. 2. Om det olika delar av koden körs beroende på indata, testa någon representant för varje fall. 3. Testa indata som är nära gränsen för det tillåtna. 4. Testa ogiltiga indata. Vad händer?

Vad gör man när man hittat ett testfall som misslyckas? 1. Försök hitta det enklaste/minsta testfallet som visar buggen. 2. Om koden och testfallet är tillräckligt enkla man exekvera koden i huvudet eller på papper. När går det fel? 3. Använd spårutskrifter. Hur förändras de aktuella variablerna? 4. Binärsök. Är allt ok halvvägs genom koden? 5. Bryt ner programmet till mindre funktioner och testa varje funktion för sig.