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

Relevanta dokument
Konstruktion av datorspråk

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

Domänspecifika språk. TDP007 Konstruktion av datorspråk Föreläsning 5. Peter Dalenius Institutionen för datavetenskap

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

Inlämningsuppgift MiniPlotter

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

Deklarativ programmering

TDP007 Konstruktion av datorspråk Hemtentamen

Is Not A Markup Language

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

plätt Linköpings universitet

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

Användar- och systemdokumentation

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

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 4. Peter Dalenius Institutionen för datavetenskap

Deklarativ programmering

Namnet är omvänt men inte koden

Mer om språk och Ruby

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

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

Grundläggande datalogi - Övning 9

Mer om språk och Ruby

Föreläsning 7: Syntaxanalys

Kompilatorer och interpretatorer

Konstruktion av datorspråk

Grammatik. BNF-grammatik

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

Konstruktion av datorspråk

Kompilatorer och interpretatorer

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

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

Datorspråk Breddgivande föreläsning

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

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

Obligatorisk uppgift 5

CAEWS CONTEMPORARY AND EASY WEB SCRIPT IDA ENBRANT. Innovativ Programmering VT 2012 TDP019 Projekt: Datorspråk Linköpings universitet

Introduktion till Ruby

Alfabeten, strängar och språk. String

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

Introduktion till Ruby

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

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

GPT- föreläsning 10. För en vecka sedan Problemlösning på lägre nivå kan sortera funktioner Förra gången

Programmering II (ID1019) :00-11:00

kind spelling Scanning

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

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

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

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

Konstruktion av datorspråk

Karlstads Universitet, Datavetenskap 1

Prova på-laboration i Ruby

12. Relationer och funktioner

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

Användarhandledning Version 1.2

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

Konstruktion av datorspråk

Sätt att skriva ut binärträd

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

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Våra enkla funktioner eller procedurer

TDP002 - Imperativ programmering

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

Exempel: Exempel: Exempel: Exempel: $djur=array("ko","katt","älg"); foreach ($djur as $d) { echo $d. " "; } Resultat. ko katt älg

Dataabstraktion. TDDD73 Funktionell och impterativ programmering i Python Föreläsning 12. Peter Dalenius Institutionen för datavetenskap

Dataabstraktion. TDDD73 Funktionell och imperativ programmering i Python Föreläsning 12. Peter Dalenius Institutionen för datavetenskap

Tentamen i Grundläggande Programvaruutveckling, TDA548

Översikt Föreläsning 1. Trivicalc. Vad är trivicalc? En cell. Områden på skärmen. SMD168/SMD135 Fredrik Bengtsson

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

12. Relationer och funktioner

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

Implementering av en Lua-parser. Oskar Schöldström

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

Ö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 9-10 Innehåll

Kontextfria grammatiker

Hur man programmerar. Exempel på problemlösning i Python

Classes och Interfaces, Objects och References, Initialization

DD1314 Programmeringsteknik

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

10. Mängder och språk

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Algoritmer och datastrukturer Frivilliga bonusuppgifter

Tekniska högskolan vid Linköpings universitet Innovativ Programmering TDP019 Projekt: Datorspråk

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

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

Imperativ programmering. Föreläsning 2

TDP002 Imperativ programmering

Partiell parsning Parsning som sökning

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

Språkteknologi och Open Source

TDIU01 - Programmering i C++, grundkurs

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

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

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

Emacs. Eric Elfving Institutionen för datavetenskap (IDA) 22 augusti 2016

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Transkript:

Parsning TDP007 Konstruktion av datorspråk Föreläsning 6 Peter Dalenius Institutionen för datavetenskap 2017-02-14

2 Analys av källkod Lexikalisk analys Bildar tokensutifrån källkodens text. Syntaktisk analys (parsning) Kontrollerar att koden är syntaktiskt korrekt Bygger upp en datastruktur (oftast en trädstruktur) som motsvarar källkoden för vidare bearbetning i nästa steg. Semantisk analys Kontrollerar t.ex. typfel. Fler steg, beroe på uppgiften

d e f f ( n ) \n i f n = = 0 --- 3 Lexer Ström av tecken def f ( n ) if n == 0 --- Parser Ström av tokens function name param body AST (Abstrakt syntaxträd) f n selection resultat programkod i annat språk

4 BNF-grammatik expr ::= term term + term term term term ::= factor factor * factor factor / factor factor ::= number identifier ( expr ) 1 + ( 2 * 3 )

5 Verktyg för generering av verktyg Klassiska Unix-verktyg för C: lexär ett verktyg för att skapa lexers, där man specificerar språkets lexikaliska struktur med reguljära uttryck. yaccär ett verktyg för att skapa parsers, där man specificerar språkets syntax med en kontextfri grammatik (ofta uttryck med BNF). Det finns motsvarande verktyg för Ruby också, t.ex. ruby-lex och racc.

6 Parsern som vi använder Två basklasser: Rule representerar en syntaktisk regel. Parser representerar själva parsern (generisk). Med hjälp av dessa skapar vi ett litet domänspecifikt språkså att vi lätt kan göra en egen parser för ett valfritt språk. I labbfilerna finns exempelparsern DiceRollersom är ett litet språk för att slå tärningar och räkna ut enkla matematiska uttryck. Alla tre klasserna Rule, Parseroch DiceRollerfinns i filen rdparse.rb. Detta är en Recursice Descent Parser, därav namnet.

7 Användning av DiceRoller-exemplet irb(main):1696:0> DiceRoller.new.roll [diceroller] 1+3 => 4 [diceroller] 1+d4 => 2 [diceroller] 1+d4 => 3 [diceroller](2+8*d20)*3d6 => 306 Slå en tärning med fyra sidor och lägg till ett. Slå en tärning med tjugo sidor, multiplicera med åtta och lägg till två. Multiplicera detta med summan av tre tärningar med sex sidor.

8 Lexer från sträng till tokens Utan block innebär att matchningen ignoreras token(/\s+/) token(/\d+/) { m m.to_i } token(/./) { m m } Matchningen görs uppifrån och ner (och från vänster till höger i strängen) Med block innebär att vi matchar en token. Vi kan förbearbeta token om vi vill.

9 Parser tolkning av tokens Om vi ser en :term, en *och en :dicei följd...... då beräknar vi vad :term gånger :dice är. rule :term do match(:term, '*', :dice){ a, _, b a * b } match(:term, '/', :dice){ a, _, b a / b } match(:dice) En :termär något som matchar en av dessa tre regler. Om vi ser en :dice returnerar vi den som den är.

class DiceRoller 10 def initialize @diceparser = Parser.new("dice roller") do token(/\s+/) token(/\d+/) { m m.to_i } token(/./) { m m } lexer start :expr do match(:expr, '+', :term){ a, _, b a + b } match(:expr, '-', :term){ a, _, b a - b } match(:term) parser rule :term do match(:term, '*', :dice) { a, _, b a * b } match(:term, '/', :dice) { a, _, b a / b } match(:dice)

rule:dice do match(:atom, 'd', :sides) { a, _, b DiceRoller.roll(a, b) } match('d', :sides) { _, b DiceRoller.roll(1, b) } match(:atom) 11 rule:sides do match('%') { 100 } match(:atom) rule:atom do match(integer) match('(', :expr, ')') { _, a, _ a }

12 BNF-grammatik för DiceRoller-språket expr ::= expr+term expr-term term term ::= term*dice term/dice dice dice ::= atomdsides dsides atom sides ::= % atom atom ::= Integer ( expr)

13 Övning Hämta filen rdparse.rb, titta på koden och testkör DiceRoller-språket. Ändra DiceRollerså att den, istället för att faktiskt beräkna uttrycken direkt, returnerar någon form av abstrakt syntaxträd. Ni får själva bestämma hur det ska se ut (arrayer, hashtabeller, egna klasser, ).

www.liu.se