Konstruktion av datorspråk

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

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

TDP007 Konstruktion av datorspråk Hemtentamen

Konstruktion av datorspråk

Deklarativ programmering

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

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

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

Inlämningsuppgift MiniPlotter

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

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

Konstruktion av datorspråk

Deklarativ programmering

Is Not A Markup Language

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

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

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

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

Mer om språk och Ruby

Användar- och systemdokumentation

Grammatik. BNF-grammatik

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

Konstruktion av datorspråk

Genicore AB. Modellbaserad ansats. En liten firma i Göteborg som gör stora datasystem. Systemspråk - När modellen är systemet. torsdag 10 maj 2012

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

Konstruktion av datorspråk

Namnet är omvänt men inte koden

Mer om språk och Ruby

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

Introduktion till Ruby

plätt Linköpings universitet

Prova på-laboration i Ruby

Datorspråk Breddgivande föreläsning

Sista delen av kursen

Programspråkslingvistik. Sista delen av kursen. Ett programspråk

Karlstads Universitet, Datavetenskap 1

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

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

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, 2011

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

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

Lektion Java Grunder. Javas historia. Programmeringsspråket Java. Skillnaderna mellan Java och C++ JVM (Javas Virtuella Maskin)

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

Föreläsning 2. Operativsystem och programmering

DVG C01 TENTAMEN I PROGRAMSPRÅK PROGRAMMING LANGUAGES EXAMINATION :15-13: 15

12. Relationer och funktioner

Sista delen av kursen

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

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

Imperativ programmering

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Grundläggande datalogi - Övning 9

Datorsystem och programmering

Objektorienterad programmering

Föreläsning 7: Syntaxanalys

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

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

IT OCH PROGRAMMERING I SKOLAN. Jan Erik Moström Peter Vinnervik

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

Dagens föreläsning. Modeller för programmeringsspråk. - Olika modeller programspråk Interpretator - kompilator. - Syntax - semantik.

Algoritmer. Två gränssnitt

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Föreläsning 2 Datastrukturer (DAT037)

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

Kompilatorer och interpretatorer

Sätt att skriva ut binärträd

Hjälpmedel för kompilatorkonstruktion, DVB004

12. Relationer och funktioner

Imperativ programmering. Föreläsning 4

Programmering A. Johan Eliasson

Kompilatorer och interpretatorer

Obligatorisk uppgift: Numerisk kalkylator

Classes och Interfaces, Objects och References, Initialization

Software Technology. Josef Svenningsson

Föreläsning 5 5DV086 - Programspråk

Obligatorisk uppgift: Numerisk kalkylator

Program & programmering

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

Obligatorisk uppgift 5

Inledande programmering med C# (1DV402) Introduktion till C#

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

PROGRAMMERINGSMETODIK

Laboration: Whitebox- och blackboxtesting

Omprov 11/11. på förmiddagen.

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

Objektorienterad Programmering (TDDC77)

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

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

Objektorienterad Programmering (TDDC77)

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

Språkteknologi och Open Source

729G75: Programmering och algoritmiskt tänkande. Tema 1. Föreläsning 1 Jody Foo

729G75: Programmering och algoritmiskt tänkande. Tema 1, föreläsning 1 Jody Foo

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

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

Grundläggande programmering DVG A08 & ISG A04. Allmän information. Å vem är jag då. Karlstads Universitet, Johan Öfverberg 1

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

Transkript:

Konstruktion av datorspråk Fö4: Domänspecifika språk och parsning Peter Dalenius petda@ida.liu.se Institutionen för datavetenskap Linköpings universitet 2009-02-12 Domänspecifika språk Ett domänspecifikt språk (DSL) är ett oftast litet språk vars syfte är att uttrycka problem eller lösningssätt för ett specifikt begränsat problemområde. Externt DSL: Ny syntax som inte är gemensam med något existerande programspråk. Kräver helt nya verktyg, men man kan skapa ett uttrycksfullt språk för det specifika problemet. Internt DSL: Utvidgning av ett existerande programspråk (en typ av abstraktion), med fördelen att man lätt kan bearbeta koden. Några fördelar och nackdelar Exempel Mer uttryckskraft inom en specifik domän gör det lättare att uttrycka problem. (+) Möjlighet för icke-programmerare att specificera problem. (+) Extra arbete att producera verktyg för externt DSL. (-)

Var går gränsen för DSL? Olika språkgenerationer Varning för hype! Möjlig motsats: allmänt general-purpose programspråk (t.ex. C++, Java, Ruby) Möjligt överlapp: scriptspråk knutna till och avsedda att styra en viss applikation, men är ofta mer lika riktiga programspråk Möjligt överlapp: fjärde generationens språk (se nästa bild) 1GL: Maskinspråk 2GL: Assembler 3GL: Moderna språk, från 1960-talet och framåt (t.ex. Fortran, ALGOL, Pascal, C, C++, Java, Ruby) 4GL: Applikationsspecifika språk 5GL:??? Exempel på eget DSL Verktyg för eget DSL article 1234 name "Sune" description "Book shelf" color "Red" inventory 42 article 5678 inventory 29 name "Berra" color "Brown" description "Mirror" Denna textfil innehåller information om ett antal artiklar i ett lager. Betrakta textfilen som programkod och försök skriva ett verktyg som kan tolka den. Hur då? class Inventory < Array def Inventory.load(filename) inv = new inv.instance_eval(file.read(filename)) inv def article(number) self << {:article => number} def method_missing(name,args) self.last[name] = args

Tekniker Kernel#load Kernel#eval Object#instance_eval Module#class_eval Kernel#method_missing Module#const_missing Exempel 2 (programkod) class Configuration def initialize(filename="config.rb") instance_eval(file.new(filename).read()) def method_missing(method_name,arg) @@var = method_name class << self class_eval { attr_accessor(@@var) } instance_eval("self.#{method_name}=#{arg}") Exempel 2 (körning) zaza1 <1> cat config.rb a 45 b 4711 c 1396 zaza1 <2> irb --simple-prompt >> load "configuration.rb" => true >> foo=configuration.new => #<Configuration:0x2fdda0c @c=1396, @b=4711, @a=45> >> foo.a => 45 Exempel 3 (Mofo) class HCalar < Microformat container :vevent one :class, :description, :dt, :dtstamp, :dtstart, :duration, :status, :summary, :uid, :last_modified, :url => :url, :location => [ HCard, Adr, Geo, String ] many :category class HCard < Microformat container :vcard one :fn, :bday, :tz, :sort_string, :uid, :class, :geo => Geo many :label, :sound, :title, :role, :key, :mailer, :rev, :nickname, :category, :note, :logo => :url, :url => :url, :photo => :url, :adr => Adr one :n do one :family_name, :given_name, :additional_name many :honorific_prefix, :honorific_suffix...

Grammatik expr ::= term term + term term term term ::= factor factor * factor factor / factor factor ::= number identifier ( expr ) 1 + ( 2 * 3 ) Analys av källkod 1. Lexikalisk analys Bildar tokens utifrån källkodens text. 2. 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. 3. Semantisk analys Kontrollerar t.ex. typfel. 4. Fler steg, beroe på uppgiften Ström av tecken d e f f ( n ) \n n = = 0 - - - Verktyg för generering av verktyg Lexer def f ( n ) n == 0 - - - name f Parser function n param body - - - Ström av tokens AST (Abstrakt syntaxträd) 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 (gärna i BNF). Det finns motsvarande verktyg för Ruby också, t.ex. ruby-lex och racc.

Parsern som vi använder i labben Användning av DiceRoller 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åk så att vi lätt kan göra en egen parser för ett valfritt språk. I labbfilerna finns exempelparsern DiceRoller som är ett litet språk för att slå tärningar och räkna ut enkla matematiska uttryck. 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. Alla tre klasserna Rule, Parser och DiceRoller finns i filen rdparse.rb. class DiceRoller def initialize @diceparser = Parser.new("dice roller") do token(/\s+/) token(/\d+/) { m m.to_i } token(/./) { m m } start :expr do match(:expr, '+', :term) { a, _, b a + b } match(:expr, '-', :term) { a, _, b a - b } match(:term) 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) rule :sides do match('%') { 100 } match(:atom) rule :atom do match(integer) match('(', :expr, ')') { _, a, _ a }