Recursive-Descent Parsing

Vergelijkbare documenten
VERTALERBOUW. Handleiding bij Practicum. Theo Ruys. Naam: Studierichting: Docent: Practicumassistent: assistent:

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

colleges recursieve datastructuren college 9 prioriteit van operatoren prioriteit in recursive descent parser

Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing

Vakgroep CW KAHO Sint-Lieven

Tentamen Imperatief Programmeren

Demo document template available on the Rapptorlab website

Practicumopgave 3: SAT-solver

Programmeren (1) Examen NAAM:

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

compileren & interpreteren - compileren: vertalen (omzetten) - interpreteren: vertolken

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Zelftest Programmeren in Java

Tentamen Object Georiënteerd Programmeren TI januari 2013, Afdeling SCT, Faculteit EWI, TU Delft

Project Software Engineering XML parser: Parsen van een xml CD catalogus

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk.

Deeltentamen Grammatica s en ontleden 22 december 2005

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Modelleren en Programmeren

NAAM: Programmeren 1 Examen 31/08/2011

Javascript oefenblad 1

IMP Uitwerking week 13

software constructie recursieve datastructuren college 15 5 stappen plan ontwerpen de software bestaat uiteindelijk uit datatypen functies

Programmeren 1 23 januari 2013 Prof. T. Schrijvers

recursie Hoofdstuk 5 Studeeraanwijzingen De studielast van deze leereenheid bedraagt circa 6 uur. Terminologie

Samenvatting L A TEX-cursus

Stacks and queues. Introductie 45. Leerkern 45. Terugkoppeling 49. Uitwerking van de opgaven 49

DIAGNOSTISCHE TOETS Softwaresystemen UITWERKING

Het omzetten van reguliere expressies naar eindige automaten, zie de vakken Fundamentele Informatica 1 en 2.

INFORMATICA 1STE BACHELOR IN DE INGENIEURSWETENSCAPPEN

Tentamen Programmeren in C (EE1400)

Compilers.

public Paneel() { knop = new JButton( Klik ); knop.addactionlistener( new KnopHandler() ); tekstvak = new JTextField(10); add(knop); add(tekstvak);

Leren Programmeren met Visual Basic 6.0 Les 3+4. Hoofdstuk 4 : De Selectie

De Meta-circulaire Pico evaluator

C++ programmeermethoden Bachelor Kunstmatige Intelligentie

NAAM: Programmeren 1 Examen 29/08/2012

Recursion. Introductie 37. Leerkern 37. Terugkoppeling 40. Uitwerking van de opgaven 40

Inhoud. Eindtoets. Introductie 2. Opgaven 3. Bijlage bij opgaven 9. Terugkoppeling 12

Programmeren in C++ Efficiënte zoekfunctie in een boek

Syntax- (compile), runtime- en logische fouten Binaire operatoren

Programmeren 1 20 januari 2012 Prof. T. Schrijvers

Programmeren in Java les 3

Stacks and queues. Hoofdstuk 6

Ingebouwde klassen & methodes

Toets Programmeren, 2YP05 op donderdag 13 november 2008, 09:00-12:00

Modelleren en Programmeren voor KI

Kleine cursus PHP5. Auteur: Raymond Moesker

Uitwerking Tweede deeltentamen Imperatief programmeren - versie 1 Vrijdag 21 oktober 2016, uur

Tentamen Objectgeorienteerd Programmeren TI februari Afdeling ST Faculteit EWI TU Delft

In de tweede regel plaatsen we in het gereserveerde stukje geheugen een getal.

BEGINNER JAVA Inhoudsopgave

Inleiding Software Engineering! Unit Testing, Contracten, Debugger! 13 Februari 2014!

Datastructuren Programmeeropdracht 3: Expressies. 1 Expressies. Deadline. Dinsdag 8 december 23:59.

Informatica: C# WPO 13

Introductie in flowcharts

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Sparse columns in SQL server 2008

After that, the digits are written after each other: first the row numbers, followed by the column numbers.

Visual Basic.NET. Visual Basic.NET. M. den Besten 0.3 VB. NET

Tentamen Programmeren in C (EE1400)

Compilers (2IC25) docent: G. Zwaan, HG 5.41, tel. ( )4291, webpagina:

Modelleren en Programmeren

Een topprogrammeur in het OO programmeren is Graig Larman. Hij bedacht de volgende zin:

4 Invoer en uitvoer. 4.1 Toegang tot de standaardbibliotheek

Informatica: C# WPO 12

Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 6 november 2015, uur

Opdrachten herhalen. public void tekenscherm (object o, PEA pea) { int x; x = 1; zolang de voorwaarde geldig is

Tentamen Inleiding Programmeren (IN1608WI), duur van de toets 2 uur Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Elementary Data Structures 3

Implementatie en toepassing van de trie

College Notatie, Recursie, Lijsten

Datastructuren: stapels, rijen en binaire bomen

Een gelinkte lijst in C#

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

Overerving & Polymorfisme

Tentamen Object Georiënteerd Programmeren TI oktober 2014, Afdeling SCT, Faculteit EWI, TU Delft

Tweede college algoritmiek. 12 februari Grafen en bomen

Opgaven. Python Assessment

Project 2: LOTTO simulatie Programmeren I

Implementatie #-operator

Formulieren en waarden posten naar een view

II. ZELFGEDEFINIEERDE FUNCTIES

TENTAMEN Programmeren 1 VOORBEELDUITWERKING

Modelleren en Programmeren

Examen Software Ontwikkeling I 2e Bachelor Informatica Academiejaar Januari, **BELANGRIJK** : Schrijf je naam onderaan dit blad

Specialisatie RTES - Project FunnyScreens. Installatie en gebruik van JUnit

NAAM: Programmeren 1 Examen 21/01/2011

ALGORITMIEK: answers exercise class 7

Een stoomcursus door Edgar de Graaf, november 2006

Tentamen Inleiding Programmeren (IN1608WI), 2 februari 2012, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Vereiste kennis. 1 Java-editor. 2 Het compileren van een programma

Inleiding programmeren

rij karakters scanner rij tokens parser ontleedboom (filteren separatoren) (niet expliciet geconstrueerd) (+ add. inform.) (contextvrije analyse)

Tentamen Programmeren in C (EE1400)

Modelleren en Programmeren

VOORBLAD SCHRIFTELIJKE TOETSEN

Java Les 3 Theorie Herhaal structuren

Implementatie van Programmeertalen (IPT) 4 mei 2001

Transcriptie:

Week 2 Recursive-Descent Parsing PRACTICUM Tijdens dit practicum wordt een eenvoudige one-pass recursive-descent vertaler ontwikkeld in Java. We volgen daarbij hoofdstuk 4 van Watt & Brown. De te ontwikkelen compiler dient een tabel-representatie in LATEX te vertalen naar een tabel-representie in HTML. Opmerking: Het practicum van deze week is niet moeilijk maar wel veel van hetzelfde. De opdracht illustreert dat het redelijk eenvoudig is om een recursive-descent parser te schrijven, maar dat het voor grotere talen sterk aan te bevelen is om dergelijke ontleed-programma s met behulp van een generator automatisch te laten genereren. 2.1 Scanner TEX is een krachtig tekstopmaaksysteem waarmee professioneel drukwerk gemaakt kan worden. TEX is een wereldwijde standaard voor het opmaken van wetenschappelijke artikelen en boeken. TEX is met name geschikt als de tekst veel wiskundige en formules bevat, maar ook met platte tekst heeft TEX geen enkele moeite. Door de vele commando s van TEX lijkt het opmaken van TEX documenten een beetje op programmeren. LATEX is een uitgebreid en krachtig macropakket voor TEX, dat eenvoudiger te gebruiken en te leren is dan TEX. Zo ondersteunt LATEX bijvoorbeeld een tabular-omgeving, waarmee het eenvoudig is om een tabel weer te geven. Voorbeeld. Beschouw het volgende voorbeeld van eentabular-specificatie (ook beschikbaar als sample-1.tex op de Vertalerbouw website). % An example to test the Tabular application. \begin{tabular}{lcr} Aap & Noot & Mies \\ 9

10 Week 2 Recursive-Descent Parsing latextabular ::= begintabular colsspec rows endtabular colsspec ::= LCURLY identifier RCURLY rows ::= rows row ǫ row ::= entries DOUBLE BSLASH entries ::= entry otherentries ǫ otherentries ::= AMPERSAND entries ǫ entry ::= num identifier ǫ begintabular ::= BSLASH BEGIN LCURLY TABULAR RCURLY endtabular ::= BSLASH END LCURLY TABULAR RCURLY num ::= num digit digit identifier ::= identifier letter identifier digit letter digit ::= 0 1... 9 letter ::= a b... z A B... Z BSLASH ::= \ DOUBLY BLASH ::= \\ LCURLY ::= { RCURLY ::= } AMPERSAND ::= & BEGIN ::= begin END ::= end TABULAR ::= tabular Figuur 2.1: BNF grammatica van LATEX stabular omgeving. Wim & Zus & Jet \\ 1 & 2 & 3 \\ Teun & Vuur & Gijs \\ \end{tabular} Het begin (resp. einde) van een tabular-omgeving wordt aangegeven door de string \begin{tabular} (resp. \end{tabular}). Een tabular-omgeving verwacht één argument mee tussen accolades. In het voorbeeld is dat de letter-combinatie lcr. Dit argument geeft aan hoe de kolommen van de tabel geformatteerd moeten worden: l staat voor links-uitgevuld, c staat voor gecentreerd en r staat voor rechts-uitgevuld. Het aantal letters in het argument geeft het aantal kolommen weer. Bij dit practicum zal het argument van de tabular-omgeving niet gebruikt worden: we controleren het aantal kolommen niet en de uitlijning van de kolommen gebruiken we ook niet. De elementen (i.e. entries) van eentabular worden rij-gewijs gespecificeerd. Per rij worden de elementen van elkaar gescheiden door een ampersand-teken ( & ). Een rij wordt afgesloten door twee backslashes ( \\ ). Bij dit practicum zijn de tabel-elementen of een num (een getal) of een identifier (een letter gevolgd door nul of meer letters of cijfers). 1 1 Zij opgemerkt dat we bij dit practicum een vereenvoudigde versie van detabular-omgeving beschouwen. De officiële L A TEX-tabular is veel uitgebreider en er zijn geen beperkingen voor de tabel-elementen.

2.1 Scanner 11 In figuur 2.1 staat een BNF-grammatica voor de tabular-omgeving. Enkele opmerkingen t.a.v. deze grammatica: Deǫ-tekens in de grammatica (bijvoorbeeld bij rows) staan voor leeg, corresponderend met de lege string. In colsspec wordt het argument voor de tabular-omgeving als een identifier gespecificeerd. De eis dat deze identifier uit alleen de letters l, c en r mag bestaan komt dus niet tot uitdrukking in de grammatica. 2.1.1 De grammatica van Fig. 2.1 staat nog niet in de juiste vorm om als basis te dienen voor het algoritme van paragraaf 4.3.4 van Watt & Brown. Gebruik de paragrafen 4.2.2 en 4.2.3 van Watt & Brown om de grammatica in EBNF-formaat te herschrijven en zorg ervoor dat de grammatica geen links-recursieve productieregels meer bevat. Op de website van Vertalerbouw kunt u het bestand Token.java vinden. Dit bestand definieert de klassetoken voor het opslaan van de tokens (d.w.z. terminals) van de latextabular-taal. Zoals u kunt zien worden de strings begin, end en tabular beschouwd als aparte keywords. Ter vergelijking: In paragraaf 4.1.1 en aan het einde van paragraaf 4.5 van Watt & Brown wordt de klassetoken voor Mini-Triangle besproken. 2.1.2 Schrijf nu een klasse Scanner die een latextabular-specificatie kan scannen. De klasse dient tenminste de volgende twee methoden te ondersteunen. public class Scanner { private InputStream in; * Constructor. * @param in the InputStream from which the characters will be read public Scanner(InputStream in) { this.in = in; } } * Returns the next Token from the input. * @return the next Token * @throws SyntaxError when an unknown or unexpected character * has been found in the input. public Token scan() throws SyntaxError Op de website van Vertalerbouw kunt u een lege huls van de de klasse Scanner.java vinden. U dient rekening te houden met het volgende. Als de Scanner een karakter inleest dat het niet kent dient er een SyntaxErrorexceptie gegooid te worden. U dient deze (triviale) klasse SyntaxError zelf te definiëren.

12 Week 2 Recursive-Descent Parsing Een LATEX tabular-specificatie kan ook TEX commentaar bevatten (zie bijvoorbeeld het eerdere voorbeeld, sample-1.tex. Commentaar in TEX begint met een procentteken ( % ) en het commentaar loopt door tot het einde van de regel. Hint: In paragraaf 4.5 van Watt & Brown wordt een scanner voor Mini-Triangle ontwikkeld. 2.1.3 Voeg aan de klasse Scanner een methode main toe, waarmee de Scanner getest kan worden. Voor elk token dat de scanner vindt, moet de naam van het token en de representatie van het token afgedrukt worden. Gegeven het voorbeeld uit de inleiding (sample-1.tex), zou bijvoorbeeld de volgende uitvoer gegenereerd kunnen worden: BSLASH \ BEGIN begin LCURLY { TABULAR tabular RCURLY } LCURLY { IDENTIFIER lcr RCURLY } IDENTIFIER Aap IDENTIFIER Noot IDENTIFIER Mies IDENTIFIER Wim IDENTIFIER Zus IDENTIFIER Jet NUM 1 NUM 2 NUM 3 IDENTIFIER Teun IDENTIFIER Vuur IDENTIFIER Gijs BSLASH \ END end LCURLY { TABULAR tabular RCURLY } Scanning OK. Number of lines: 8

2.2 Parser 13 2.2 Parser In deze opgave gebruiken we de zojuist ontwikkelde scanner om een recursive-descent parser te ontwikkelen voor de latextabular grammatica. Voor iedere non-terminal XYZ schrijven we een methodeparsexyz die ervoor zorgt dat de non-terminal XYZ ontleed wordt. We baseren ons uiteraard niet op de BNF-grammatica van Fig. 2.1, maar op de getransformeerde EBNF-grammatica van Vraag 2.1.1. 2.2.1 Schrijf een klasse Parser die de grammatica van Fig. 2.1 en Vraag 2.1.1 ontleedt. U dient daarvoor paragraaf 4.3.4 van Watt & Brown te volgen. Zij opgemerkt dat de Parser (nog) geen uitvoer mag genereren; de invoer mag alleen geparsed worden. Er wordt verder geen abstracte syntax tree opgebouwd. De klasse dient tenminste de volgende twee methoden te implementeren. public class Parser { * Constructor. * @require scanner!= null * @param scanner the Scanner object to be used for parsing public Parser(Scanner scanner) } * Parses the input as LaTeX tabular specification. * @returns 0 when parsing was successful * >0 when parsing failed. * @note There is no obvious need to return an integer here. public int parse() Enkele opmerkingen: De methodenparsexyz moeten alsprotected methoden gedefinieerd worden. Hierdoor kan deparser eenvoudig uitgebreid en veranderd worden. De SyntaxError-excepties die gegooid kunnen worden door de scanner moeten afgevangen worden in de methodeparse. 2.2.2 Voeg aan de klasse Parser een methode main toe, waarmee de Parser getest kan worden. Nu we een scanner en parser hebben om de latextabular-grammatica te ontleden moeten we er nog voor zorgen dat er een HTML-tabel gegenereerd wordt. De structuur van een HTML-tabel is simpel. Een grammatica van een HTML-tabel staat in Fig. 2.2. Om een HTML-tabel in een webbrowser te kunnen zien dienen er ook nog HTML-document tags om de tabel gezet te worden. Voor de tabel dient te komen: <html><body>, en na de tabel: </body></html>. Voorbeeld. De LATEX tabular-specificatie van het eerdere voorbeeld (sample-1.tex) zou vertaald kunnen worden naar het volgende (complete) HTML-document.

14 Week 2 Recursive-Descent Parsing htmltable ::= BEGIN TABLE rows END TABLE rows ::= row row ::= BEGIN ROW entries END ROW entries ::= entry entry ::= BEGIN ENTRY any-char END ENTRY BEGIN TABLE ::= <table border = "1"> END TABLE ::= <\table> BEGIN ROW ::= END ROW ::= <\tr> BEGIN ENTRY ::= <td> END ENTRY ::= <\td> Figuur 2.2: EBNF grammatica van HTML table. <html><body> <table border="1"> <td>aap</td> <td>noot</td> <td>mies</td> <td>wim</td> <td>zus</td> <td>jet</td> <td>1</td> <td>2</td> <td>3</td> <td>teun</td> <td>vuur</td> <td>gijs</td> </table> </body></html> 2.2.3 Schrijf een klasse ParserEmit, die een subklasse is van de klasse Parser van Vraag 2.2.1. Het verschil metparser is datparseremit tijdens het parsen van een LATEX tabular meteen HTML code wegschrijft. Hint: Ten opzichte van de superklasse Parser is de Java-code van de klasse ParserEmit een stuk korter: slechts een paar methoden vanparser hoeven overschreven te worden. 2.2.4 Test tenslotte uw klasse ParserEmit op enkele voorbeeld LATEX tabular-bestanden, die u op de website van Vertalerbouw kunt vinden.