Oppure

Loading
26/05/12 10:05
sarbaturino
Salve.

Sto realizzando un parser in JavaCC che mi riconosca il linguaggio di programmazione java.
Ora, dopo aver scritto la grammatica del corpo iniziale di un programma java, vi chiedo:

Come posso realizzare la parte semantica di tale riconoscitore?

Per parte semantica intendo ad esempio, che non mi dovrà essere possibile assegnare un char ad un int ecc ecc..

In parole povere, devo realizzare un piccolo compilatore java..
Scopo progetto Universitario..

aaa
26/05/12 16:05
pierotofy
Una tecnica comune e' quella di generare un AST ( en.wikipedia.org/wiki/… ). Una specializzazione del tuo AST dovrebbe implementare una "variableDeclarationStatement", dove ci sono tre informazioni: il tipo (char, int, ecc.), il nome assegnato alla variabile, e l'opzionale espressione (char variabile = 'a';), dove 'a' dev'essere un'espressione arbitraria. Avrai inoltre un "variableAssignmentStatement" nella forma "variabile = espressione;".

Non ho mai usato JavaCC, ma suppongo ci sia un metodo per inizializzare questo tipo di struttura, cosi' che per ogni dichiarazione di variabile hai un oggetto variableDeclarationStatement e per ogni assegnamento hai un variableAssignmentStatement.

Una volta che hai il tuo AST inizializzato, devi fare un controllo del tipo:

if (variabile.tipo != espressione.tipo)
throw Exception("Type mismatch";).

La parte piu' complessa e' probabilmente organizzare l'AST per l'espressione.... un espressione puo' essere un'espressione binaria (a+b, a-b, ecc.), una chiamata a funzione, o l'accesso ad un array, ecc.

Una volta che data un'espressione puoi capire qual'e' il tipo, il codice qui sopra funzionera' immediatamente.

Buona fortuna!

edit: se conosci C++ puoi dare uno sguardo a questo progetto: pierotofy.it/pages/sorgenti/dettagli/18926-KLogo/
Ultima modifica effettuata da pierotofy 26/05/12 16:08
Il mio blog: piero.dev
26/05/12 17:00
sarbaturino
Grazie mille per la tua gentile risposta.

Per quanto riguarda la gestione della semantica del mio parser, avevo pensato:
Crearmi un Class dove posso memorizzare una tabella di token;
Per ogni metodo e per ogni costrutto, tipo if, while o for, creo una tabella per verificare l'ambito di visibilità delle variabili..

Questa Class la invoco all'interno del parser..

Forse in ambito di efficienza spreco qualcosa, ma per un piccolo progettino penso che possa andare bene..

Questa tipologia, potrebbe essere una buona idea??
aaa
26/05/12 20:34
pierotofy
Non credo di aver capito...
Il mio blog: piero.dev