exalei ( extendible arithmetic logic expression interpreter ) autore: cremonini davide matricola:...

Post on 02-May-2015

215 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

ExALEIExALEI

( ( ExExtendible tendible AArithmetic rithmetic LLogic ogic EExpression xpression IInterpreter ) nterpreter )

Autore: Cremonini Davide Matricola: 2148054902

2

1. Obiettivo1. Obiettivo

Realizzare un interprete logico-aritmetico ispirato al linguaggio Scheme utilizzando Java.

3

ExAEIExAEI

( ( ExExtendible tendible AArithmetic rithmetic EExpression xpression IInterpreter ) nterpreter )

4

2. Analisi2. Analisi

5

Cos’è un interprete:Cos’è un interprete:

Automa in grado di eseguire le azioni richieste per valutare le frasi di un linguaggio L.

Programma + L = descrizione automa

Macchina universale che accetta in ingresso la descrizione di un automa e ne simula il comportamento.

6

1° livello di astrazione:1° livello di astrazione:

repeatlettura di una frase S dal dispositivo di ingresso;if S appartiene L(G){

esegui S;return(risultato);

} else

segnala errore;forever

7

Requisiti Funzionali:Requisiti Funzionali:

1. Riconoscimento delle frasi;

2. Valutazione di espressioni aritmetiche;

3. Contemplazione di diverse forme di valutazione;

4. Realizzazione di un’interfaccia grafica.

8

1.1. Riconoscimento delle frasiRiconoscimento delle frasi

Analisi lessicale (Lexer)

Analisi sintattica

Analisi semantica] (Parser)

APT

9

Abstract Parse Tree (APT)Abstract Parse Tree (APT)

Permette di aumentare la modularità dell’ interprete in quanto consente di separare la parte di analisi sintattica da quella semantica.

10

2. Valutazione delle espressioni2. Valutazione delle espressioni

L’interprete deve inoltre supportare: Sequenze di espressioni; Assegnamenti.

Dopo il riconoscimento l’input deve essere valutato.

Interi, reali e operatori.

11

3. Diverse forme di valutazione3. Diverse forme di valutazione

Posso avere diverse forme di valutazione dell’input, quindi devo considerare:

1. Riscrittura in forma infissa;

2. Riscrittura in forma polacca postfissa;

3. Riscrittura in forma polacca prefissa;(continua …)

12

4. Calcolo del risultato;

3. Diverse forme di valutazione3. Diverse forme di valutazione

5. Visualizzazione grafica dell’Abstract Parse Tree (APT);

6. Generazione del codice per SM;

7. Generazione del codice per RM.

13

4. Realizzazione interfaccia grafica4. Realizzazione interfaccia grafica

Questo passo è necessario per agevolare l’utilizzo dell’interprete da parte dell’utente.

14

3. Progetto3. Progetto

15

Scelta della grammaticaScelta della grammatica

Requisiti:

Context Free;

Non ambigua (notazione BNF)

Espressa come gerarchia di classi (procedimento top – down)

16

Grammatica di riferimento (G)Grammatica di riferimento (G)

G = { VN, VT, S, P }

ove:

VT = insieme dei simboli terminali;

S = scopo (start-symbol);

P = insieme delle produzioni.

VN = insieme dei meta-simboli non terminali (variabili);

17

P = {

<SEQEXP>::= <EXP>;<EXP>|<EXP>

<TERM>::= <FACTOR>{[*|/]<FACTOR>}

<FACTOR>::= [|-]<NUMBER>|(<EXP>)|<IDENT>

<ASSIGN>::= <IDENT> = <EXP>

<IDENT>::= Lettera {Lettera|<IDENT>}

<NUMBER>::= Decdigit {Decdigit} 

}

<EXP>::= <TERM>{[+|-]<TERM>}|<ASSIGN>

18

Gerarchia di classiGerarchia di classi

È immediato costruire un interprete.

Metodologia funzionale: introduco una funzione (instanceof) che determina la classe a cui appartiene un oggetto attraverso un opportuno casting.

Metodologia object oriented: introduco un metodo specializzato per ogni classe.

19

Gerarchia di classiGerarchia di classi

Caso funzionale: è più facile introdurre nuove interpretazioni ma più oneroso introdurre nuove produzioni poiché occorre modificare il codice di tutte le funzioni di interpretazione per tenere conto delle nuove strutture.

Caso object oriented: viceversa, in quanto occorre definire un metodo nuovo per ogni classe.

20

Gerarchia di classiGerarchia di classi

Un linguaggio di programmazione è caratterizzato da una grammatica fissa e da molteplici interpretazioni, quindi la scelta ricade sul primo caso.

Posso però conciliare le due metodologie con la scelta di un pattern di nome Visitor.

21

Pattern VisitorPattern Visitor

Una volta processato l’input e ottenuto un APT devo poterlo analizzare.

Pattern visitor : si propone di localizzare in un oggetto (il visitor, che ho chiamato SExpVisitor) la logica delle azioni che coinvolgono i componenti dell’albero.

Realizza un protocollo di double dispatching.

22

Double dispatchingDouble dispatching

1. Si introduce un insieme di (classi) visitor, ciascuna delle quali dedicata alla realizzazione di una specifica funzionalità: InfixSExpVisitor DPNSExpVisitor RPNSExpVisitor (continua…)

• È adatto per strutture di dati che non cambiano sulle quali e necessario agire con politiche diverse.

23

Double DispatchingDouble Dispatching

EvalSExpVisitor EvalAssignSExpVisitor GraphicsSExpVisitor GenStkMCodeSExpVisitor GenRegMCodeSExpVisitor

24

Double DispatchingDouble Dispatching

2. Considero la tassonomia di classi alla quale appartengono i componenti dell’APT che il visitor deve percorrere.

Questi oggetti fanno parte della gerarchia SExp.

25

SExp

ConsExp

AtomSExp

NilSExp

SNumExp

SIntNumExp

DivExp

SRealNumExp

IdentSExp

TimesExp

IdenValSExp

AssignSExp

MinusExp

SOpExp

PlusExp

EseqSExp

26

Double DispatchingDouble Dispatching

3. Si definiscono, per ciascun visitor, tante operazioni quante sono le classi della tassonomia dei nodi (del tipo visitxxx);

4. Per ogni classe della struttura da visitare si definisce una operazione con signature: public void accept(GenericVisitor v);

5. Si definiscono le operazioni visitxxx in ciascuna delle classi visitor in modo da realizzare le funzioni desiderate.

27

Double DispatchingDouble Dispatching

Riassumendo:

Sia Tree la variabile che denota la struttura da visitare

Sia ev la variabile che denota una specifica istanza di un particolare tipo di visitor

28

Double DispatchingDouble Dispatching

l'invocazione Tree.accept(ev) provoca un primo dispatching in relazione al tipo di nodo referenziato da Tree e un secondo dispatching in relazione all’ invocazione ev.visitxxx(this) provocata dall'esecuzione dell'operazione accept.

29

Abstract Stack Machine Abstract Stack Machine

Macchina astratta costituita da una memoria sequenziale per il codice, una per i dati e da uno stack, sul quale è possibile eseguire operazioni aritmetiche e che può ospitare indifferentemente sia numeri interi che reali.

30

Abstract Stack MachineAbstract Stack Machine

Primitive:Accesso alla memoria:

PUSH, POP, STORE Controllo di flusso:

HALT, JMP Istruzioni aritmetiche:

ADD, MUL, SUB, DIV

31

Register MachineRegister Machine

È costituita da una memoria sequenziale per codice e dati, da una memoria gestita a stack e da due registri (denominati AX e BX) sui quali è in grado di compiere operazioni aritmetiche. 

32

Register MachineRegister Machine

Primitive:Trasferimento dati MOV

Controllo di flusso: HALT, JMP

Gestione dello Stack POP, PUSH

Istruzioni aritmetiche: ADD, MUL, SUB,

DIV

33

Interfaccia graficaInterfaccia graficaFunzionalità richieste:Immissione input (area di testo);

Valutazione input (tasto Eval); Cancellazione dell’input (tasto Call);

Visualizzazione risultati (aree di testo);

Visualizzazione msg di errore;

Scelta dei tipi di valutazione (Checkbox);

34

4.4. ImplementazioneImplementazione

35

AnalizzatoreAnalizzatore LessicaleLessicale ( (AEILexerAEILexer)) java.io.StreamTokenizer Consente riconoscimento di identificatori

e numeri interi e reali: nextToken() lexerSExpCurrToken

Token rappresentati come oggetti della gerarchia SExp: SNumExp, SOpExp, IdentSExp

36

AnalizzatoreAnalizzatore SintatticoSintattico ( (AEIParserAEIParser))

Restituisce un oggetto di tipo SExp che rappresenta l’APT della frase di input.

Se la frase non appartiene alla grammatica specificata, solleva un’eccezione (AEIParserException) che contiene una stringa che identifica il tipo di violazione verificata e un intero per indicarne il numero di riga.

37

Visitors implementatiVisitors implementati

La modellazione del problema ha introdotto strutture (consSExp e nilSExp) che permettono di realizzare il concetto di lista e quindi di rendere disponibile una serie di operazioni primitive del Lisp sulle liste (car, cdr, isNull, isEq, isAtom).

Anche se uso Java posso organizzare l’interprete secondo la strutture di Scheme.

38

Visitors implementati (Visitors implementati (InfixInfix))

1. infixSExpVisitor Riscrive un’espressione in forma infissa.

Visita dell’APT eseguita in ordine left-root-right.

Risultati intermedi memorizzati in uno stack (istanza di java.util.Stack).

Risultato finale attraverso metodo val().

39

Visitors implementati (Visitors implementati (DPNDPN))

2. DPNSExpVisitor Riscrive un’espressione in forma polacca

prefissa. Visita dell’APT eseguita in ordine root-

left-right. Risultati intermedi memorizzati in uno

stack.

Risultato finale attraverso metodo val().

40

Visitors implementati (Visitors implementati (RPNRPN))

3. RPNSExpVisitor Riscrive un’espressione in forma polacca

postfissa. Visita dell’APT eseguita in post-ordine

left-right-root. Risultati intermedi memorizzati in uno

stack. Risultato finale attraverso metodo val().

41

Visitors implementati (Visitors implementati (EvalEval))

4. EvalSExpVisitor Va oltre la semplice riscrittura.

Tabella hash per rappresentare l’environment (binding), istanza di java.util.HashTable.

Visita dell’APT eseguita in post-ordine left-right-root

Differenza tra correttezza sintattica e semantica (SymbolNotDefinedException)

42

Visitors implementati (Visitors implementati (GraphicsGraphics))

5. GraphicsSExpVisitor

Utilizzo di classi java.Swing.JTree Visita dell’APT eseguita in post-ordine

left-right-root Modello finale attraverso il metodo val()

43

Visitors implementati (Visitors implementati (SMSM))

6. GenStkMCodeSExpVisitor

Costanti numeriche (PUSH) Variabili: right-value (PUSH @<addr>),

left-value (STORE @<addr>).

Visita dell’APT eseguita in post-ordine left-right-root

JMP @<addr> HALT per terminare l’esecuzione della SM.

44

Visitors implementati (Visitors implementati (RMRM))

7. GenRegMCodeSExpVisitor Visita dell’APT eseguita in post-ordine

left-right-root Utilizzo di due registri ausiliari.

Stack usato solo per i risultati intermedi.

HALT Per termina l’esecuzione della RM.

Interfaccia graficaInterfaccia grafica

46

2 + 3 * 5.0 + (-4)6 * (3 + 4) / 2.5 + 4a=2; b=5; c=3; 2 / 3.5 * (a-b*(c+3))

5. Verifiche5. Verifiche

47

Verifiche:Verifiche:

48

ExALEIExALEI

( ( ExExtendible tendible AArithmetic rithmetic LLogic ogic EExpression xpression IInterpreter ) nterpreter )

49

2. Analisi2. Analisi

50

DifferenzeDifferenze

Necessità di definire una grammatica più completa:

– Nuovi operatori: <, >, <=, >=, and, or, not, if…then…else;

– Nuovo tipo di espressione: boolean (true, false);

51

3. Progetto3. Progetto

52

Grammatica di riferimento (G)Grammatica di riferimento (G)

G = { VN, VT, S, P }

ove:

VT = insieme dei simboli terminali;

S = scopo (start-symbol);

P = insieme delle produzioni.

VN = insieme dei meta-simboli non terminali (variabili);

53

P = {

<SEQEXP>::= <CONDEXP> {;<CONDEXP>}

<CONDEXP>::= <OREXP> |

<OREXP> ? <CONDEXP> : <CONDEXP>

<OREXP>::= <ANDEXP> { or <ANDEXP> }

<ANDEXP>::= <EQEXP> { and <EQEXP> }

<EQEXP>::= <RELEXP> { == <RELEXP> }

<RELEXP>::= <EXP>

{ [ < | > | <= | >= ] <EXP>}

<EXP>::= <TERM>{[+|-]<TERM>} | <ASSIGN>

...

54

...

<TERM> ::= <FACTOR>{[*|/]<FACTOR>} <FACTOR> ::= [not]<FACTOR>|[|-]<NUMBER>

| (<EXP>) | <IDENT> | <BOOL>

<BOOL>::= true | false (ignoring case)

<ASSIGN>::= <IDENT> = <EXP>

<IDENT>::= Lettera {Lettera | <IDENT>}

<NUMBER>::= Decdigit {Decdigit} 

}

55

Gerarchia SExpGerarchia SExp

Nuove classi:

BoolSExp ElseSExpSExp NotGreatSExp

AndSExp EqualSExp NotLessSExp

OrSExp GreaterSExp NotSExp

CondSExp LessSExp

56

Nuove istruzioni:

Controllo di Flusso

JMPNZ @<addr>

JMPLT @<addr>

JMPGT @<addr>

JMPLE @<addr>

JMPGE @<addr>

Logiche

And

Or

Not

Stack Machine (SM)Stack Machine (SM)

57

Nuove istruzioni:

Logiche

And

Or

Not

Controllo di Flusso

JMPZ @<addr> JMPGE @<addr>

JMPNZ @<addr> JMPLT @<addr>

JMPLE @<addr> JMPGT @<addr>

Register Machine (RM)Register Machine (RM)

58

4.4. ImplementazioneImplementazione

59

Nuovi operatoriNuovi operatori

Unario : come se fosse binario con un argomento nullo;

Ternario: attraverso due nodi e tre foglie.

60

Visitors realizzatiVisitors realizzati

Aggiunta dei metodi necessari ai nuovi operatori. LInfixSExpVisitor (not)

LDPNSExpVisitor (operatore ternario)

LRPNSExpVisitor (operatore ternario)

LEvalAssignSExpVisitor ( verifica incompatibilità operando-operatore, trattamento dell’operatore ternario alterazione dell’ordine di visita left-root-right)

61

SM e RMSM e RM

Rappresentazione dei booleani: true=1 false=0

Operatori di confronto valutati così: Sottrazione di op1 con op2; Salto condizionato in base al valore del resto.

62

2 + 3 * 5.0 + (-4)6 * (3 + 4) / 2.5 + 4a=2; b=5; c=3; 2 / 3.5 * (a-b*(c+3))true or false 5 >=3 ? x=t : x=f

5. Verifiche5. Verifiche

63

Verifiche:Verifiche:

64

Fine

top related