Obligatorisk uppgift 5: Symbolisk kalkylator

Relevanta dokument
Obligatorisk uppgift 5: Symbolisk kalkylator

Obligatorisk uppgift 5

Obligatorisk uppgift: Symbolisk kalkylator

List.java. List.java. Printed by Tom Smedsaas

public boolean containskey(string key) { return search(key, head)!= null; }

Obligatorisk uppgift: Numerisk kalkylator

Observera. Tentamen Programmeringsteknik II Skrivtid:

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

List.java. List.java. Printed by Tom Smedsaas

Tentamen Programmeringsteknik II för STS Skrivtid: Inga hjälpmedel.

Klassdeklaration. Metoddeklaration. Parameteröverföring

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Inlämningsuppgift MiniPlotter

Obligatorisk uppgift: Numerisk kalkylator

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper.

TDDC77 Objektorienterad Programmering

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren att du har förstått dessa även om detaljer kan vara felaktiga.

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Obligatorisk uppgift: Numerisk kalkylator

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Tentamen Programmeringsteknik 2 och MN Skrivtid: Inga hjälpmedel.

Programmering A. Johan Eliasson

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

Föreläsning 3: Booleans, if, switch

F3: Recursive descent, tokenisering, avbildningar och undantag. Carl Nettelblad

Konstruktion av klasser med klasser

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

kl Tentaupplägg

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Klasshierarkier - repetition

Grafik, grafiska användargränssnitt och rörliga bilder

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Parameteröverföring. Exempel. Exempel. Metodkropp

1 Datorn som miniräknare. 1.1 Räkneoperationer. 1.2 Variabler

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper.

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 7. Nyckelord I Java. Uttryck. Uttryck, Operatorer Och Kontrollflöden

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

Föreläsning 5-6 Innehåll

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Föreläsning 3-4 Innehåll

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Användning av stack: evaluera uttryck i RPN

Lösningar till Tentamen i Programmeringsteknik II och MN

TDDC77 Objektorienterad Programmering

F4. programmeringsteknik och Matlab

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Uppgift: Algoritm för att beräkna kontrollsiffran i ett personnummer givet de 9 första siffrorna. Torrsimning av algoritm för personnummer

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Rekursion och induktion för algoritmkonstruktion

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Tentamen OOP

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

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

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Föreläsning 9 Innehåll

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Programmering II (ID1019) :00-17:00

Objektorienterad programmering D2

Klasshierarkier. Klasser kan byggas på redan definierade klasser

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Att skriva till och läsa från terminalfönstret

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

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

Föreläsning 9 Innehåll

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

Sätt att skriva ut binärträd

Föreläsning 1 & 2 INTRODUKTION

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

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

System.out.println("Jaså du har "+ antalhusdjur+ " husdjur"); if ( antalhusdjur > 5 ) System.out.println("Oj det var många);

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

Allmänt om Mathematica

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

OOP Objekt-orienterad programmering

Föreläsnings 9 - Exceptions, I/O

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Classes och Interfaces, Objects och References, Initialization

Tentamen i. TDDA 69 Data och programstrukturer

Transkript:

Informationsteknologi Tom Smedsaas IOOP ht09 Obligatorisk uppgift 5: Symbolisk kalkylator Moment: Objektorientering med klasshierarkier, arv och dynamisk bindning samt dynamiska strukturer, undantag, samlingar och recursive descent. Lämplig start: Tisdagen den den 17 november. Slutlig redovisning: Senast onsdagen den 9 december. Redovisningen skall innehålla programkod i enlighet med stilguiden (se länk från sidan huvudsidan med inlämningsuppgifter) och en testkörning. Alternativt kan uppgiften redovisas muntligt vid dator. Uppgift Ni skall skriva ett program som läser in och beräknar uttryck. Programmet skall förutom rent numerisk aritmetik kunna utföra vissa symboliska operationer som derivering och (enkel) förenkling. Programfunktion Först exemplifierar vi den rent aritmetiken: $ calc Welcome to the symbolic calculator!? 2*(5-2) Alla numeriska beräkningar i flyttalsaritmetik (double). 6.0? 1/(2+8) = a Spara värden i variabler. Tilldelningen går åt höger. Värdet av en tilldelning är det tilldelade värdet. 0.1? 2 = x = y Multipla tilldelningar 2.0? (x+y=z) - (z-1)*(1=x) Tilldelningar i uttryck. Evaluering från vänster till höger. 1.0? -sin(exp(a*a*10)) Elementära funktioner -0.8935409432921488? ans En fördefinierad variabel som alltid innehåller värdet av senast beräknade uttryck -0.8935409432921488? -ans+2 Variabeln ans kan användas i uttryck som andra variabler 2.8935409432921488? - - -x -1.0 1

? vars Kommando för att se vilka variabler som finns fans=1.0, a=0.1, x=1.0, y=2.0, z=4.0g? 3**5 ++ x Felhantering *** Syntax Error: Unexpected: *? foo(x+y) *** Syntax Error: Unexpected: (? 1/0 Vissa fel kan överlåtas åt Java för hantering Infinity? Symboliska operationer Som nämnts skall kalkylatorn kunna hantera uttryck symboliskt. Exempel: $ calc Welcome to the symbolic calculator? b Odefinierade variabler har sig själva som värde b? 1 = a 1.? a + b En beräkning resulterar i ett uttryck 1. + b? b + a = c Värden kan vara uttryck b + 1.? 2 = b Även om b tilldelas ett värde så påverkar detta 2. inte uttryck innehållande b som redan definierats.? c Evaluering görs endast en gång - värdet evalueras inte! b + 1.? (2*x+a*sin(x)) x Deriveringar 2. + cos(x)? exp(2*x) = y exp(2.*x)? y x Vänsteroperanden till derivering evalueras alltid 2.*exp(2.*x)? x x Vänsteroperanden evalueras (till x) 1.? a a Vänsterledet evalueras (till 1) 0.? (u u + 2*v v)*z Dervering kan naturligtvis göras inuti uttryck 3.*z Observera att högeroperanden till deriveringsoperatorn inte skall evalueras (påminner i detta avseende om tilldelningsoperatorn). 2

Operatorerna & och " Att t ex derivatan av x x blir 1 medan derivatan a a blir 0 visar att det finns ett behov av att kunna undertrycka evaluering med hjälp av en quote -operator (") och att kunna kräva evaluering med hjälp av en evalueringsoperator (&). Ett kommando clear för att ta bort lagrade variabelvärden skulle också kunna vara bra att ha. Det finns en del detaljer som behöver specificeras. Nedanstående exempel klargör dessa. Indata Värde Kommentar 3=x 3 Värdet av tilldelningen är 3. x+y 3 + y Om en symbol tilldelats ett värde så används värdet vid evalueringen. z+2=y z + 2 3=z 3 y z + 2 Symboler evalueras bara en gång (annars skulle värdet bli 5). y=f z + 2 Som sagt, endast en gång. f z 1 f evalueras men inte z deriverings- och tilldelningsoperatorerna är speciella! f+z*2 z + 2 + 6 Symbolerna evalueras EN gång men... f+z*2 z + 8...skulle kanske kunna göra en bättre förenkling! Dock svårt! (f + z*z) z 1 Man kanske ville ha 2 z! z + x = g 6 g får värdet 6 g 6...men man kanske ville ha värdet z + x! "(z + x) = g z + x Quotning! "g g g z + x &g 6 Observera att & först evaluerar sitt argument som de flesta andra operatorer med z + x som resultat och därefter utförs själva operationen som är en evaluering av operanden. f z + 2 Definierat ovan. z 3 (f + z*z) z + 2 + 9 (f + z*z) z 1 (f + "(z*z)) z 1 + 2 z (&f + "(z*z)) z 2 z 1+"(2=u)= v 1 + (2 = u) v 1 + (2 = u) &v 3 Dessutom har u fått värdet 2 3

Syntaxdiagram Indata till programmet beståer av satser (statement) skrivna en per rad. Syntaxen definieras av nedanstående diagram. statement command command eol quit assignment vars assignment expression = identifier expression term + factor term factor primary (differentiate) identifier */ unary (unärt minus) primary primary ( assignment ) & (evaluera) " (quote) sin unary cos number exp identifier log 4

Programdesign Intern representation av uttryck Programmet skall läsa uttrycken och bygga upp en internrepresentation som lämpar sig för evaluering. Ni skall använda en trädstruktur där operatorer och funktioner lagras i de interna noderna och konstanter och variabler i löven. Det matematisk uttrycket = sin x + 5a 3(u + 1) = z = t skall alltså reprenteras av vidstående träd. = z t (När uttrycket skrivs som indata till programmet måste multiplikationstecknet vara med) + * sin * 3 + x 5 a u 1 Gemensamt för alla noder är (bl a) att de skall kunna evalueras men evaluering gör olika beroende på vad det är för typ av nod (konstant, variabel, addition,... ). Eftersom noderna ska kunna vara av olika typer (operatorer, funktioner, variabler, konstanter,... ) är det lämpligt att implementera dem i en klasshierarki med en generell basklass som skulle kunna kallas SymbolicExpression. Av layout-skäl kan det dock vara bra att använda ett kortare namn som Sexpr eftersom detta namn kommer att vara oerhört frekvent i koden. Gör egna klasser för varje operation och funktion (Assignment, Addition, Subtraction, Sin,... ) samt en klass för variabler och en för konstanter. Det finns tre tydligt urskiljbara grupper av noder: de med två operander (binära operatorer), de med en en operand (funktioner, unärt minus, evaluering, quotning) och de utan operander (konstanter, variabler). Det är inte bara vara antalet operander som är gemensamt för varje grupp utan även vissa metoder. Sålunda kan bl a tostring-metoderna skrivas på samma sätt t ex för alla binära operatorer. Således skall man samla binära operatorer under klassen Binary och unära operatorer (inklusive funktioner) under klassen Unary. Av symmetriskäl är det lämpligt att samla konstanter och variabler under klassen Atom även om det nog inte finns så mycket som kan utnyttjas gemensamt mellan dessa två grupper. Det leder till följande design (ytterligare metoder kommer behöva tillföras): 5

Sexpr abstract String getname() abstract abstract int priority() Sexpr diff(sexpr) double getvalue() boolean isconstant()... Command abstract Atom abstract Unary abstract Binary abstract String tostring() Sexpr argument String tostring() int priority() Sexpr left Sexpr right String tostring() Vars Quit Variable String ident String getname() Sexpr diff(sexpr) Constant Sin Cos Exp Log Evaluation Addition Subtraction Multiplication Division Assignment double value Quotation Differentiation String getname() Sexpr diff(sexpr) double getvalue() boolean isconstant() Negation String getname() Sexpr diff(sexpr) String getname() Sexpr diff(sexpr) int priority() Obs: Konstruktorer finns är inte angivna. Det är lämpligt att placera Sexpr och dess subklasser ett eget paket (symbolic). Basklassen Sexpr bör således ha följande utseende. package symbolic; import java.util.*; public abstract class Sexpr{ public Sexpr() {... 6

Ett exempel på en klass på mellannivån i hierarkin är Unary: package symbolic; public abstract class Unary extends Sexpr { Sexpr argument; public Unary(Sexpr a){ argument = a; public String tostring() {... public priority() {... Hur bygger man internstrukturen? Uttryck byggs av den parser för recursive descent som tidigare presenterats. Den modifieras så att varje metod som förut returnerade ett tal (en double) nu returnerar en referens till en skapad nod. Exempel: Parsermetoden expression får följande uteseende (med en StreamTokenizer st): public Sexpr expression() { Sexpr sum = term(); while (st.ttype== + st.ttype== - ) { int operation = st.ttype; st.nexttoken(); if (operation== + ) sum = new Addition(sum, term()); else sum = new Subtraction(sum, term()); return sum; Där man tidigare utförde en addition eller en subtraktion skapar man nu en additionsnod respektive en subtraktionsnod. Hur gör programmet för att skriva ut uttryck? Som vanligt använder man tostring()-metoder för att skapa en textrepresentation av de lagrade uttrycken. Dessa metoder gör i princip en inordertraversering av trädet. Ett problem är att i trädet är evalueringsordningen given av strukturen men i den externa bestäms den av prioriteter och parenteser. Således måste tostring()-metoderna, vid behov, sätta ut parenteser för att uttrycken skall bli korrekta. Initialt kan man göra det lätt för sig genom att alltid sätta ut parenteser men det blir inte så vackert. Eftersom parenteshanteringen kan göras på samma sätt för alla unära respektive alla binära operatorer så placeras tostring-metoderna i klasserna Unary respektive Binary. Själva operatornamnet erhålles av getname() 7

Så här ser klassen Unary ut med en simpleminded (dvs en som sätter ut parenteser var sig det behövs eller ej) version av tostring(): public abstract class Unary extends Sexpr { Sexpr argument; public String tostring() { return getname() + "(" + argument.tostring() + ")";... Variabellistan Eftersom värden nu är symboliska och inte numeriska måste värdetypen i variabellistan (hashtabellen) vara av Sexpr: Map<String,Sexpr> variables = new HashMap<String,Sexpr>(); Observera att variabellistan inte alls skall användas i parsern utan evalueringsmetoderna! Huvuditeration Följande struktur i main (eller annan drivmetod) är lämplig Parser p = new Parser(); Map<String,Sexpr> variables = new HashMap<String,Sexpr>; while (true) try { System.out.print("? "); Sexpr e = p.statement(); System.out.println("Inläst uttryck: " + e) System.out.println( e.eval(variables) ); catch (...) {... // För kontroll (Kräver lite eftertanke om vad kommandonas tostring- och eval-metoder skall returnera) Symbolisk evaluering Som synes ovan evalueras ett lagrat uttryck genom att eval-metoden för dess rotnod anropas. Beroende på rotnodens typ kan eventuella operanders eval-metoder anropas. Dessa metoder utför helt enkelt en postordertraversering av trädet. En nods eval-metod avgör först vad som skall göras med operanderna. De flesta operatorers operander skall evalueras. Några undantag finns dock: tilldelningsoperatorn och deriveringsoperatorn som båda skall evaluera sin vänstra men inte sin högra operand (1+2 = a tilldelar värdet av 1+2 dvs 3 till variabeln a inte till värdet av variabel a). Quote-operatorn evaluerar inte heller sin operand. Till evalueringsmetodernas hjälp skall ni skriva en klass Symbolic som har ett antal statiska metoder som utför olika symboliska operationer: symbolisk addition, subtraktion,.... 8

Dessa metoder utför numeriska operationer när det går och gör förenklingar när det går men returnerar alltid ett uttryck av typ Sexpr Exempel: Sinusklassens evalueringsmetod ser typiskt ut så här: public Sexpr eval(hashmap<string,sexpr> variables){ return Symbolic.sin(argument.eval(variables)); och metoden sin i klassen Symbolic har följande utseende: public static Sexpr sin(sexpr arg){ if (arg.isconstant()) return new Constant(Math.sin(arg.getValue())); else return new Sin(arg); Observera att metoderna i Symbolic aldrig anropar någon eval-metod! Liknande metoder skrivs för de övriga funktionerna samt för alla operatorer som kan utföra någon form av aritmetisk beräkning. Om det är möjligt att utföra en numerisk beräkning ska det ske, annars får man utföra operationen symboliskt genom att skapa en ny nod av lämplig typ. Observera dock att metoden alltid måste returnera ett Sexpr, även om den lyckats beräkna ett numeriskt värde. Exemplet ovan visar även att det finns ett behov av metoder som isconstant() och getvalue() i klassen Sexpr. Använd inte instanceof och inte heller typkastning utan utnyttja den dynamiska bindningen! När en variabel evalueras söker man efter den i variabellistan. Hittar man den där returnerar man dess värde, annars variabeln själv. Värdet som hämtas ur listan skall inte evalueras. En konstant evalueras alltid till sig själv. Att evaluera en tilldelning innebär att man evaluerar den vänstra operanden och lägger in dess värde i variabellistan som den högra operanden (variabeln). Det är sedan värdet av den evaluerade operanden som returneras. Derivering I parsern hanteras deriveringsuttrycken av metoden factor. Klasshierarkin påverkas på två sätt: dels måste en klass för derivator definieras och dels måste en deriveringsmetod införas i klassen Sexpr. Deriveringsmetoden implementeras sedan i de klasserna på den lägsta nivån i klasshierarkin där det är vettigt. (Man kan naturligtvis inte, t ex, derivera kommandon) Deriveringsmetoden ska ha en parameter, den variabel med avseende på vilken deriveringen ska ske. I deriveringsmetoden använder man de metoder för symboliska operationer som finns i klassen Symbolic. 9

Klassen Sin:s deriveringsmetod ser ut så här: public Sexpr differentiate(sexpr variable){ return Symbolic.multiply(argument.differentiate(variable), new Cos(argument)); (Hur skall deriveringsmetoden definieras för tilldelningsoperatorn, deriveringsoperatorn och nedan beskrivna eval- och quote-operatorerna?) Användningen av derivering kommer att visa på nödvändigheten av förenkling. En begränsad sådan kan uppnås genom modifiering av metoderna för symboliska operationer i Symbolic. Förenkling då samtliga inblandade argument är konstanter sker redan, men även om endast den ena operanden till en binär operator är konstant kan det vara möjligt att förenkla. Ett sådant exempel är addition med noll, men vilka de övriga fallen är får ni lista ut själva. Felhantering I felhanteringen måste man skilja på syntaxfel (som inträffar under inläsningen) och evalueringsfel (som inträffar under evalueringen). Har ett syntaxfel inträffat måste man rensa bort resterna av det misslyckade uttrycket från input-strömmen. Rör det sig däremot om ett evalueringsfel har inläsningen gått bra och det räcker att meddela användaren vad som gick snett. Arbetsgång Uppgiften skall lösas stegvis. Se till att varje steg fungerar innan du går vidare! Lämpliga steg: 1. Definiera klasshierarkin men vänta med det går bra att vänta med de mer esoteriska lövklasserna Evaluation, Quotation och Differentiation. Ta endast med konstruktorer och tostring()-metoder och låt dessa sätta ut parenteser ovillkorligt. 2. Modifiera och bygg ut den parser som tidigare delats ut så att den bygger uttryck (utan evaluering). 3. Testa detta genom att skriva ett huvudprogram som läser in uttryck och sedan skriver ut det inlästa uttrycket. 4. Implementera priority()- och modifiera tostring()-metoderna så att de bara sätter ut parenteser vid behov. 5. Implementera klassen Symbolic. Gör bara enkla implementationer av typ om båda operanderna i additionsmetoden är konstanter så skapa en ny konstant som summan av de två, annars skapa en ny additionsnod med samma operander. Implementera eval-metoderna för de nodklasser som skrivits samt de andra metoder som krävs för att evaluering skall kunna utföras. 6. Skriv klasserna Evaluation och Quotation och modifiera parsern så att den kan hantera dem. 7. Skriv klassen Differentiation samt metoderna diff(sexpr) i klasserna. Obervera att deriveringsreglerna (diff-metoderna) skall använda sig av metoderna i 10

klassen Symbolic. Förbättra metoderna i klassen Symbolic så att de utför triviala förenklingar. 8. Luta dig tillbaka och se fram mot tentan med största lugn! Observera 1. Programmet skal l fungera i enlighet med specifikationen! (Radiklalt krav, jag vet... ) 2. Koden skall vara läslig (innebär bl a att ingar rade får vara längre än 80 tecken) och följa kodkonventionerna. 3. Du skall använda recursive descent såsom den i den tidigare utdelade parsern. 4. Det skall finnas en metod för varje syntaktisk enhet (varje enskilt syntaxdiagram) och metoden skall ha de namn som anges där. 5. Du skall följa den givna klassdesignen i detalj dvs alla klasser skall finnas med de angivna namnen och de angivna metoderna. 6. Det är förbjudet att använda instanceof och typkastningar mellan olika klasser i klasshierarkin. 7. Upprepa inte identisk eller nästan identisk kod i olika klasser en klass skall bara definiera det som är speciellt för den. Tänk särskilt på detta i konstrukturer (utnyttja super!) och tostring-metoder! 11