kind spelling Scanning



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

F4. programmeringsteknik och Matlab

Programmering A. Johan Eliasson

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

Klassdeklaration. Metoddeklaration. Parameteröverföring

Inlämningsuppgift MiniPlotter

OOP Objekt-orienterad programmering

Reguljära uttryck Grammatiker Rekursiv nedåkning Allmänna kontextfria grammatiker. Syntaxanalys. Douglas Wikström KTH Stockholm

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Grammatik. BNF-grammatik

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

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

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

Outline. For. I istället för att följa det normala ordningen, man ändra den. I i Java får man inte göra hopp hur som helst

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

Detta dokument är ett exempel, cirka hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

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

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

Kompilatorer och interpretatorer

Tentamen OOP

TENTAMEN OOP

Imperativ programmering. Föreläsning 2

TENTAMEN OOP

Föreläsning 7. Träd och binära sökträd

Villkor och tester. Utförande satser bygger upp metoderna, man brukar finindela detta i: sekvenser. Ett program består i princip av: selektioner (val)

Alfabeten, strängar och språk. String

Omgivningar. Omgivningar är viktiga eftersom de avgör vilka namn som är synliga och därmed dessas innebörd och de värden som är förknippade med dem.

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

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

TDDC77 Objektorienterad Programmering

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

OOP Tenta

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy cards. Slingor

Parallellism, återblick

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

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Lösningsförslag tentamen FYTA11 Java

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

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

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

Chapter 4: Writing Classes/ Att skriva egna klasser.

OOP Omtenta

Föreläsning 3-4 Innehåll

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

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

TENTAMEN OOP

OOP Objekt-orienterad programmering

Automatateori (2) Idag: Sammanhangsfria språk. Dessa kan uttryckas med Grammatik PDA

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Tentamen i Objektorienterad programmering

OOP Tentamen

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

OOP Objekt-orienterad programmering

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

Enkla datatyper minne

Programmeringsteknik och Matlab. Dagens program. Viktiga datum. Repetitionsexempel. Repetition av if/else, for, while och Scanner

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 7: Syntaxanalys

PROGRAMMERING-Java Omtentamina

Exempel på användning av arv: Geometriska figurer

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Definition. Mängden av reguljära uttryck på alfabetet Σ definieras av. om α och β är reguljära uttryck så är (α β) ett reguljärt uttryck

Kompilatorteknik. Görel Hedin Datavetenskap Lunds Tekniska Högskola. Temaföreläsning, Datorer i system, 2014

Tentamen, Algoritmer och datastrukturer

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

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

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Föreläsning 7: Syntaxanalys

Föreläsning 10 OM DELMÅLSKONTROLLEN ; VARIABLERS SYNLIGHET STRING OCH STRINGBUILDER

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

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

Obligatorisk uppgift 5

Föreläsning 7-8 Innehåll

Tentamen EDAF30 Programmering i C++

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

Introduktion till Datalogi DD1339. Föreläsning 3 29 sept 2014

Föreläsning ALGORITMER: SÖKNING, REGISTRERING, SORTERING

TDIU01 - Programmering i C++, grundkurs

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Fält av referenser. Konstruktorerna används för att skapa Bilar och Trafikljus.

Programmering för språkteknologer II, HT2011. Rum

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.

Tentamen, EDA501 Programmering M L TM W K V

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Tentamen i Grundläggande Programvaruutveckling, TDA548

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

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

Objektorienterad programmering i Java

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Lösningsförslag till exempeltenta 1

Objekt som argument. Föreläsning 7-8 Innehåll. Hur komma åt den andra kvadratens attribut? Anropa metod på objektet självt

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 25 maj 2009

Språkkonventioner och redigering av tal.

Transkript:

sats terminal Kompilatorteknik 2015 källprogram! Exempel program let var v : integer; const t ~ 3 in v := v + t kind spelling Scanning LET let föreläsningsfilmer Scannerns eller den lexikala analysatorns uppgift är att transformer en ström av tecken till en ström av token, dvs. de enskilda tecknen i källprogrammet skall grupperas till symbolerna i språket. Förutom token innehåller källprogrammet separatorer - kommentarer, blanktecken, eol,... vars ända uppgift är att skilja åt token och göra programmet lättläst. 6 (1/4) VAR var IDENTIFIER v COLON : IDENTIFIER integer... Token ::= Identifier... eot Separator ::= Comment... De regler som bestämmer hur språkets token konstrueras ur de enskilda tecknen kan ses som ett subspråk där källspråkets token utgör subspråkets satser källspråkets tecken utgör subspråkets terminala symboler För ett sådant språk kan en reguljär grammatik (grammatik som ej uppvisar self-embedding) - lexikal grammatik - konstrueras. I en lexikal grammatik (specifiserar källspråkets lexikon som ingår i språkets konkreta grammatik) består de terminala symbolerna av tecken och de icke-terminala symolerna inkluderar Token och Separator. Scannern skall, liksom parsern, leta fram början och slutet på fraser/satser. Scanning är enklare än parsing. Varför? Mini-Triangel lexikon Operator ::= + - * / < > = \ Identifier ::= Letter Identifier Letter Identifier Digit Integer-Literal ::= Digit Integer-Literal Digit Letter ::= a b... z Digit ::= 0 1 2 3 4 5 6 7 8 9 Comment ::=! Graphics eol Graphics ::= space Grapics synligt_tecken Grapics

föreläsningsfilmer 6 (2/4) Representation av token En token representeras av ett objekt med två fält: token typ - kind representeras som en konstant token stavning - spelling representeras som en teckensträng IDENTIFIER integer Token.kind Token.spelling public class Token { public byte kind; public String spelling; public Token (byte kind, String spelling) { this.kind = kind; this.spelling = spelling; public final static byte IDENTIFIER = 0, INTLITERAL = 1, OPERATOR = 2, BEGIN = 3, // begin CONST = 4, // const DO = 5, // do ELSE = 6, // else END = 7, // end IF = 8, // if IN = 9, // in LET = 10, // let THEN = 11, // then VAR = 12, // var WHILE = 13, // while SEMICOLON = 14, // ; COLON = 15, // : BECOMES = 16, // := IS = 17, // ~ LPAREN = 18, // ( RPAREN = 19, // ) EOT = 20; // end of text Obs! Ej slutlig verson Token sekvensen utgör gränssnittet mellan parsern och scannern och behöver ej lagras explisit eftersom toknarna ändast skall presenteras för parsern i ordningsföljd, varvid informationen överför till AST-trädet. public abstract class Terminal extends AST { public class String spelling;...

föreläsningsfilmer 6 (3/4) Systematisk utveckling av en scanner Scannern är mycket lik parsern och kan utvecklas på likartat sätt: 1. Uttryck den lexikala grammatiken i EBNF. Behövliga transformationer görs så att grammatiken är reguljär med ömsesidigt uteslutande startsymboler för alternativen. Substituera för att minska antalet produktioner. 2. Överför varje EBNF produktionsregel N ::= X till en scanning metod scann vars kropp bestäms av X. 3. Sammanställ scannern av En privat variabel currentchar samt de privata variabler currentkind och currentspelling De privata scan metoderna utvecklade i steg 2 utökade så att de returnerar tokens kind. Privata hjälpmetoder take och takeit. En public scan metod som avlägsnar alla separatorer före föjande token samt skapar och returnerar token. Separatorer får fritt insättas var som helst i program. dvs.: Program ::= (Separator* Token-utom-eot)* eot Alla icke-terminaler kan substitueras i en regulär grammatik. Ju färre icke-terminaler destu färre scanmetoder.

6.1 Mini-Triangles lexikala grammatik:? Nyckelorden saknas Mini triangel lexikon Token ::= Identifier Integer-Literal Operator ; : := ~ ( ) eot Separator ::= Comment space eol Operator ::= + - * / < > = \ Identifier ::= Letter Identifier Letter Identifier Digit Integer-Literal ::= Digit Integer-Literal Digit Letter ::= a b... z Digit ::= 0 1 2 3 4 5 6 7 8 9 Comment ::=! Graphics eol Graphics ::= ε space Graphics synligt_tecken Graphics space står för blanktecken, eol för tecknet för radslut och eot för endof-text. Grammatiken skiljer ej mellan identifierare och nyckelord, med scannern skall bilda olika tokentyper för dem. Klassificeringen görs i Token-klassens konstruktor. public class Token { Om tokens kind är identifier, undersöks om stavningen är lika med något av nyckelordens spelling. Om så är fallet ändras kind till ifrågavarande nyckelords värde. public byte kind; public String spelling; public Token (byte kind, String spelling) { this.kind = kind; this.spelling = spelling; if (kind == IDENTIFIER) for (int k = BEGIN; k <= WHILE; k++) if (spelling.equals(spellings[k])) { this.kind = (byte)k; break; public final static byte IDENTIFIER = 0, INTLITERAL = 1,... RPAREN = 19, // ) EOT = 20; // end of text private final static String[] spellings = { <identifier>, <integer-literal>, <operator>, begin, const, do, else, end, if, in, let, then, var, while, ;, :, :=, ~, (, ), <eot>

6.2 Steg 1: Uttryck grammatiken i EBNF och gör behövliga transformationer Är grammatiken reguljär? - nej ty produktionsreglerna för identifier, Integer-Literal och Graphics är rekursiva Identifier ::= Letter Identifier Letter Identifier Digit Integer-Literal ::= Digit Integer-Literal Digit Graphics ::= ε space Graphics synligt_tecken Graphics Eliminera rekursion en reguljär grammatik innehåller ej self-embedding. Token ::= Identifier Integer-Literal Operator ; : := ~ ( ) eot Separator ::= Comment space eol Operator ::= + - * / < > = \ Identifier ::= Letter ( Letter Digit )* Integer-Literal ::= Digit Digit* Letter ::= a b... z Digit ::= 0 1 2 3 4 5 6 7 8 9 Comment ::=! Graphics eol Graphics ::= (space synligt_tecken )* En implementering av en scanner blir enklare destu färre produktioner som ingår i grammatiken: Eliminera alla icke-terminaler utom Token och Separator genom substitution Token ::= Letter ( Letter Digit )* Digit Digit* Operator ; : := ~ ( ) eot Separator ::=! (space synligt_tecken )* eol space eol Operator ::= + - * / < > = \ Letter ::= a b... z Digit ::= 0 1 2 3 4 5 6 7 8 9 Token ::= (a b... z ) ( a b... z 0 1 2 3 4 5 6 7 8 9 )* (0 1 2 3 4 5 6 7 8 9) (0 1 2 3 4 5 6 7 8 9)* + - * / < > = \ ; : := ~ ( ) eot Separator ::=! ( space A B... all synliga tecken )* eol space eol

6.3 Token ::= (a b... z ) ( a b... z 0 1 2 3 4 5 6 7 8 9 )* (0 1 2 3 4 5 6 7 8 9) (0 1 2 3 4 5 6 7 8 9)* + - * / < > = \ ; : := ~ ( ) eot Separator::=! ( space A B... all synliga tecken )* eol space eol Är startsymbolerna för alternativen ömsesidigt uteslutande? - nej två alternativ startar med kolon Vänster faktorisera : := Token ::= (a b... z ) ( a b... z 0 1... 9 )* (0 1... 9) (0 1... 9)* + - * / < > = \ ; : ( ε = ) ~ ( ) eot Separator::=! ( space A B... all synliga tecken )* eol space eol *

6.4 Steg 2: Överför varje produktionsregel N ::= X till en scanning metod scann private void scantoken (){ Token ::= switch (currentchar) { case a : case b : case c :... case y : case z : Letter while (isletter(currentchar) isdigit(currentchar)) ( Letter Digit break; )* case 0 : case 1 : case 2 :... case 8 : case 9 : Digit while (isdigit(currentchar)) Digit* break; case + : case - : case * : case / : case < : case > : case = : case \ : case ; : case ~ : case ( : case ) : + - * / < > break; = \ ; ~ ( ) case : : : switch (currentchar) ( case = : = break; default: break; ε ) case \000 : break;bakeit(); eot default: raportera ett lexikalt fel ) private void scanseparator (){ Separator ::= switch (currentchar) { case! : {! while (isgraphic(currentchar)) Graphic* take( \n ); eol break; case : case \n : space eol break; )*

6.5 Steg 3: Scan metoderna utvecklade i steg 2 utökas så att de returnerar tokens kind och spelling. Obs! Tokensekvensen behöver ej explisit lagras private byte scantoken (){ Token ::= switch (currentchar) { case a : case b : case c :... case y : case z : Letter while (isletter(currentchar) isdigit(currentchar)) ( return Token.IDENTIFIER; )* case 0 : case 1 : case 2 :... case 8 : case 9 : Digit while (isdigit(currentchar)) Letter Digit Digit* return Token.INTLITERAL; case + : case - : case * : case / : case < : case > : case = : case \ : + - * / < > \ = return Token.OPERATOR; case ; : ; return Token.SEMICOLON; case ~ : ~ return Token.IS; case ( : ( return Token.LPAREN; case ) : ) return Token.RPAREN; case : : : switch (currentchar) ( case = : = return Token.BECOMES; default: return Token.COLON; ε ) case \000 : return Token.EOT; default: raportera ett lexikalt fel ) eot Nyckelordenas kind blir IDENTI- FIER.

6.6 Sammanställ scannern: public class Scanner { private char currentchar = källprogrammets första tecknen; private byte currentkind; private StringBuffer currentspelling; private void take(char expectedchar) { if (currentchar == expectedchar) { currentspelling.append(currentchar); currentchar = källprogrammets nästa tecken; else raportera lexikal fel private void takeit() { currentspelling.append(currentchar); currentchar = nästa tecknet i källprogrammet; private boolean isdigit(char c) {... private boolean isletter(char c) {... private boolean isgraphic(char c) {... private byte scantoken() {... private void scanseparator() {... public Token scan() { returnerar nästa token while (currentchar ==! currentchar == currentchar == \n ) ( scanseparator(); Separator )* currentspelling = new StringBuffer(""); currentkind = scantoken(); Token return new Token((byte)currentKind, currentspelling.tostring()); Sammanställ scannern av Privata variabler currentchar, currentkind och currentspelling De privata scan metoderna utvecklade i steg 2 utökade så att de returnerar tokens kind. Privata hjälpmetoder take och takeit. En public scan metod som avlägsnar alla separatorer före föjande token samt skapar och returnerar denna. ( scannar Separator*Token ) Program ::=(Separator*Token-utom-eot)* eot