Linköpings universitet Innovativ Programmering TDP019 Projekt: Datorspråk. flip/flop. ett helt flippat språk

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

PROMETHEUS. Ett typat, objektorienterat programmeringsspråk av Tim Andersson.

Användar- och systemdokumentation

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

Att integrera vattenfrågor i rådgivningstjänster för jordbrukare En idéhandbok för myndigheter

Programmeringsteknik med C och Matlab

plätt Linköpings universitet

Beräkningsvetenskap föreläsning 2

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

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

TDIU01 - Programmering i C++, grundkurs

Klassdeklaration. Metoddeklaration. Parameteröverföring

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

Alla filer som bearbetar PHP script ska avslutas med ändelsen.php, exempelvis ska en indexsida till en hemsida heta index.php

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

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

Användarhandledning Version 1.2

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

Kompilatorer och interpretatorer

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

Programmering för språkteknologer I, VT2012. Rum

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

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

Planering Programmering grundkurs HI1024 HT 2014

Introduktion till programmering och Python Grundkurs i programmering med Python

Objektorienterad Programmering (TDDC77)

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

TDIU01 - Programmering i C++, grundkurs

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

Grundläggande datalogi - Övning 1

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

Översikt. Varför lära sig detta? Motivering Syntax och semantik Imperativa språkets byggstenar och Python. PL-boken Kap 1 (repetition):

Föreläsning 2. Variabler, tilldelning och kodblock{} if-satsen Logiska operatorer Andra operatorer Att programmera

Programmering A. Johan Eliasson

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?

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

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

Introduktion till algoritmer - L0 - Grunder i C++ Matematikgymnasiet, Läsåret L0 - Grunder i C++

Parameteröverföring. Exempel. Exempel. Metodkropp

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

Tentamen Grundläggande programmering

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

Uppgifter teknik HT17 (uppdaterad v. 40)

i LabVIEW. Några programmeringstekniska grundbegrepp

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

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

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

TDDC77 Objektorienterad Programmering

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Objektorienterad programmering i Java

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

JavaScript. Innehåll. Historia. Document object model DHTML. Varför Javascript?

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

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

Kurslitteraturen. C-nivå Villkorssatser [kap 8] if & elif & else and & or Loopar [kap 9] for

Planering Programmering grundkurs HI1024 HT TIDAA

729G04 Programmering och diskret matematik. Python 2: Villkorssatser, sanningsvärden och logiska operatorer

Föreläsning 2. Operativsystem och programmering

TDDC77 Objektorienterad Programmering

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

Inlämningsuppgift MiniPlotter

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

Pascal... Pascal. Pascal... Pascal...

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

Övningsuppgifter kapitel 8

Vilken skillnad gör det var du placerar det? Prova båda.

Pascal. reserverade ord fördefinierade funktioner och procedurer egendefinierade funktioner, procedurer och objekt

Obligatorisk uppgift 5

Föreläsning 2 Programmeringsteknik och C DD1316

Repetition C-programmering

Läsöversikt. Föreläsningar 2-6. Genomförande av laborationer

När man vill definiera en matris i MATLAB kan man skriva på flera olika sätt.

Dependensregler - Lathund

TDP007 Konstruktion av datorspråk Hemtentamen

1 Funktioner och procedurell abstraktion

Översikt över Visual Basic

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Introduktion till MATLAB

DOM (Document Object Model) är modellen efter vilken en webbläsaren är uppbyggd. Alla objekt/element i webbläsaren finns hierarkiskt ordnade i DOM.

Programmering i C++ Kompilering från kommandoraden

Föreläsning 1 & 2 INTRODUKTION

Programmering II (ID1019) :00-17:00

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Introduktion C-programmering

Tentamen i. TDDC67 Funktionell programmering och Lisp

Föreläsning 3: Typomvandling, villkor och val, samt textsträngar

1 Texthantering. 1.1 Typen char. Exempel, skriv ut alfabetet

Introduktion till PHP

F4. programmeringsteknik och Matlab

Tentamen i Introduktion till programmering

TENTAMEN TDDB53. Programmering i Ada för MI (provkod TEN2) den 7 april 2010 kl Institutionen för datavetenskap, IDA Olle Willén mars 2010

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk:

Programmering B med Visual C

Imperativ och Funktionell Programmering i Python #TDDD73. Fredrik Heintz,

Systemutvecklare SU13, Malmö

TDP002 - Imperativ programmering

TDP002 Imperativ programmering

OOP Objekt-orienterad programmering

Transkript:

Linköpings universitet Innovativ Programmering TDP019 Projekt: Datorspråk flip/flop ett helt flippat språk TDP019 - Projekt: Datorspråk Vårterminen 2012 Johan Wänglöf Henrik Forsberg johwa457@student.liu.se henfo939@student.liu.se

Sammanfattning Målet med TDP019 är att vi ska lära oss hur man gör sitt eget programmeringsspråk med hjälp av en parser skriven i Ruby. Första halvan av vårterminen gjorde vi färdigt vår grammatik, som vi sedan implementerade andra halvan av terminen. Flip/flop har många av de traditionella syntaxer som de flesta språken har fast med en liten twist, syntaxen är flippad vilket bland annat betyder att villkorssatserna kommer i slutet av blocken istället för i början. Exempel på detta hittar du under Användarhandledning i detta dokument. Språket är interpreterat och använder RDparser som i sin tur är skrivet i programmeringsspråket Ruby.

d/e>e/e'd dd^<z/se/e's^wz<d&>/w&>kwd dd^z&dd dd/d des EZ,E>E/E'd dd<kdd/'e'/e^d>>d/ked dd<pz&>/w&>kw<kd ddd/e^d>>d/ked dddd^d^wz<dd,: >Ws/EdZWZddKZEd dddd^d^wz<dd,: >WsEydZE&/>d ddwzk'zddz&>/w&>kw<kd dddddzwzd dddsz/>zk,d/>>>e/e'd dddkwzdkzzk,kwzd/keze dddzwd/d/ke^^d^ze dddd&e ddddte ddds/><kz^^d^ze dddd/e dddd/e dddd/e dde&he<d/keze dded&e dded&e ddede d^z^ddk<hdedd/kedd dddww^dzh<dhzdd dd>y/<>/^<e>z^dd ddwz^e/e'dd dds>hz/e'dd dd^kw/e'dd dz&><d/kedd d'zddd/<dd

ewzk'zd<kde

1. Inledning Vi fick i uppgift att skriva vårt eget programmeringsspråk i kursen TDP019 Projekt: Datorspråk under andra terminen av vårt första år i Innovativ Programmering på Linköpings universitet. 1.1 Beskrivning av språket flip/flop Vi kom fram till att det skulle vara roligt att göra ett språk som är bakvänt jämfört med några av de populäraste språk som används idag. Det finns inget direkt användningsområde där flip/flop utmärker sig extra väl utan det är bara en rolig idé som vi tyckte skulle vara intressant att se om det skulle fungera eller inte. Eftersom det inte finns något speciellt användningsområde för språket har vi inte någon specifik målgrupp vi skrivit språket för. 1.2 Syfte Syftet med denna kurs var att lära oss hur ett programmeringsspråk fungerar i grunden. Hur kompilatorer förstår alla syntaxer man använder för att skapa ett program. 1.3 Idé Vår idé är mycket enkel, att skriva ett programmeringsspråk som sätter villkorssatserna i slutet av ett block och därmed göra ett rätt så unikt språk som inte är så lätt att sätta sig in i. 3

2. Användarhandledning Under hela denna handledning kommer vi anta att användaren använder någon distribution av Linux. Denna del är till för den nya användaren av flip/flop. Här får denne hjälp att komma igång med installationen av språket samt hur man skriver språkets syntax. Handledningen kommer börja med hur man kommer igång att koda med språket, alltså vad man behöver ha installerat på sin dator för det ska fungera korrekt. Efter detta visas exempel på vår syntax och därefter några kodexempel i flip/flop. 2.1 Komma igång/installation Det allra första som du behöver är att ha Ruby installerat. Om du använder Linux är det lättast att hämta det via din pakethanterare. På http://www.ruby-lang.org/en/downloads/ finns det fler installationsinstruktioner. 2.2 Köra flip/flop-kod 2.2.1 Installation Flip/flop levereras i ett ziparkiv. I detta arkiv finns filerna för att kunna starta språket, samt en mapp med dokumentation och några testfiler. Om man inte vill ladda hem ett ziparkiv med språket kan man klona Johans git arkiv från URL:n git://github.com/jwanglof/tdp019.git Observera att detta kommer enbart vara en read-only kopia och du kan inte ändra på källkoden. Mer information om hur git fungerar kan du läsa från github:s hjälphemsida på följande URL: http://help.github.com/ 4

2.2.2 Testa språket med hjälp av interpretatorn Det absolut lättaste att komma igång och koda är att använda språkets interpretator som finns inbyggd i flip/flop. För att börja använda språket, gör följande: Gå in i Rubys interpretator (öppna upp ett nytt terminalfönster och skriv irb) Skriv load run.rb Du bör nu ha en ny rad som ser ut som f/f >. Du kan nu prova språket. OBS. Det är ej rekommenderat att testa if-satser, for- eller while-loopar i interpretatorn då det blir väldigt rörigt när man skriver detta på en rad. 2.2.3 Testa språket med hjälp av en extern fil Det andra alternativet är att skapa en fil med flip/flop-kod. För att köra denna fil skriver man bara: ruby flipflop_source.rb filnamnet när man står i mappen där källkoden ligger. Vi har bifogat några exempelfiler som ligger i mappen test och för att testa någon av dessa filer skriver användaren: ruby flipflop_source.rb test/filnamn 2.3 Programmera flip/flop-kod 2.3.1 Datatyper Eftersom språket var mest gjort för att lära oss hur ett språk verkligen fungerar bestämde vi oss att enbart implementera 3st olika datatyper. De som fungerar är: Flyttal Heltal Strängar 2.3.2 Variabler och tilldelning En variabel kan börja med någon bokstav mellan a-z (både stora och små bokstäver fungerar), med en siffra mellan 0-9 eller med ett underscore. Ett variabelnamn måste vara åtminstone en symbol som vi definerade innan men efter det kan det vara godtyckligt många symboler. Vi antar att de flesta som läser denna rapport har programmerat innan och vet hur man deklarerar en variabel i de flesta språk, nämligen: ƒ ƒ ˆ ƒ ƒ Ž Men eftersom flip/flop är som namnet antyder flippat deklarerar man en variabel såhär i flip/flop: 5

ˆ ƒ ƒ Ž ƒ ƒ Nu antar du säkert vad vi menar med flippat. Det är lite krångligt att börja tänka omvänt när man ska skriva och det tog tid för oss också att vänja oss vid det. 2.3.3 Operatorer och operationer För att ett språk ska kunna användas till någonting måste användaren kunna lägga ihop tal för att räkna ut något. Eller kanske för att se om ett uttryck är sant eller falskt. För att göra detta möjligt i detta språk har vi delat upp dem i aritmetiska-, logiska- och relations-operander. Aritmetiska operander: +, -, *, / och % Logiska operander: och && Relationsoperander: <, <=, >, >=, == och!= Dessa kan användas för att se t.ex. om två tal är desamma, se om två strängar har samma värde eller addera två tal och se om det blir en specifik summa. Eller kan man använda språket som en kalkylator. Aritmetiska uttryck ƒ ƒ ƒ ƒ Logiska uttryck ƒ ƒ Relationsuttryck ƒ ˆƒŽ ƒ 6

2.3.4 Repetitionssatser Vi bestämde oss att vi vårt språk heter for- och while-loopar samma sak, nämligen loop. De fungerar som de gör i andra språk, fast det är självklart en flipp här också. Ž ƒ Här är ett enkelt exempel på en for-loop som loopar ut en variabel som har ett heltalsvärde: Ž ƒ Ž Detta kommer resultera i: Som syns är allt flippat inom villkorssatserna och likadant i syntaxen Š Ž Ž ƒ Ett enkelt exempel på en while-loop som kommer ha samma resultat som for-loopen ovanför: Ž ƒ Ž 2.3.5 Vilkorssatser En if-sats i flip/flop består utav åtminstone en del av uttrycket, men man kan bygga på med fler om man känner för det. Den obligatoriska delen av en if-sats är fi (uttryck) i vårt språk. De delar man kan bygga på är fi esle (uttryck) och esle ˆ Ž ˆ ŽŽ ƒ ƒ Ž ŽŽ ˆƒŽ ƒ 7

ˆ Ž ˆ ŽŽ ƒ ƒ ˆ Ž ŽŽ ƒ ƒ ˆ Ž Ž ˆ ŽŽ ƒ ƒ ˆ Ž ŽŽ ƒ ƒ Ž ŽŽ ˆƒŽ ƒ ƒ Ž 2.3.6 Funktioner Vi bestämde oss att vårt funktionsnamn börjar med boj och slutar med job (argument). Man kan deklarera funktioner med eller utan argument och också anropa funktioner med eller inparametrar. För att anropa en funktion skriver man bara namnet på funktionen följt av inparametrar mellan två stycken parenteser. ƒ Detta visar en funktion som adderar två tal och skriver ut detta. Œ Ž Ž ƒ Œ ƒ Vi har dock inte fått funktioner med argument att fungera som de ska. Det skapas en nod när man deklarerar funktionen men man kommer inte åt denna funktion via namnet efteråt. ƒƒ Samma funktion som ovan fast utan argument. Œ Ž Ž ƒ Œ ƒ 8

ƒ ˆ Inget speciellt med detta utan visar enbart hur man kallar på funktionen i första funktionsexemplet. ƒ Detta kommer skriva ut 4. 9

3. Systemdokumentation Vi har byggt flip/flop i rdparsern som parsar igenom vår kod som vi skrivit som anger hur vår syntax ska se ut. 3.1 Mappstruktur / Docs/ README FlipFlop.docx test/ cluster for function if variable while run.rb flipflop.rb 1 node.rb 2 rdparse.rb 3 3.2 Lexikalisk analys Vår lexikaliska analys består enbart utav tokens som vår parser använder för att matcha våra regler som vi definerat i koden. Dessa är de tokens vi har: Dessa två tokens matchar enradskommentarer och flerradskommentarer. Om användaren använder detta syntax kommer allt efter en # eller inom ## text ## ignoreras av parsern. Detta matchar alla blanksteg (white spaces) som säger till parsern att ignorera dessa. 1 Har alla regler språket kan hantera 2 Innehåller språkets noder 3 Parsern vi fick som verktyg 10

Dessa är språkets specifika tilldelningssyntax. Du kan läsa om dessa satser under vår Användarhandledning. ƒ ˆ Ž Ž Ž ˆ Ž ŒŒ Detta matchar språkets specifika operatorer. Den första och andra tar hand om negativa flyttal resp. positiva flyttal. Den tredje tar hand om alla siffror. ˆ ˆ Dessa tar hand om strängar. Våra strängar måste börja med citationstecken. Denna tar hand om variablar när man deklarerar dessa. ƒœƒœ 3.3 Parsning När man skriver ett program i flip/flop skapas ett abstrakt syntaxträd med noder som är objekt av olika klasser som beskriver hur denna nod ska bete sig. Den översta noden är jämt Program och efter denna kommer alltid en Statement_List som sedan innehåller de olika noderna som programsyntaxen har skapat. 3.4 Evaluering Varje klass i språket har en evaluate-funktion som kallas då språkkonstruktionen skall exekveras. Dessa klasser som anropas är de noder som vi tidigare skrivit om. Vid exekveringen av ett program kommer trädet att traversera och de olika evalueringsfunktionerna kommer att anropas. 3.5 Scoping För att kunna hantera variabler som ej är åtkomliga från programmets globala rymd skapar varje funktion eller loop en egen privat rymd, eller scope. För att lyckas med detta sparas samtliga variabler för ett scope i en hash-tabell med variabelnamnen som nycklar. Hash-tabellen sparas i sin tur sedan som ett element i en lista. På så vis blir varje element i listan ett scope och 11

programmet kan enkelt välja det scope som ska gälla med en enkel indexvariabel. Varje gång en funktion eller loop körs kallas en metod som räknar upp indexvariabeln och på samma sätt kallas en nedräknande metod precis innan funktionen eller loopen avslutas. 12

4. Reflektion Det tog tid för oss att komma igång med implementeringen av språket då vi hade stora svårigheter med att förstå hur grammatiken skulle utformas fullt ut. Det vi fastnade på var hur aritmetiska uttryck skulle se ut rent grammatiskt, och framför allt hur prioriteringen skulle skötas. Detta gjorde att vi sköt upp implementeringen ytterligare eftersom vi kände att en grammatik med fungerande aritmetiska uttryck var viktigt att ha innan vi påbörjade den. I och med att vi kom igång så sent som vi gjorde bestämde vi oss ganska snart för att vårt språk inte skulle innehålla scopes och funktioner då vi hade hört från många av våra kamrater att dessa tagit lång tid. Efter att ha studerat publicerade språkprojekt från tidigare år och tagit hjälp av kamrater som kommit längre lyckades vi till slut få något slags grepp om huruvida vi skulle gå tillväga för att komma i mål. Ett problem vi stötte på som tvingade oss att förändra vår syntax gällde våra if-satser. Vår syntax går ju enligt beskrivningen ovan ut på att vända på så mycket som möjligt av nyckelord och ordning av satser med mera jämfört med hur det kan se ut i andra språk. Problemet uppstod när vi, i vår if-sats, försökte evaluera villkoret i slutet av satsen istället för i början som man gör i de flesta andra språk. Här fick vi ge oss och flyttade tillbaka villkoret till början av ifsatsen istället. Sista veckan innan deadline lyckades vi på något vis få lite tid över och bestämde oss, tidigare beslut till trots, för att försöka implementera scopes och funktioner i språket. Vi lyckades inte att få till funktionerna till en början då dessa inte lyckades leverera värden från eventuella argument till funktionens parametrar vid ett funktionsanrop. Det tog några timmar med kodning och diskussion men nu fungerar detta. Erfarenheter vi tar med oss från det här projektet är som vanligt framför allt att vi måste komma igång tidigare (även om det inte alltid är så lätt) med det som ska göras men vi tror oss även gå ur det här projektet med en mycket djupare förståelse för hur ett datorspråk är uppbyggt och fungerar, vilket väl var tanken med kursen. Känslan vi har är att vi nu fått prova på hur det kan vara att skapa ett nytt programmeringsspråk och förhoppningsvis får vi i framtiden även chansen att utforska det här området ytterligare. 13

5. Grammatik ƒ ƒ ˆ Ž Ž ˆ Ž ˆ 14

Ž Ž ƒ ˆ ˆ Ž Ž Ž Ž Ž ƒœƒœ ŽŽ ŽŽ ŒŒ ŒŒ 15

16

17 6. Programkod ˆ ƒ Žƒ Ž Ž ˆ ƒž œ ƒ ƒ Ž Ž Ž Š ƒ ˆ ƒšˆ Š Žƒ ƒ ƒ ˆ Ž Ž Ž ˆ Ž ŒŒ ƒ ƒ ˆŽ ƒ ˆ ˆŽ ƒ ˆ Šƒ ƒ Š Šƒ ƒ Š ƒ ƒ Ž ƒœ

18 ƒ ƒ ƒ Š ƒ Ž Ž ƒ Ž Ž ƒ Ž ƒ Š ƒ Ž ƒ Ž Ž ƒ Š ƒ Ž ƒ ƒ Šˆ ƒžž ƒ Š ƒ ƒ Šƒ ƒ ƒ Š ˆ ƒ ƒ Š š ƒ ŠŽ ƒ ƒ Šˆ Žƒ Ž ˆ ƒžž ƒ Š ˆ ƒ ƒžž ƒ Ž ƒ Š ˆ ƒ Ž ƒ ƒ Ž ƒžž ƒ ƒ Ž Š ˆ ƒ ŽŽ ƒ š Š ƒ ŽŽ ƒ ƒ ƒ Ž ƒƒ ƒ ƒ Š ƒž

19 Ž ƒ ƒ Š š ƒ š š ƒ Š ˆ ƒž ƒ ƒž ƒž ƒ š ƒ ƒ ƒ Ž Ž ƒ ƒ ƒ Š š ˆ š ƒž š Š ˆ ˆ ƒ ƒ ˆ Šƒ Ž Š ƒ ƒ ˆ Šƒ ˆ ˆ Ž ƒ Š Š Œ ƒ ˆ Ž ˆ ƒ ˆ Ž ƒ Šˆ š ƒ Ž Ž ƒ Ž Ž š Ž Ž ˆŽ Ž Ž š ˆ Ž ˆ ƒ Šˆ š ƒ Ž Ž ˆ ƒ š Ž Ž ˆŽ Ž Ž š ˆ ƒ Šˆ š ƒ Ž ˆ š Ž ˆ Ž š

20 Ž š ƒ Šƒ ƒ Š ƒ ƒ Š ƒ Šƒ ƒ ƒ Š ƒ ƒ Šƒ Ž ƒ ƒ Š ˆ Ž ƒ ƒ Š ˆ ƒ Ž ƒ Šƒ ƒ Š ƒ š ƒ š ƒ š š Ž ƒ ƒ Š ƒ Šƒ š ƒ š ƒ š š

21 Ž ƒ Š ƒ ƒ Š š š Ž š ƒ ƒ Š š Ž Ž ƒ ƒ Š š ƒ š Ž Ž ƒ š ƒ š ƒ š š ƒ Š š ƒ š Ž Ž ƒ š ƒ š ƒ š š Ž š Ž Ž ƒ ƒ Š š ƒ ƒ Š š Ž Ž ƒ š ƒ š ƒ š ƒ š š ƒ Š š Ž Ž ƒ š ƒ š ƒ š ƒ š š ƒ Š š Ž Ž ƒ š ƒ š ƒ š ƒ š š Ž š ƒ ƒ Šƒ ƒ Š š ƒ ƒ

22 ƒ Ž ƒ ƒ ƒ Š Ž ƒ ƒ ƒž ˆ Ž ˆ ƒ ˆ Ž Ž ƒ ƒ ƒž ƒ Šƒ ƒ ƒ ƒ Šƒ ƒ ƒž ƒ ƒ ƒ ƒž ƒ ƒ ƒ ƒž ƒ Ž ƒ ƒ Š š ƒ Žƒ ƒž š ƒ š ƒ š ƒ š š ƒ Š š ƒ š Š š š Ž ƒ ƒ Š Ž ƒ ƒž ƒ Š ƒž ƒ ŠˆŽ ƒ ƒž ƒ Š ƒž ƒ Š ˆ Ž Ž ƒ ƒž

23 ƒ Š Ž ƒž Ž ƒ Ž ƒž ƒ Š Ž ƒž Ž ƒ Ž ƒž Ž ƒž ƒ Š ƒž ƒž Ž ˆŽ ƒ ƒž ƒ Š Ž ƒ ˆŽ ƒ ƒž Ž ƒ ˆŽ ƒ ƒž Ž ƒž ƒ Š ƒž ƒž ƒ Š ƒž ƒž ƒ ƒ Ž ƒ Š Š š Ž ˆ ƒ Šƒ Ž Š Š ƒ œ Š Žƒ ƒ ƒ Ž Ž ˆ ƒ Šˆ ˆ Ž Ž Ž Ž ŒŒ Ž ƒœƒœ ƒ ƒ ƒ Ž ƒ

24 Š ˆ ƒ ˆ ƒˆ Ž Š ˆ ƒ Š Ž Ž Ž Ž ƒ Ž ƒ Š Ž ƒ Ž Ž ƒ ƒ š ƒ Ž ƒ ƒ š ƒ Ž ƒ ƒ š Š Ž Ž ƒ Š Ž ƒ Ž Ž š Ž š Š Ž Ž š Ž ˆ Žƒ ƒ Š Œ ƒ Ž Œ ˆ ƒ ƒ Ž Ž ƒ ƒ ƒž Žƒ Ž ƒ ƒ ƒž ƒ Š Œ ƒ Ž Œ ˆ Ž ˆ Žƒ Ž ˆ Ž Ž Žƒ ƒž ƒ Š ƒ Š ƒ Š ƒ Š ƒ Š ƒ Š

25 Ž ƒ Ž ƒ Šƒ Ž ƒ ƒ Ž ƒ ƒ Ž ƒ ƒ Šƒ ƒ ƒ Ž ƒ ƒ Š š Ž ƒ ƒ Ž ƒ Š ƒ ƒ Ž ƒ ƒ ƒ ƒž ƒ ƒ ƒ ƒž ƒ ƒ ƒ Š ƒ ƒ ƒ ƒ ƒ ƒ Ž ƒ ƒ ƒ Š ˆ ˆ š Ž Š ˆ ƒ ƒ ˆˆ ˆˆˆ Ž ˆˆ ƒ ƒ Ž ƒ ƒ ƒ Ž ˆˆˆ Ž ˆˆ ˆ ƒ ˆ ˆˆˆ Ž ˆˆ ˆ Š

26 ˆˆ Ž Ž ƒ ƒ Ž ƒž ƒ ƒ ƒ ˆ ƒ ˆ Ž ˆ Ž ƒ ƒ ƒ ƒ ˆ Ž ƒ ƒž ƒ ˆŽ ƒ ˆ ƒ ƒ Ž Ž Ž Ž ƒ Ž Ž Ž ˆˆ Ž Ž ˆˆŽ ˆƒŽ ˆŽ Š Š ˆ Ž ƒ ˆˆ ƒ ˆ Ž ˆ Ž ƒ Ž š Š ˆˆƒ ŽŽ Š ƒžž ƒ ƒž Ž ƒ š š š

ˆˆ ƒ ƒ 27

28 ˆ ƒ ƒ Ž ŽŽ Žƒ ƒ ƒ Ž ƒ Š š ƒ ƒ ƒ ˆ ƒ Š ƒ Š ƒ ƒ Ž Ž š ƒ ƒ Ž ˆˆ Ž ˆƒŽ ƒ ˆŽ ˆ ƒ ƒ Ž Š ˆˆ ƒ ƒ Ž Ž ˆˆˆ Ž ˆ Ž ƒ ƒ Ž ˆˆ Ž ƒ ƒ Ž Ž ˆˆˆ Ž ˆƒ ƒ ƒž ƒ ƒ Ž ƒ ƒž ˆŽ ˆ Šƒ Š ˆˆ ƒžž Ž ˆ ˆˆˆ Ž ˆŠƒ Šˆ Šƒ Š ˆ Ž ˆŠƒ Š ƒ ƒ Ž Š Ž ˆˆ ƒ Š ˆ ˆ ƒ ˆˆˆ Ž

29 ˆ ƒ ƒ Ž Ž ˆ Š ƒ ƒ Ž ˆ Ž ˆ ƒ ƒ Ž ˆ Ž ˆˆ Š ƒ ƒ Ž ƒžž ˆ ˆˆˆ ˆŽ ˆŽ ƒ Žƒ ƒ ˆ ƒž œ Ž Ž Ž ˆ ƒž ƒ ˆˆ ƒ ˆˆˆ Ž Ž ƒ Š ƒž ƒ Žƒ ˆ ƒž œ š š š ˆ ƒž ƒ ˆˆ ˆˆˆ Ž

30 š ƒž ƒ ƒ ˆ ƒž ˆƒƒ ƒ ƒ ƒ ƒ Ž Žƒ ƒ ƒ ƒ ˆ ƒž œ ƒ ƒ ƒ ˆ ƒž ƒ ˆˆ ˆˆˆ Ž ƒž Ž ƒ ƒž ƒ ƒ Ž ˆ ƒž ƒ Š ˆˆ ƒž ƒ ƒ ƒž ƒž Ž ˆ ƒž Žƒ ƒž Žƒ ƒ ˆ ƒž ƒ ƒž œ ƒž ƒž ƒ Ž ˆˆ ƒž ƒ ƒ ƒž ƒž Ž ˆ ƒž Žƒ š ˆˆ Ž ƒ Ž ˆ ƒž Žƒ Ž ƒ ˆˆ Ž ƒ Ž ƒ Ž Š Šƒ Šƒ Š ƒž Žƒ ˆ Ž ˆ Šƒ

31 ƒ ƒž ƒ ƒ ƒ Ž Žƒ ƒž ƒ ƒ ƒ ƒ ƒ š ˆ ƒž œ ƒ ƒ ƒ š ƒ ƒ ƒ ƒ ƒ š ƒ š ˆ ƒž ƒ ˆˆ ƒž ˆˆˆ Ž ƒ ƒ Ž ƒ ƒ ƒž ƒ š ƒž ƒ ˆˆ Š Š ƒ ƒ Ž ƒ ƒ ƒ Ž ˆˆˆ Ž ˆ ˆ Ž ƒ ˆ Ž ˆ ƒ Žƒ ˆŽ ƒ ƒ ˆ Ž š ˆ ƒž œ ˆ Ž š ˆ ˆ Ž Ž š š ˆ ƒž ƒ ˆˆ ˆŽ ˆˆˆ Ž ˆ š ƒž ƒ Š ˆ ƒ Š ˆ ˆ ƒž ƒ Ž ˆ Ž Žƒ ƒ Š Ž ƒ Š Ž

32 Ž ƒž ƒ Ž Ž ƒž ƒ Ž ˆ Š ˆ ƒ Žƒ ˆ ƒ ƒ ˆ š ˆ ƒž œ ˆ š ˆ ˆ š š ˆ ƒž ƒ ˆˆ ˆ ˆˆˆ Ž ˆ š ƒž ƒ Š ˆ ƒ Š ˆ ˆ ƒž ƒ Žƒ ƒ ƒ ƒ ƒ ˆ ƒž œ ƒ ƒ ƒ ƒ ƒ ƒ ˆ ƒž ƒ ˆˆ ˆˆˆ Ž Ž ƒž Ž ƒ ƒ ƒž ƒ ƒ Ž

33 ƒž Ž ƒž Š Ž ˆˆ ƒ ƒ ƒ ƒž ƒ ˆ ˆˆ Ž ˆ ƒ ƒ Ž Ž ƒ ƒ ƒž Š ƒ ƒ Ž ƒ ƒ ƒž ƒž ƒ Ž ˆˆ ƒ ƒ ƒž ƒ ˆˆˆ Ž Žƒ ƒ ƒ ƒ ƒ ƒ ˆ ƒž œ ƒ ƒ ƒ ƒ ƒ ƒ ˆ ƒž ƒ ˆˆ ƒ ˆˆˆ Ž Ž ƒž Ž ƒ ƒ ƒž ƒ ƒ Ž ƒž Ž ƒž Š Ž ˆˆ ƒ ˆ ƒ ƒ ƒž ƒ ˆ ˆˆ Ž ˆ ƒ ƒ Ž Ž ƒ ƒ ƒž Š ƒ ƒ Ž ƒ ƒ ƒž ƒž ƒ

34 Ž ˆˆ ƒ ˆ ƒ ƒ ƒž ˆˆˆ Ž ˆ ƒž ˆˆ ƒ ˆ ƒ š ƒ ƒ Š š Žƒ ƒ ƒ ƒ ƒž ƒž ˆ ƒž œ ƒ ƒž ƒž ƒ ƒ ƒž ƒž ƒž ƒž ˆ ƒž ƒ ˆˆ ˆˆˆ Ž ˆ ƒž ƒž ƒ Žƒ ƒ ƒž ƒž ƒ Žƒ ƒ ƒž ƒž ƒž ƒ ƒ ƒž ƒž ƒ ƒ ƒž ƒž ƒž ƒ ƒ ƒž ƒž ƒ ˆƒŽ Š ƒž Žƒ ˆ ƒž œ ƒž ƒž ƒž ˆ ƒž ƒ ˆˆ ˆˆˆ Ž

35 ƒž ƒž ƒ Žƒ ƒ ƒ ƒ ƒ ƒ ƒ ƒž ˆ ƒž œ ƒ ƒ ƒ ƒž ƒ ƒ ƒ ƒ ƒ ƒ ƒž ƒž ˆ ƒž ƒ ˆˆ ƒ ˆˆˆ Ž ƒ ƒ ƒž ƒ Š ƒ ƒ ƒž ƒ ƒ ƒ ƒ ƒž ƒž ƒ ƒ ƒ Ž ƒ ƒ ƒ ƒž ƒ ƒ ƒ ƒ Ž ˆˆˆ Ž Žƒ ƒ š ˆ ƒž œ ƒ ƒ ƒ š ƒ ƒ ƒ ƒ ƒ ƒ š š ˆ ƒž ƒ ˆˆ ƒ š ˆˆˆ Ž ƒ ƒ ƒ Šƒ ƒ ƒ Žƒ ƒ œ

36 ˆ ƒž œ ƒ ƒ ƒ ƒ ƒ ƒ ƒ ƒ ƒ ˆ ƒž ƒ ƒ ƒ ƒ ƒž Žƒ Š š ˆ ƒž œ š š š ˆ ƒž ƒ ˆˆ Š š ˆˆˆ Ž š ƒž ƒ Žƒ Ž ƒ ˆ ƒž œ š š š ˆ ƒž ƒ ˆˆ Ž ƒ ˆˆˆ Ž ƒ š Š Š ˆƒŽ

37 Žƒ ˆ ƒž œ ƒž ƒž ƒž ˆ ƒž ƒ ˆˆ ˆˆˆ Ž ƒž Žƒ Ž ƒ ˆ ƒž œ ƒž ƒž ƒž ˆ ƒž ƒ ˆˆ Ž ƒ ˆˆˆ Ž ƒž Žƒ ˆ ƒž œ ƒž ƒž ƒž ˆ ƒž ƒ ˆˆ ˆˆˆ Ž ƒž Ž Ž ƒ ƒ Žƒ ƒ ƒ Ž ƒ ƒ ƒ ˆ ƒž œ ƒ ƒ ƒ

38 ˆ ƒž ƒ ˆˆ ƒ ƒ Ž ˆˆˆ Ž Ž ƒ ƒ ƒ Ž Žƒ ƒ ƒ Ž ƒ š ˆ ƒž œ Ž ƒ š Ž Ž ƒ ƒ š š ˆ ƒž ƒ ˆˆ ˆˆˆ Ž ƒ ƒž ƒ ˆˆ ƒ ƒ ƒ Ž ƒ ƒ Ž ˆˆˆ Ž Š Ž ƒž ƒ ˆˆ š Ž ƒ ˆˆˆ Ž Ž ƒ Š ƒž ƒ š ƒž ƒ Ž Žƒ Š Ž ƒ ƒ Ž š

39 ˆ ƒž œ Ž š Ž Ž š š ˆ ƒž ƒ ˆˆ Š Ž ˆˆˆ Ž Š Ž š ƒž ƒ Ž ƒ Š ƒž ƒ Ž Žƒ Žƒ ƒ ƒ Ž ˆ ƒ ƒž ˆ ƒž œ Ž ˆ ƒ ƒž Ž Ž ˆ ˆ ƒ ƒž ƒ ƒž ˆ ƒž ƒ ˆˆ Žƒ ˆˆˆ Ž ˆˆ ƒ ƒž ƒ ƒž ˆˆˆ Ž ˆ ˆ ƒž Ž ƒ ƒž Žƒ ƒžž ƒ ƒ ƒ ƒ Ž ˆ ƒž œ ƒ ƒ Ž

40 ƒ ƒ ƒ Ž ƒ Ž ˆ ƒž ƒ ˆˆ ƒžž ˆˆˆ Ž ˆˆ Š ƒ Š ƒ ƒž ƒ ƒ ˆˆˆ Ž ˆˆ ƒ ƒž Ž Š ˆˆ ˆ ƒ ƒž ˆˆˆ Ž Ž ˆˆ ƒ ƒž Šƒ ƒ ƒ ˆˆˆ Ž ƒ ƒ ˆ ƒ ƒž ˆ ƒ ƒ œ ƒ Ž œ Š ˆˆ ƒ ƒ Ž œ ƒ ƒ ƒž ƒ ƒ œ ƒ ƒ ƒ ƒ ƒ Š Š š ƒ ƒ ƒ ƒ ƒ ƒž ƒ ƒ Ž ƒ ƒ ƒ ƒž ƒ š Š ˆ Ž ˆ ƒ ƒž Ž ƒ Š ƒž ƒ ˆˆ Š ˆ š ˆˆˆ Ž Ž

Ž ƒ ˆŽ ˆŽ 41