Nada

^ Upp till aktuella kurssidan.


Kompletterande uppgifter till labb 5

Jag har fått några frågor angående vad som gäller på labb 5. Tydligen är formuleringarna i labbhäftet till viss del oklara, så jag börjar med att förtydliga målet med laborationen: Målet är att ni ska använda kunskaperna ni har skaffat er under kursen för att implementera en översättare från en notation till en annan. Översättaren ska använda både lexikal och syntaktisk analys. Det finns naturligtvis även ett annat syfte med labben, nämligen att jag som kursledare ska kunna examinera er på kursen, det vill säga att jag ska kunna verifiera att ni har lärt er det som kursen omfattar. Meningen är alltså inte att man ska hitta på något fiffigt hack i C, perl, sed, awk eller vad det nu må vara, för att kunna skaffa sig några lätta labbpoäng.

Nu till några mer konkreta frågor:

Bokning av redovisningstid

Boka bara en redovisningstid per grupp.

Översättaren från Pascal till C

Man får lite problem med att översätta Write(), WriteLn(), Read() och ReadLn(); de kan nämligen ta ett variabelt antal argument av godtyckliga typer. Visserligen kan man fixa till det genom att i översättaren ta reda på vilka typer argumenten har, och sedan konstruera motsvarande formatsträngar till printf() och scanf(). Det blir förmodligen lite jobbigt, och använder tekniker som går utanför denna kurs. (Man måste implementera en symboltabell och i variabeldeklarationssatser hålla reda på vilka typer variablerna får. Denna kunskap måste man sedan använda för att propagera upp typerna i alla slags uttryck.)

Ett sätt att komma runt problemet är att istället översätta till C++. Då genererar man kod som i princip är "C med strömmar". Satsen WriteLn(foo,bar); översätts då till cout << foo << bar << eol(); Övriga varianter översätts analogt.

Ett annat sätt är att översätta till Java. Då blir varje Pascal-program en klass, och varje funktion i klassen en statisk metod. I detta fall kan WriteLn(foo,bar); exempelvis översättas till System.out.print(foo); System.out.println(bar);

I labbhäftet står det att översättaren ska klara av WITH-DO-satser. Efter att ha funderat en stund på detta har jag beslutat mig från att släppa på det kravet: Översättaren behöver alltså inte klara WITH-DO-satser.

Programförskönaren för C-kod, Javakod eller liknande

Man kan tycka att det räcker att använda Flex, och om man bara ska fixa indragningar är det förmodligen så. Om man använder en hel C-grammatik kan man emellertid göra något mycket bättre, nämligen en enhetliggörare, dvs ett program som skriver ut C-koden på ett enhetligt sätt. Detta kan innebära att det alltid är en deklaration eller en sats per rad, att alla funktioner, parametrar och variabler kommenteras på något bestämt format, att onödiga parenteser i uttryck tas bort etc. En lämplig konvention är till exempel att binära operatorer ska omgärdas av blanksteg och att unära operatorer ska sitta tätt ihop med sin operand, hur ska då a+++b---c förskönas? Sådant kräver en syntaktisk analys. (Ett program som skulle kunna bli populärt är en förskönare som genererar C-kod enligt INDA-mallen.)

Ett lämpligt sätt att göra detta på kan vara att bygga upp en internrepresentation som man sedan traverserar för att generera den förskönade koden. Man behöver inte ha en internrepresentation av hela programmet samtidigt, det går att hitta logiska mindre delar.

Ett annat sätt är att stegvis bygga upp den förskönade koden genom att använda $-variablerna i Bison. Då kan man med fördel skriva ut det man har byggt upp på någon lämplig nivå i syntaxträdet, så slipper man ha hela programmet i minnet samtidigt.

Hur man än gör blir kommentarerna ett problem, eftersom de skalas bort i den lexikala analysen. Här måste man förmodligen trixa lite, och under den lexikala analysen spara undan kommentarer i någon global variabel. Innehållet i denna variabel skriver man sedan ut på någon lämplig plats i syntaxträdet.

Vacker utskrift av C-kod, Javakod eller liknande

Här gäller samma saker som för programförskönaren ovan.

Konvertering av KTH:s schema i textformat till HTML

Vårens schema verkar bara finnas tillgängligt i HTML-format. Däremot finns höstens schema i textformat, från URL:en http://www.kth.se/utbildning/studerandeinformation.html, länken "Läs- och tentaschema HT 97 (gopher)".

^ Upp till aktuella kurssidan.


Sidansvarig: <enge@nada.kth.se>
Senast ändrad 19 mars 1998