• Nie Znaleziono Wyników

cwiczenia 8. Budowa drzewa sk ł adniowego JPS

N/A
N/A
Protected

Academic year: 2021

Share "cwiczenia 8. Budowa drzewa sk ł adniowego JPS"

Copied!
18
0
0

Pełen tekst

(1)

JPS

Budowa drzewa składniowego cwiczenia 8.

© Michał Lentner

Polsko-Japońska Wyższa Szkoła Technik Komputerowych

(2)

Terminologia

emp where salary = 100 and name = “Kowalski”

nazwa (identyfikator)

operator

where nazwa

(identyfikator) operator

binarny literał liczby

całkowitej operator

binarny nazwa

(identyfikator) operator

binarny literał łańcucha znaków

(3)

Cel do osiągnięcia

emp where salary = 100 and name = “Kowalski”;

where

emp and

salary

=

name

=

“Kowalski”

100

IdentifierExpression(Identifier(”emp”)) BinaryExpression(Operator.opAnd)

IdentifierExpression(Identifier(”salary”))

BinaryExpression(Operator.opEquals)

IdentifierExpression(Identifier(”name”))

BinaryExpression(Operator.opEquals)

StringExpression(StringLiteral(”Kowalski”) IntegerExpression(IntegerLiteral(100))

WhereExpression SBQLProgram ExpressionStatement

(4)

odra.sbql.ast

odra.sbql.ast.expressions odra.sbql.ast.statements

odra.sbql.ast.terminals ASTNode

ASTVisitor

ASTVisitorAdapter

SBQLProgram

Organizacja kodu związanego z AST

Pakiet zawierający klasy reprezentujące wyrażenia

Pakiet zawierający klasy reprezentujące instrukcje

Pakiet zawierający klasy reprezentujące terminale (literały i niektóre operatory)

Węzeł AST reprezentujący program SBQL

Adapter dla ASTVisitor.

Zawiera niekompletne implementacje metod zadeklarowanych w ASTVisitor

Interfejs zawierający deklaracje metod Visit, będących jądrem mechanizmu

przechodzenia po AST Klasa z której

dziedziczą wszystkie klasy reprezentujące węzły AST

Pakiet zawierający całą funkcjonalność związaną z drzewem składniowym

(5)

Pakiet odra.sbql.ast.terminals

Terminal

Identifier V : String

RealLiteral V : double BooleanLiteral

V : boolean

StringLiteral V : String

Operator opPlus : Operator opMinus : Operator opMultiply : Operator opDivide : Operator opEquals : Operator ...

spell()

IntegerLiteral V : int

(6)

Przykłady

(7)

Przykłady

(8)

Pakiet odra.sbql.ast.statements

ASTNode

Statement

ExpressionStatement E : Expression

(9)

Przykłady

(10)

Pakiet odra.sbql.ast.expressions

ASTNode

Expression IntegerExpression

L : IntegerLiteral

IdentifierExpression I : Identifier

StringExpression L : IntegerLiteral

WhereExpression E1 : Expression E2 : Expression JoinExpression

E1 : Expression E2 : Expression

CommaExpression E1 : Expression E2 : Expression

BinaryExpression E1 : Expression E2 : Expression O : Operator

UnaryExpression E : Expression O : Operator

AsExpression E : Expression I : Identifier

GroupAsExpression E : Expression I : Identifier

(11)
(12)

Przykłady

(13)

Tworzenie AST

1 + 2 + 3

SBQLProgram prg = new SBQLProgram(

new ExpressionStatement(

new BinaryExpression(

new IntegerExpression(new IntegerLiteral(1)), new BinaryExpression(

new IntegerExpression(new IntegerLiteral(2)), new IntegerExpression(new IntegerLiteral(3)), Operator.opPlus),

Operator.opPlus)));

employee where name = “Kowalski”

SBQLProgram prg = new SBQLProgram(

new ExpressionStatement(

new WhereExpression(

new IdentifierExpression(new Identifier(”employee”)), new BinaryExpression(

new IdentifierExpression(new Identifier(”name”)), new StringExpression(new StringLiteral(”Kowalski”)), Operator.opEquals))));

(14)

Pakiet odra.sbql.ast

ASTNode

accept (vis : ASTVisitor, attr : Object) : Object

SBQLProgram S : Statement

accept (vis : ASTVisitor, attr : Object) : Object

ASTVisitor

visitSBQLProgram(node : SBQLProgram node, attr : Object) : Object visitExpressionStatement(stmt : ExpressionStatement, attr : Object) : Object visitIntegerExpression(vis : IntegerExpression, attr : Object) : Object visitStringExpression(vis : StringExpression, attr : Object) : Object

ASTAdapter

visitSBQLProgram(node : SBQLProgram node, attr : Object) : Object visitExpressionStatement(stmt : ExpressionStatement, attr : Object) : Object visitIntegerExpression(vis : IntegerExpression, attr : Object) : Object visitStringExpression(vis : StringExpression, attr : Object) : Object

SBQLInterpreter stack : SBQLStack

visitSBQLProgram(node : SBQLProgram node, attr : Object) : Object visitExpressionStatement(stmt : ExpressionStatement, attr : Object) : Object visitIntegerExpression(vis : IntegerExpression, attr : Object) : Object visitStringExpression(vis : StringExpression, attr : Object) : Object

ASTPrinter

visitSBQLProgram(node : SBQLProgram node, attr : Object) : Object visitExpressionStatement(stmt : ExpressionStatement, attr : Object) : Object visitIntegerExpression(vis : IntegerExpression, attr : Object) : Object visitStringExpression(vis : StringExpression, attr : Object) : Object BinaryExpression

S : Statement

accept (vis : ASTVisitor, attr : Object) : Object

IntegerExpression S : Statement

accept (vis : ASTVisitor, attr : Object) : Object Expression

(15)

Wzorzec projektowy Visitor

Zakłada oddzielenie struktury drzewa od kodu operującego na nim.

Zamiast umieszczać metodę eval w każdym węźle drzewa, wszystkie je umieszczamy w osobnej klasie zapewniającej określoną funkcjonalność (interpreter, type checker, optymalizator, pretty printer, itp.). Metody te nazywamy visitXXX, gdzie XXX oznacza nazwę węzła. Argumentem jest węzeł drzewa. Rezultat i drugi argument są opcjonalne - często nie są w ogóle wykorzystywane.

Wszystkie metody visit deklarujemy w interfejsie ASTVisitor. Wygodnie jest stworzyć sobie adapter zawierający pseudoimplementacje

W klasie każdego węzła drzewa umieszczamy metodę accept. Argumenty:

instancja klasy implementującej ASTVisitor, opcjonalne dane przekazywane do visit. Wynik zwraca rezultat visit.

Odpalenie interpretera: prg.accept(new SBQLInterpreter(), null));

(16)

Przykłady

(17)

Przykłady

(18)

Ć w i c z e n i a

Cytaty

Powiązane dokumenty

Najmniejszą entropię mają atrybuty b i d, lecz b ma mniej wartości, dlatego on będzie korzeniem drzewa.. Uruchomienie metody ID3 dla lewego poddrzewa prowadzi do wstawienia

• Służy do zamieniania nazw występujących w tekscie programu na konkretne byty programistyczne (wiązanie nazw).. Stos

Po rozszerzeniu o konstrukcje proceduralne powstał pełny język programowania a’la PL/SQL, w którym wyrażenia są zapytaniami... • nazwiska i wiek pracowników

Aktualizacja obiektu nadrzędnego, usunięcie podobiektów, usunięcie referencji wskazujących na dany obiekt, zwolnienie

Aktualizacja obiektu nadrzędnego, usunięcie podobiektów, usunięcie referencji wskazujących na dany obiekt, zwolnienie

Polsko-Japońska Wyższa Szkoła Technik Komputerowych.. Operator

+ IntegerResult StringResult BooleanResult RealResult StructResult BinderResult ReferenceResult BagResult SequenceResult?. IntegerResult

Polsko-Japońska Wyższa Szkoła Technik Komputerowych.. pracownik where nazwisko =