Introduktion til programmering. Programmeringssprog Uge 41 Computer Science, kap 6. Learning Python: kap 13, 14.

Relaterede dokumenter
Introduktion til programmering. Programmeringssprog Uge 44 Computer Science, kap 6. Learning Python: kap 13, 14.

Introduktion til programmering. Afslutning

Introduktion til funktioner, moduler og scopes i Python

Lær Python dag 1 - modul 1

Python programmering. Per Tøfting. MacFest

DM507 Algoritmer og datastrukturer

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter Abstract

Klasser og Objekter i Python. Uge 46 Learning Python: kap 15-16,

Dokumentation af programmering i Python 2.75

DM507 Algoritmer og datastrukturer

Introduktion til programmering. Intro

4 Basal Objekt-orienteret Programmering I.

Programmering. Det rent og skært nødvendige, det elementært nødvendige! Morten Dam Jørgensen

Programmering for begyndere Lektion 2. Opsamling mm

Programmering C RTG

Abstrakte datatyper C#-version

Enigma. Et programmeringssprog. Forfatter: Niels Serup X. Y Vejleder: A B C. Fag: Programmering Uddannelsessted: N M

Introduktion til programmering. Uge 38.1 Python 2 Learning Python, kap 8-12.

Programmering og Problemløsning, 2017

Klasser. Grundlæggende Programmering med Projekt. Peter Sestoft Tirsdag 2. september (Tak til Jakob Bardram for nogle slides) Dagens begreber

Kapitel 3 Betinget logik i C#

Programmeringscamp. Implementer funktionerne én for én og test hele tiden.

Sammenlign og byt. Et eksempel på dokumentering af et program

Danmarks Tekniske Universitet

Design by Contract. Design and Programming by Contract. Oversigt. Prædikater

Typeanalyse af PHP-scripts

DM536. Rapport og debug

Test af It-komponent

DATALOGI 1E. Skriftlig eksamen torsdag den 3. juni 2004

vil jeg blive mindet om det af VBA allerede mens jeg skriver koden, da der er tale om en såkaldt kompileringsfejl:

Jeg har i forbindelse med it og programmering designet og udviklet et it-produkt, som kan beregne rødder i en anden gradsligning.

1 Grundbegreber. Noter. Stilarter i programmering og sprog. Syntaks og semantik. Datatyper. Kontrolstrukturer. Udtryk. Abstraktioner.

DM507 Algoritmer og datastrukturer

3 Algebraisk Specifikation af Abstrakte Datatyper.

DM507 Algoritmer og datastrukturer

Indhold. Maskinstruktur Kapitel 1. Assemblersprog Indledning Hop-instruktioner Input og output...

Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Makrosikkerhed (Sikkerhedsindstillinger)...13

Skriftlig eksamen i Datalogi

JavaScript. nedarvning.

DM507 Algoritmer og datastrukturer

Ugeseddel 4 1. marts - 8. marts

CPUer og maskinkode DM534. Rolf Fagerberg

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Klasser og Objekter i Python. Uge 11

Introduktion til C programmering

Noter til C# Programmering Iteration

DM507 Algoritmer og datastrukturer

Data load og udtræk. 2. iteration: implmentation (test af backend) PHP mysql. Loade og parse XML (SimpleXML, Xpath) Filhåndtering i PHP JSON

Danmarks Tekniske Universitet

Flowchart og Nassi ShneidermanN Version. Et flowchart bruges til grafisk at tegne et forløb. Det kan fx være et programforløb for en microcontroller.

Oversættere. Vejledende løsninger til Skriftlig eksamen onsdag d. 20. april 2005

Lær Python - Dag 4, modul 1 Objektorienteret programmering

DDD Runde 2, 2015 Facitliste

Databasesystemer. Databaser, efterår Troels Andreasen. Efterår 2002

2) Det er let at være produktiv med Python, da Python som regel kun har mellem 67 og 80% færre linier end tilsvarende C eller Java kode.

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Kommentarer til opgave 4-6

Transkript:

Introduktion til programmering Programmeringssprog Uge 41 Computer Science, kap 6. Learning Python: kap 13, 14.

Opgaver Generelt OK opgaver, OK kommentarer Kun få har husket at kommentere HMTL-koden. Det var der ellers en mening med. <img src="billede.bmp"> Relativ url. Husk at lægge billeder med når I afleverer, eller angiv absolut url.

Sidste gang Algoritmer Definition Opbygning Pseudokode Rekursion Analyse Datastrukturer Kompleksitet Eksempel: Søgning Userdefined ADT Enkeltkædede lister, dobbeltkædede lister Stakke, køer Træer Tolkning af ADT

Plan Lidt mere om tolkninger Programmeringssprogenes historie Programmeringsparadigmer Funktionel programmering i Python Scope: referencekonteksten Obligatorisk opgave

Tolkninger

Tolkning af abstrakte datastrukturer jvnf. uge 36 Repræsentation Lister Stakke Køer Træer Rekursion Objekt Associationer Mål og midler Prioritering og afbrud Køer i supermarkedet Trafikpropper Helheder og dele Overordnet og underordnet Mål og midler Helhed og del

Organisationer som maskiner Bureaukratiske organisationer Træer Kommunikationen følger grenene på træerne Køer (Dora). Galt valg af tolkning Leder Mellemleder ordre rapport Mellemleder Arbejder rapport ordre Arbejder

Organisationer som flux Kommunikation skaber ny kommunikation. Organisationen og dens grænser omog genskabes ved kommunikation Connected, directed graph with loops

Kommunikationsstøtte Holde styr på faser og forpligtelser Winograd & Flores: understanding computers and cognition, 1986. genforhandle annulere erklære anmode love udføre påstå erklære acceptere Ordre indvende annulere Ordrebekræftelse Følgeseddel afvise Kvittering faktura annulere

Programmeringssprogenes historie

Generel udviklingstendens Repræsentation af maskinelle processer repræsentation af processer i problemområdet Portabilitet Væk fra maskinafhængighed Abstraktion, aggregering og indkapsling Menneske tilpasser sig maskine maskine tilpasser sig menneske

Naturlige og formelle sprog Naturlige sprog Udvikler sig gradvist Distribueret udvikling Interpretanten til forhandling Formelle sprog Udvikler sig i spring Python 2.3 Python 2.4 Centraliseret udvikling Interpretanten ikke til forhandling Fælles træk SYNTAX ERROR Syntaks, semantik, pragmatik Udvikling afspejler praktiske udtryksbehov

Programmeringssprogenes historie Starten af 50 erne: A-0 (Grace Hopper) 1957: FORTRAN, FORmula TRANslator Designmål: hastighed 1957: LISP LISt Processing AI området 1958: ALGOL, ALGOrithmic Language Peter Naur Notation som matematik, algoritmebeskrivelse, maskinuafhængigt 1960: COBOL, COmmon Business Oriented Language

Fortran FORTRAN Mange heritage-systemer er skrevet i FORTRAN Årtusindskiftet: FORTRAN-programmører blev rige program ninetynine implicit none integer i do i=99,1,-1 enddo end print*, i,'bottles of beer on the wall, ',i,'bottles of beer' print*, 'take one down, pass it around, ',i-1,. 'bottles of beer on the wall'

COBOL * * * PROCESS. IF BOTTLES = 0 THEN COMPUTE E-O-F = 1 ELSE PERFORM WRITE-ROUTINE END-IF. TERMINATION. CLOSE OUTPUT-FILE. WRITE-ROUTINE. MOVE BOTTLES TO NUMBER-OF-BEERS-1, NUMBER-OF-BEERS-2. COMPUTE BOTTLES = BOTTLES - 1. WRITE BEERS-OUT FROM LINE1. MOVE BOTTLES TO NUMBER-OF-BEERS-3. WRITE BEERS-OUT FROM LINE2.

ALGOL ( PROC width = (INT x) INT: (x>9 2 1) ; FOR i FROM 99 BY -1 TO 1 ) DO printf ( ( $ 2l n(width(i))d, x "bottle" b("","s") x "of beer on the wall,", x n(width(i))d, x "bottle" b("","s") x "of beer.", l "Take one down, pass it around,", x n(width(i-1))d, x "bottle" b("","s") x "of beer." $, i, i=1, i, i=1, i-1, i=2 ) ) OD

LISP (Lots of Irritating Superflous Paranteses) (labels ((foo (x) (and (<= 0 x) (cons x (foo (1- x)))))) (format t (format nil ) (foo 99))) "~~{~~&~~@(~~%~~R ~A ~A!~~)~~:*~~&~~@(~~R ~0@*~A!~~)~~&~~@(~2@*~A!~~)~~&~~@(~~[~A~~:;~~: *~~R~~:*~~] ~0@*~A!~~)~~}" "bottles of beer" "on the wall" "take one down, pass it around" "no more"

Mere historie 1967: Simula-67, ALGOL med klasser Første objektorienterede sprog Kristen Nygaard, Norsk regnecentral 1971: Smalltalk Integreret sprog og miljø 1973: PROLOG, PROgraming in LOGic 1981: C++, C med klasser Første kommercielt succesfulde OO sprog 1985: Objective C, Smalltalk + C 1986: Hypertalk: første udbredte skriptsprog Bill Atkinson Stilsættende (Directors Lingo) 1996: Java 1990 erne: Perl, Python, : scriptsprog

SQUEAK Programmering er sjovt og for alle http://www.squeak.org/ Smalltalk, Alan Kay

Programmeringsparadigmer

Programmeringsparadigmer Imperative / procedurelle Python, C, FORTRAN, ALGOL Objektorienterede python, C++, smalltalk, java Funktionelle lisp, ML Deklarative / logiske prolog

Programmeringsparadigmer Et paradigme udtrykker et syn på problemområdet Interpretant paradigmets syn på verden Repræsentation program Objekt problemområde

ITs påvirkning af vores tænkemåde Når vi konsumerer et medieprodukt er vi nødt til at acceptere interpretanten præmissen - under konsumprocessen Den er en forudsætning for konsum Vi kan ikke se en amerikansk mainstream film med fornøjelse uden i en halvanden time at acceptere den amerikanske fortolkning af verden Og vi kan ikke bruge et IT-system uden i brugsperioden at acceptere dets syn på verden

Imperative Interpretant: Verden består af aktive processer og passive ting Tingene flyder mellem processerne og skifter tilstand Programmering Ontologi Udform en algoritme der omdanner ting En algoritme er en sekvens af tilstandsændringer Subjekt Objekt Temporalt struktureret Tekstgenre: narrativ

Objektorienterede Interpretant: Verden består af aktive objekter samt af kommunikation mellem disse objekter Objekterne har metoder tilknyttet >>> x = ['a','b','c'] >>> x.extend([1,2,3]) Programmering: lav en struktur af objekter hvis vekselvirkning resulterer i det ønskede resultat Simuler problemområdet Ontologi Note Subjekt/Objekt Subjekt/Objekt Indeholder normalt en procedural komponent (C++, Python) Understøtter indkapsling og genbrug Tekstgenre: deskriptiv.

Funktionelle Interpretant Verden består af afhængigheder Inspireret af matematikken Programmering Lav et hierarki af funktioner der kalder andre funktioner Funktion(funktion(funktion(data))) Ontologi Input-output, a-temporal Python har et funktionelt subset (apply, map, reduce, listcomprehension) Filteropgaven løst på én linje len([x for x in reduce (lambda x, y: x+y, [x.split() for x in etdokument]) if x in fraekkeord])

Deklarative Interpretant Verden består af sande eller falske sætninger samt af logiske slutningsprocesser Ontologi Logisk positivisme Logisk, a-tamporal Tekstgenre: argumentativ

Eksempel Sande sætninger father(karl, jens). father(karl, ole). father(valdemar, karl). Slutningsregel grandfather(x,y):- father(x, Z), father(z, Y). Bevis følgende: grandfather(valdemar, ole). Success Bevis føglende: grandfather(hvem, ole). Hvem = valdemar

Python Objektorienteret Proceduralt Men med elementer af funktionel programmering. Kommer nu

Funktionelle træk i Python Lambda: anonyme funktioner Et udtryk, ikke en række sætninger Kan stå steder hvor def ikke kan bruges, f.eks. inline i dictonaries og lister Implementering af kommandointerface kommando = 7 { 'plus':(lambda x, y: x+y), 'minus': (lambda x, y: x-y), gange': (lambda x,y: x*y)} >>> kommando['plus'](3,4) >>> kommando[ gange'](30,50) 1500 >>>

En lommeregner def Lommeregner(): kommando = {'plus':(lambda x, y: x+y), 'minus': (lambda x, y: x-y), gange': (lambda x,y: x*y)} inp = raw_input('tast et udtryk: ') inp = inp.split() x = int(inp[0]) op = inp[1] y = int(inp[2]) return kommando[op](x,y) >>> Lommeregner() tast et udtryk: 4 plus 78 82

Apply Matcher en funktion med argumenter i form af en tupel >>> def plus(x,y): return x+y >>> apply(plus,(3,4)) 7

Map map( funktion, sekvens ) [] Map: anvender en funktion på hvert medlem af en sekvens og returnerer de enkelte resultater i form af en liste >>> ordliste =('peter','anders','karl') >>> def lavnavne(etnavn): return etnavn.title() >>> map(lavnavne,ordliste) ['Peter', 'Anders', 'Karl'] >>>

Filter filter ( boolsk funktion, sekvens ) [] Anvender en boolsk funktion på hvert medlem af en sekvens og returnerer de medlemmer for hvilken funktionen bliver sand >>> ordliste =('peter','anders','karl','poul','anni') >>> def checknavne(etnavn): return etnavn.startswith('p') >>> filter(checknavne,ordliste) ('peter', 'poul') >>>

List comprehensions [udtryk for var in sekvens ] [] Syntaks: [Udtryk for variabel in sekvens if betingelse] Beregner udtryk, hvis betingelse er sand, for en variabel der sættes til at referere til alle medlemmer af sekvensen. >>> [x*2 for x in [1,2,-3,0,-4] if x > 0] [2, 4] Effektivt, kort, men uforståeligt!

Filteropgaven på 3 linjer Antagelse: hjemmesiden er hentet ned og ligger som en file hjemmeside.txt Hensigt: at tælle forekomsten af frække ord på hjemmesiden >>> myfile = open( hjemmeside.txt','r') >>> etdokument = myfile.readlines() >>> fraekkeord = ['manden','en','og'] >>> len([x for x in reduce (lambda x, y: x+y, [x.split() for x in etdokument]) if x in fraekkeord]) 3

Scope

Scope Scope = samtalekontekst Namespace = interpretant der angiver hvad navne står for In Python: en slags dictionary hvor navne er knyttet til objekter { A :integerobjekt, B : funktionsobjekt, } Namespaces er knyttet til kontekster lige som i naturlige sprog

Hvad betyder et navn? Samtalekonteksten og tidsforløbet afgør hvad en repræsentation (et navn) repræsenterer. Det danske samfund: Anders Fogh betegner statsministeren Vi kan bruge Fogh som henvisning til statsministeren: Fogh statsministeren Familiesammenkomst (del af det danske samfund): Hvis intet andet er sagt gælder reglen stadig. Fogh har en del bøvl med sine ministre i øjeblikket Men hvis der kommer en replik Kan I huske Købmand Fogh Ja, ja Fogh har lige solgt sin forretning Så etableres referencen Fogh købmanden

I naturlige sprog Referencen afgøres af Egenskaber ved objektet (han/hunkøn, andre egenskaber) Hvornår objektet sidste blev omtalt og hvor vigtigt det er Om der er nævnt andre kvalificerede objekter imellem taletidspunktet og sidste omtale Eksempel Prøv at se den mand derovre Ja, han (manden derovre) er noget nervøs Men se så ham bagved Han (manden bagved) ser mere ud til at have kontrol over tingene.

Scope i Python Lokale navne bruges i funktioner De forsvinder når funktionen er kørt færdig Der er 4 samtalekontekster Indbyggede navne (open, range, etc) Modulet (globale): navne der er blevet tilskrevet (A = 9) en reference i modulet eller er blevet erklæret globale Lokale navne i omgivende funktioner Lokale navn i funktionen: navne der er blevet tilskrevet en reference i modulet

Fastlæggelse af reference i Python Har navnet fået en værdi i denne funktion Ja: navnet refererer til denne værdi Nej: Har navnet fået en værdi i en indesluttende funktion: def laegentil(x): x = x+1 return x Ja: navnet refererer til denne værdi Nej: har navnet fået en værdi i modulet eller er det blevet erklæret global? Ja: navnets værdi er denne værdi Nej: findes navnet som indbygget navn? Ja: navnet har det indbyggede navns værdi Nej: fejl.

Eksempel >>> x = 10 >>> def laegentil(x): x = x+1 return x >>> laegentil(x) 11 >>> x 10 >>> def laegentil(y): global x x = y+1 return x >>> laegentil(x) 11 >>> x 11 lokal Global Global

Call by value, call by reference Python: call by reference er default Call by value kræver at parametren eksplicit er en kopi >>> def FjernFoerste(enListe): del enliste[0] return enliste >>> minliste = [1,2,3] >>> from copy import * >>> resultat1 = FjernFoerste(copy(minListe)) >>> resultat1 [2, 3] >>> minliste [1, 2, 3] >>> resultat1 = FjernFoerste(minListe) >>> minliste [2, 3] >>>

Aktuelle og formelle parametre Eksemplet igen def FjernFoerste(enListe): del enliste[0] return enliste Nyliste = FjernFoerste(minListe) Ved kaldet sættes de formelle parametre til at repræsentere den værdi de aktuelle parametre repræsenterer Formel parameter = aktuel parameter EnListe = minliste

Forskellen Call by value: i Python må man eksplicit kopiere R:minListe R: enliste O: [1,2,3] O: [1,2,3] Call by reference: default i Python R: minliste R: enliste O [1,2,3]

Andre måder x = [1,2,3] y = FjernFoerste(enListe = x) def FjernFoerste(*nogleLister): for enliste in noglelister: del enliste[0] >>> x = [1,2,3] >>> y = [4,5,6] >>> FjernFoerste(x,y) >>> x [2, 3] >>> y [5, 6] >>>

Oversættelse og kompilering

Oversættelse og kompilering Oversættelse fra et sprog til et andet Transformation af program Eks. fra C++ til maskinkode Fra python kildekode til python bytecode Først lexikalsk analyse Så syntaktisk analyse Resultat: parsetræ AST, Abstract Syntax Tree Så kodegenerering ud fra parsetræet

Leksikalsk analyse Leksikalsk analyse. Opdeling af kildekode-tekstfilen i en række tokens Tokens er reserverede ord og variable samt funktioner/operatorer Eks = print minvariabel -> ASSIGN, PRINT, VAR Variabelnavne må ikke starte på et tal >>> 1bil = 'Volvo' SyntaxError: invalid syntax >>> enbil = 'volvo'

Leksikalsk analyse Nøgleord (if, then, ) >>> if = 'peter' SyntaxError: invalid syntax Reserverede ord If er et reserveret ord Int er ikke et reserveret ord >>> int = 1 >>> int 1 Nu virker int( 10 ) ikke mere!

Syntaktisk analyse BNF (EBNF), Backus-Naur-form Samme udtrykskraft som Chomsky s kontekst-frie grammatik S ::= N VP NP ::= N N som VP at S VP ::= VT NP VI N ::= Anders Bent Christina VT ::= så hørte VI ::= løb sov lo

Fragment af Python stmt::= simple_stmt compound_stmt simple_stmt::= small_stmt (';'small_stmt)* [';'] NEWLINE small_stmt::= expr_stmt print_stmt del_stmt pass_stmt flow_stmt import_stmt global_stmt exec_stmt assert_stmt print_stmt::= 'print'( [ test (','test)* [','] ] '>>'test [ (','test)+ [','] ] ) del_stmt::= 'del'exprlist pass_stmt::= 'pass' flow_stmt::= break_stmt continue_stmt return_stmt raise_stmt yield_stmt break_stmt::= 'break' continue_stmt::= 'continue' return_stmt::= 'return'[testlist]

BNF og syntaksdiagrammer Expr ::= Term [Op Expression] Op ::= + - Syntaxregler er ofte rekursive Expression Term Op Expression Op + -

BNF og syntaksdiagrammer S ::= N VP NP ::= N N som VP at S VP ::= VT NP VI N ::= Anders Bent Christina VT ::= så hørte VI ::= løb sov lo NP som VP N at S

Parsning Analyse af om tokensekvensen overholder sprogets syntax Assign ::= Var = Expression Expression ::= Var Var + Var Var + Digit Digit + Digit Var ::= a b c... z Digit ::= 0 1 2... 9 a = a+4 a = 3+4 b = 3+5 Opbygning af parsetræer (AST)

Syntakstræ formelt sprog Assign Var Expression a = Var + Digit a = a+3 a 3

Syntakstræ dansk S ::= N VP NP ::= N N som VP at S VP ::= VT NP VI N ::= Anders Bent Christina VT ::= så hørte VI ::= løb sov lo S VP NP N VT N Bent så Anders

Syntakstræer Træer Nonterminaler (knuder) Terminaler (blade) Krav om entydighed

Syntakstræer Fjern denne flertydighed If (Boolean1): If (Boolean2): Statement1 else: Statement2 Skal statement2 udføres når Boolean1 er falsk eller når Boolean1 er sand og Boolean2 er falsk?

Fast og frit format Formatfrie sprog (de fleste) Problemet løses med forskellige former for paranteser If (Boolean1): {If (Boolean2): Statement1} else: Statement2 If (Boolean1): {If (Boolean2): Statement1 else: Statement2 } Sprog med fast format Problemet løses med indentering

Python Vistnok fast format. Bruger indentering >>> def syntakstest(navn): if navn[0] == 'peter': if navn[1] == 'andersen': print 'det var peter andersen' else: print 'fornavnet var ikke peter >>> def syntakstest1(navn): if navn[0] == 'peter': if navn[1] == 'andersen': print 'det var peter andersen' else: 'fornavnet var ikke peter'

Hvordan parser man Recursive descent compiling Som i opgaven fra sidste uge: kun genererer man ikke men genkender og opbygger et syntakstræ Man knytter kode til hver node i syntakstræet Koden beregnes af den kode der er knyttet til børnene af noden samt af bidrag fra noden selv

Hvordan parser man? Eksempel: S-ALGOL Ifsætning ::= if CLAUSE do CLAUSE If CLAUSE then CLAUSE else CLAUSE Procedure IfClause Begin End NextSymbol Clause() If WeHave( do ) then Clause() else Begin WeMustHave( then ) Clause() WeMustHave( else ) Clause() End

Semantisk analyse Er alle variable synlige? Check scope og namespace Er typen af variablen forenelig med de operationer der skal udføres på den? I stærkt typede sprog: kan gøres nu Utypede sprog som Python: kan først checkes under udførelsen

Kode generering Symboltabel Optimering: fra højniveaukode til effektive maskininstruktioner Højniveaukode X y + z W x + z Maskininstruktioner Load y i R1 Load z i R2 Add R2 til R1 (R1 = y + z) Store R1 i x Load x i R1 Load z i R2 Add R2 til R1 Store R1 i w Overflødigt

Resten Oversættelse: source objekt Linkning: Objekt load module på disk Load: load module på disk program i RAM Webapplikationer (JAVA) Oversættelse: På serveren: source bytecode Hos klienten: bytecode maskinsprog

Bare Bones Simpelt sprog med 4 elementer 3 kommandoer, 1 løkkestruktur clear var; sætter var til 0 incr var; forøger var med 1 decr var; formindsker var med 1 while var not 0 do; <stmts;> end; Gentager <stmts;> indtil var er 0

Bare Bones Trods sin simpelhed er Bare Bones et universelt sprog Alt hvad der er beregneligt kan beregnes i Bare Bones. Eksempel: flyt indholdet af variabel X over i Y Clear Y While X not 0 do: Decr X Incr Y Resultat: Y = det gamle X, X = 0

BNF ::= [] ()* Består af Eller Frivilligt Gentag nul eller flere gange Eksempler Sætning ::= Grundled Udsagnsled [gentandsled] En sætning består af et grundled, et udsagnsled og muligvis et genstandsled Udsagnsled ::= ser opdager hører Et udsagsled består af ser, opdager eller hører. Navneled ::= (tillægsord)* navneord Et navneled består af nul eller flere tillægsord samt et navneord

Obligatorisk opgave a. Vis at sætningen invert X; (der konverterer værdien af X til 0 hvis X s initiale værdi ikke er nul, og til 1 hvis X s initiale værdi er nul) kan simuleres med et Bare Bones program-segment. Hint: brug en hjælpevariabel AUX der sættes til 1 i starten. Hvis X ikke er 0 (men 1), nedskrives X til 0 og AUX til 0. Hvis AUX nu stadig er 1 kan X ikke have været 1, men må have været 0. Behandl så tilfældet hvor X var 0 b. Beskriv funktionen der beregnes af følgende Bare Bones program, under forudsætning af at funktionens input repræsenteres ved X og dens output af Z: Hint: kør programmet i hånden, f.eks. med X = 3, og registrer hvad der sker med Z-variablen. Clear Z; While X not 0 do; Incr Z; Incr Z; Decr X; End;

Obligatorisk opgave c. Skriv en BNF-grammatik eller et syntaksdiagram over Bare Bones sproget. Udvid sproget med kommandoen SET der kan tage et heltal Y som argument: SET X Y. Hvis Y indeholder 7 skal SET X Y sætter X til værdien 7. Hvordan skal grammatikken ændres? Hvordan kan SET realiseres i det oprindelige Bare Bones sprog? Hint1: det er tilstrækkeligt med følgende nonterminaler: PROGRAM, KOMMANDOLISTE, KOMMANDO, og VARIABELNAVN. Hint2: som i del a, brug en hjælpevariabel AUX. Lav en løkke hvor I lægger Y s værdi over i AUX ved at tælle Y ned til 0. Lav dernæst en løkke hvor I tæller AUX ned og tæller X og Y op.

Obligatorisk opgave Hint 3: test jeres løsning ved hjælp af Bare Bones fortolkeren (fås fra hjemmesiden) 01 clear aux : aux = 0 02 clear y : y = 0 03 clear x : x = 0 04 incr y : y = 1 05 incr y : y = 2 Y sættes til 3 06 incr y : y = 3 12 incr x : x = 3 13 incr y : y = 3 14 decr aux : aux = 0 15 end : aux = 0 y = 3 : aux = 0 : x = 3 X er nu også 3