Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Altri Linguaggi - Semantica Parser Compilatore Java
Forum - Altri Linguaggi - Semantica Parser Compilatore Java

Avatar
sarbaturino (Normal User)
Pro


Messaggi: 66
Iscritto: 25/04/2011

Segnala al moderatore
Postato alle 12:05
Sabato, 26/05/2012
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..


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 18:05
Sabato, 26/05/2012
Una tecnica comune e' quella di generare un AST ( http://en.wikipedia.org/wiki/Abstract_syntax_tree ). 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: http://www.pierotofy.it/pages/sorgenti/dettagli/18926-KLogo/

Ultima modifica effettuata da pierotofy il 26/05/2012 alle 18:08


Il mio blog: https://piero.dev
PM Quote
Avatar
sarbaturino (Normal User)
Pro


Messaggi: 66
Iscritto: 25/04/2011

Segnala al moderatore
Postato alle 19:00
Sabato, 26/05/2012
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??

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 22:34
Sabato, 26/05/2012
Non credo di aver capito...


Il mio blog: https://piero.dev
PM Quote