Problém, jehož různé instance je třeba často řešit Tyto instance lze vyjádřit větami v jednoduchém jazyce

Podobné dokumenty
State. Známý jako. Účel. Použitelnost. Stav, Object for States. umožňuje objektu měnit svoje chování v závislosti na stavu objekt mění svou třídu

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Úvod do programovacích jazyků (Java)

SWI041: (Design Patterns) JAK se to obvykle dlá

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Konstruktory překladačů

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Programovací jazyk Pascal

specifikuje vytvářené objekty pomocí prototypické instance nový objekt vytváří kopírováním prototypu

Zápis programu v jazyce C#

Interpret jazyka IFJ2011

Algoritmizace a programování

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

Implementace LL(1) překladů

PREPROCESOR POKRAČOVÁNÍ

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE PŘEKLADY TYPICKÝCH JAZYKOVÝCH KONSTRUKCÍ PROGRAMOVACÍCH JAZYKŮ.

Konečný automat. Jan Kybic.

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Programování v C++ 2, 8. cvičení

Úvod do programovacích jazyků (Java)

Abstraktní datové typy

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Generování vnitřní reprezentace programu

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Návrhové vzory OMO, LS 2014/2015

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Paměť počítače. alg2 1

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jazyk C++ I. Šablony

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Chain of responsibility

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25

Západočeská univerzita v Plzni Dokumentace překladače PL/0 v PHP Předmět KIV/FJP

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Datové struktury. alg12 1

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

NA CO SI DÁT POZOR V JAVASCRIPTU? Angular.cz

Jazyk C# (seminář 3)

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2008 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 24

PŘETĚŽOVÁNÍ OPERÁTORŮ

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

Teoretické minimum z PJV

Semestrální práce z předmětu Teorie programovacích jazyků

Základy objektové orientace I. Únor 2010

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE STRUKTURA PŘEKLADAČE

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Java a XML. 10/26/09 1/7 Java a XML

Dalším příkladem může být například výstup dat na různá zařízení, souborů, grafických rozhraní, sítě atd.

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Algoritmizace a programování

Úvod z historie. Kompilátory. Kompilace / Kompilátor Compile / Compiler. Pojem kompilátoru. Úvod z historie

Generické programování

IB015 Neimperativní programování. Organizace a motivace kurzu, programovací jazyk Haskell. Jiří Barnat

Dotazování nad stromem abstraktní syntaxe

ČÁST 1. Zahřívací kolo. Co je a k čemu je návrhový vzor 33

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Mediator motivace. FontDialog. závislosti mezi jednotlivými ovládacími prvky jsou netriviální

Jazyk C# a platforma.net

typová konverze typová inference

Seminář Java IV p.1/38

Jazyk C++ I. Polymorfismus

Objekt. základní prvek v OOP. má vlastnosti. má metody. vznikne vytvoření nové instance definován pomocí třídy

PB161 Programování v jazyce C++ Přednáška 9

PB161 Základy OOP. Tomáš Brukner

Jazyk C++ I. Šablony 2

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Abstraktní datové typy: zásobník

Motivační příklad reálný svět. výroba (assembly line)

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Abstract Factory úvod

Lexikální analýza Teorie programovacích jazyků

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Jazyk C# (seminář 6)

Iterator & for cyklus

Spojové struktury. Spojová struktura (linked structure):

Překladač a jeho struktura

Úvod do programování - Java. Cvičení č.4

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

, Brno Připravil: David Procházka Návrhové vzory

1 Nejkratší cesta grafem

Přetěžování operátorů

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

Regulární výrazy. Vzory

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Dědění, polymorfismus

PB161 Programování v jazyce C++ Přednáška 7

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

PB161 Programování v jazyce C++ Přednáška 7

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Definice uživatelského typu. Uživatelem definované typy. Součinové datové typy. Součtové datové typy. FLP - Uživatelem definované typy

Výčtový typ strana 67

Transkript:

Interpreter

Interpreter Motivace Problém, jehož různé instance je třeba často řešit Tyto instance lze vyjádřit větami v jednoduchém jazyce Příklad: zda daný textový řetězec odpovídá nějakému vzoru (match) Obecné řešení Vytvoříme interpret tohoto jazyka Interpretace věty jazyka = řešení dané instance problému Příklad: Jazyk pro popis vzorů regulární výrazy Interpreter specifikuje Pro daný jazyk: Jak jeho gramatiku reprezentovat v kódu Jak reprezentovat a interpretovat jednotlivé věty tohoto jazyka A to tak, aby vše bylo průhledné a snadno rozšířitelné

Interpreter reprezentace gramatiky Příklad: gramatika regulárního výrazu expression ::= literal alternation sequence repetition '(' expression ')' alternation ::= expression ' ' expression sequence ::= expression '&' expression repetition ::= expression '*' literal ::= 'a' 'b' 'c'... { 'a' 'b' 'c'... *

Interpreter reprezentace gramatiky Příklad: gramatika regulárního výrazu expression ::= literal alternation sequence repetition '(' expression ')' alternation ::= expression ' ' expression sequence ::= expression '&' expression repetition ::= expression '*' abstraktní třída literal ::= 'a' 'b' 'c'... { 'a' 'b' 'c'... * Její reprezentace v kódu třída pro každé pravidlo gramatiky (instance udržují podvýraz) symboly na pravých stranách pravidel jsou v proměnných

Interpreter reprezentace vět Příklad: gramatika regulárního výrazu expression ::= literal alternation sequence repetition '(' expression ')' alternation ::= expression ' ' expression sequence ::= expression '&' expression repetition ::= expression '*' literal ::= 'a' 'b' 'c'... { 'a' 'b' 'c'... * Abstraktní syntaktický strom Každý regulární výraz je reprezentován abstraktním syntaktickým stromem, tvořeným instancemi zmíněných tříd Interpreter ovšem nespecifikuje, jak tento strom vytvořit! Reprezentace regulárního výrazu raining & ( dog cats ) *

Interpreter struktura obecně

AbstractExpression (RegularExpression) Deklaruje abstraktní metodu Interpret() Implementace zajišťuje interpretaci zpracovávaného pojmu TerminalExpression (LiteralExpression) Implementuje metodu Interpret() asociovanou s terminálem gramatiky Instance pro každý terminální symbol ve vstupu (větě) NonterminalExpression (AlternationExpr, RepetitionExpr, SequenceExpr) Implementuje metodu Interpret() neterminálu gramatiky Třída pro každé pravidlo R::=R 1 R 2 R N gramatiky Udržuje instance proměnných typu AbstractExpression pro každý symbol R 1 R N Context Udržuje globální informace Client Interpreter účastníci Dostane (vytvoří) abstraktní syntaktický strom reprezentující konkrétní větu jazyka složený z instancí NonterminalExpression a TerminalExpression Volá metodu Interpret()

Interpreter - příklad Práce s booleovskými výrazy BooleanExp ::= VariableExp Constant OrExp AndExp NotExp '(' BooleanExp ')' AndExp ::= BooleanExp 'and' BooleanExp OrExp ::= BooleanExp 'or' BooleanExp NotExp ::= 'not' BooleanExp Constant ::= 'true' 'false' VariableExp ::= 'A' 'B'... 'X' 'Y' 'Z' interface pro všechny třídy definující booleovský výraz class BooleanExp { public: BooleanExp(); virtual ~BooleanExp(); virtual bool Evaluate(Context&) = 0; virtual BooleanExp* Replace(const char*, BooleanExp&) = 0; virtual BooleanExp* Copy() const = 0; ; kontext definuje mapování proměnných na booleovské hodnoty tj. konstanty true a false class Context { public: bool Lookup(const char*) const; void Assign(VariableExp*, bool); ;

Interpreter - příklad class VariableExp : public BooleanExp { public: VariableExp(const char*); virtual ~VariableExp(); virtual bool Evaluate(Context&); virtual BooleanExp* Replace(const char*, BooleanExp&); virtual BooleanExp* Copy() const; private: char* _name; ; VariableExp::VariableExp (const char* name) { _name = strdup(name); bool VariableExp::Evaluate (Context& acontext) { return acontext.lookup(_name); BooleanExp* VariableExp::Copy () const { return new VariableExp(_name); VariableExp reprezentuje pojmenovanou proměnnou BooleanExp* VariableExp::Replace (const char* name, BooleanExp& exp) { if (strcmp(name, _name) == 0) return exp.copy(); else return new VariableExp(_name);

Interpreter - příklad class AndExp : public BooleanExp { public: AndExp(BooleanExp*, BooleanExp*); virtual ~ AndExp(); virtual bool Evaluate(Context&); virtual BooleanExp* Replace(const char*, BooleanExp&); virtual BooleanExp* Copy() const; private: BooleanExp* _operand1; BooleanExp* _operand2; ; AndExp::AndExp (BooleanExp* op1, BooleanExp* op2) { _operand1 = op1; _operand2 = op2; bool AndExp::Evaluate (Context& acontext) { obdobně také operace OR a NOT return _operand1->evaluate(acontext) && _operand2->evaluate(acontext); BooleanExp* AndExp::Copy () const { return new AndExp(_operand1->Copy(), _operand2->copy()); BooleanExp* AndExp::Replace (const char* name, BooleanExp& exp) { return new AndExp( _operand1->replace(name, exp), _operand2->replace(name, exp) );

Interpreter - příklad BooleanExp* expression; Context context; VariableExp* x = new VariableExp("X"); VariableExp* y = new VariableExp("Y"); expression = new OrExp( new AndExp(new Constant(true), x), new AndExp(y, new NotExp(x)) ); context.assign(x, false); context.assign(y, true); vytvoření abstraktního syntaktického stromu pro výraz (true and x) or (y and (not x)) ohodnocení proměnných bool result = expression->evaluate(context); interpretuje výsledek (true) můžeme změnit ohodnocení a znovu provést interpretaci jiná interpretace VariableExp* z = new VariableExp("Z"); NotExp not_z(z); BooleanExp* replacement = expression->replace("y", not_z); context.assign(z, true); result = replacement->evaluate(context);

Interpreter - shrnutí Použitelnost Interpretace jazyka, jehož věty lze vyjádřit abstraktním syntaktickým stromem Gramatika jazyka je jednoduchá Složitější gramatiky nepřehledný kód, lépe použít parser generatory (Bison, Coco/R) Efektivita není kriticky důležitá Typické použití Jinak lépe nekonstruovat syntaktický strom stavový automat Parsery a kompilátory Související návrhové vzory Composite Abstraktní syntaktický strom je instancí NV Composite Flyweight Sdílení terminálových symbolů uvnitř syntaktického stromu Typické u programovacích jazyků (častý výskyt té samé proměnné) Iterator Využití k průchodu strukturou Visitor Definice/změna chování všech uzlů abstraktního syntaktického stromu jednou třídou