



Implementazione dell'inteprete Scheme
Introduzione
- Analisi lessicale - Analisi
sintattica - Valutazione - Estensione
- Demo
Introduzione
Implementata la gerarchia Sexp è possibile
iniziare l'implementazione del package LispInterpreter. Tale package contiene
la classe che effettua l'AS (classe Parser) e la classe che effettua la
valutazione (classe EvalSexpVisitor), più un sottopackage dedicato
all'AL, in cui è ridefinito il Lexer (classe LispLexer) e sono impostati
i vari set di tokens chiave.
La grammatica è
la caratterizzata dalle seguenti produzioni (Program è lo scopo):
Simbolo non terminale |
Possibile sostituzione |
Possibile sostituzione |
Possibile sostituzione |
Program |
Sexp Program |
|
|
Sexp |
ConsSexp |
AtomSexp |
|
ConSexp |
() |
( Sexp . Sexp
) |
( SexpList ) |
SexpList |
Sexp |
SexpList |
|
AtomSexp |
Ident |
|
|
Ident |
<lettera> |
<lettera> Ident |
|
che è di tipo 2, ma non LL(1).
Per renderla LL(1) e per semplificare il
compito del Parser l'abbiamo trasformata nella seguente:
Simbolo non terminale |
Possibile sostituzione |
Possibile sostituzione |
Possibile sostituzione |
Program |
Sexp Program |
|
|
Sexp |
ConsSexp |
Ident |
|
ConSexp |
() |
( Sexp PairOrList |
|
PairOrList |
) |
. Sexp ) |
Sexp PairOrList |
Ident |
<lettera> |
<lettera> Ident |
|
A ciascuna delle prime quattro produzioni corrisponde
una funzione del parser il cui nome è dato dal simbolo non terminale
che si trova a sinistra di "::=". L'ultima produzione è gestita
dal lexer che crea l'identificatore automaticamente. Tale identificatore
viene creato in modo che costituisca un oggetto della classe da appartenenza
che può essere:
-
NumToken (per i numeri);
-
PrimitiveToken (per le primitive);
-
RelationToken (per gli operatori relazionali);
-
OperationToken (per gli operatori aritmetici);
-
SpecialToken (per i tokens speciali che non rientrano nelle altre categorie);
-
IdentToken (per gli identificatori);
-
EofToken (per l'End-Of-File).
Tutte queste classi ereditano da IdentSexp poiché
costituiscono tutti s-expression atomiche non nulle e fanno parte di un
package dedicato. Si è preferito realizzare queste classi piuttosto
che usare l'unica classe IdentSexp per evidenziare che quegli oggetti sono
stati costruiti dal lexer e quindi sono tokens, cioè non ancora
delle S-expression. Il compito di costruire le S-expressions è del
parser. Comunque i tokens costituiscono i "mattoni" con cui vengono costruite
le S-expression, dunque è giusto che anch'essi appartengano alla
gerarchia che ha inizio dalla classe Sexp. Inoltre l'aver suddiviso i tokens
in categorie den definite ha anche facilitato il compito del valutatore
in fase di riconoscimento del tipo di operazione da svolgere.



