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.