CASO DI STUDIO:                  LINGUAGGI                      DI               PROGRAMMAZIONE                ANNO 2006/0...
Documentazione Caso di studio Linguaggi di programmazioneData la grammatica di un (frammento di un) linguaggio di programm...
•   If… then … else italianizzato se … allora … altrimenti ; costrutto di selezione .    •   while… do che diverrà fintant...
•   Operazioni da eseguire           (assegnazioni,   espressioni matematiche, cicli, stampe,        acquisizioni,condizio...
<CODICE1> ::= <CALCOLO> ; [<CODICE1>] | per ( [ <INIZIALIZZAZIONE> ;] <CONDIZIONE> ;<CALCOLO> ) <START> [<CODICE1>] | ripe...
CODIFICA:/* Caso di studio di linguaggi di programmazione*/options{    STATIC      = false; // default TRUE    LOOKAHEAD  ...
PARSER_BEGIN (casodistudio)// eventuale dichiarazione di package// eventuale lista di importpublic class casodistudio {   ...
| <PARAP: "(">                      //token della parentesi aperta        | <PARCH: ")">                      //token dell...
| <VIR: ",">                    //token per la virgola        | <IDENTIFICATORE: (["A"-"Z"])+>//token per la gestione dell...
{ calcolo() <SEMICOLON> [codice1()] | <FOR> <PARAP> [inizializzazione() <SEMICOLON>]condizione() <SEMICOLON> calcolo() <PA...
void reale():{}        { (<NUM>)+[<VIR>(<NUM>)+]}                                //regole che definiscono comecreare un nu...
Secondo test:-inserisco il costrutto for all interno del codice definendo le variabili e chiudendo il corpo delcostrutto a...
Quarto test:-inserisco il costrutto while do all interno del codice definendo le variabili e chiudendo il corpo delcostrut...
Sesto test:-inserisco il costrutto if then else all interno del codice definendo le variabili e chiudendo il corpodel ramo...
Viene anche mostrato un messaggio che cosa ci si sarebbe aspettato al posto   dellerrorecommesso.Pag. 15 di 15
Upcoming SlideShare
Loading in …5
×

Linguaggi Di Programmazione Caso Di Studio

944 views
862 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
944
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
17
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Linguaggi Di Programmazione Caso Di Studio

  1. 1. CASO DI STUDIO: LINGUAGGI DI PROGRAMMAZIONE ANNO 2006/07Pag. 1 di 15
  2. 2. Documentazione Caso di studio Linguaggi di programmazioneData la grammatica di un (frammento di un) linguaggio di programmazione, mediante strumentiautomatici (ANTLR o JavaCC), realizzare in linguaggio Java un programma che implementi:  uno scanner per un linguaggio di programmazione di cui viene documentato formalmente il vocabolario  un parser ricorsivo discendente per un frammento di linguaggio di programmazioneANALISIL’obiettivo è scrivere una grammatica dalla quale generare attraverso JavaCC le classi Lexer eParser che compongono l’analizzatore sintattico del linguaggio di programmazione che si propone.Si parte dalla scelta del linguaggio di programmazione oggetto del caso di studio e si forniscel’alfabeto.Il linguaggio di programmazione posto all’attenzione è il Pascal con alcuni richiami di Java.Il linguaggi da implementare sarà una forma italianizzata dei linguaggi di programmazione appenamenzionati.Tutte le parole chiave sono in lingua italiana per un più facile utilizzo dello strumento stesso.I costrutti utilizzati sono : • begin … end che italianizzato diverrà inizio … fine ; questo è preso dal linguaggio pascal ed è utile al fine di rendere più chiara la lettura del codice ed eliminare l’ambiguità legata al costrutto if … then … else.Pag. 2 di 15
  3. 3. • If… then … else italianizzato se … allora … altrimenti ; costrutto di selezione . • while… do che diverrà fintanto che(condizione) fai… seguita dal costrutto inizio … fine costrutto di ciclo a controllo in testa. La sua sintassi è presa dal linguaggio Java. • repeat … until(condizione) che diverrà ripeti … finchè (condizione) ; costrutto a ciclo a controllo in coda. Anche questo è preso dal linguaggio java. • for (inizializzazione, condizione, passo) …. ; sarà scritto come Per (inizializzazione, condizione, passo). Sintassi dal linguaggio Java.Per implementare la sintassi delle espressioni matematiche varrà la seguente forma :variabile = variabile | numero reale | espressione matematica, dove l’espressione aritmetica èformata da operazioni aritmetiche tra variabili. Per definire l’ordine delle operazioni si potrannousare le parentesi tonde.Saranno previsti inoltre comandi per le operazioni base di un linguaggio di programmazione qualela stampa a video di una variabile e l’acquisizione da tastiera di una variabile .Le variabili che il compilatore progettato tratterà saranno dei seguenti tipi: • Interi • Reali • Reali a singola precisione • Reali a doppia precisione • Carattere • Stringa • Booleano • PuntatoreUn identificatore sarà formato da un insieme di caratteri. Tutte le lettere devono esseremaiuscole.Le parole chiave invece dovranno essere scritte interamente in minuscolo poiché il linguaggio saràcase sensitive.Inoltre la sintassi di un programma sarà divisa in 2 parti: • Dichiarazione delle variabiliPag. 3 di 15
  4. 4. • Operazioni da eseguire (assegnazioni, espressioni matematiche, cicli, stampe, acquisizioni,condizioni)Nella prima parte avremo, dopo aver dichiarato l’inizio del programma con la parola chiave iniziodel costrutto inizio … fine, la dichiarazione delle variabili. In questo spazio potranno esseredichiarate tutte le variabili da utilizzare fino a che non verrà digitata la prima istruzione accettatadal linguaggio che non sia una dichiarazione di variabile.Avvenuto questo inizierà la seconda parte del programma dove se ci sarà una dichiarazione divariabile il parser rileverà un errore e terminerà. In caso contrario continuerà a controllare lasintassi di tutte le istruzioni digitate e dopo l’ultima istruzione deve essere presente la parolachiave fine del costrutto inizio … fine. Se tutte le istruzioni digitate sono accettabili secondo lagrammatica il parser terminerà la scansione con successo.Se nelle istruzioni digitate ci saranno delle condizioni o dei cicli, al loro interno sarà possibiledichiarare altre variabili che verranno considerate locali al blocco di istruzioni.Per concludere, quando si verificherà un errore la sua gestione sarà disponibile in lingua italiana.PROGETTAZIONEGrammatica del linguaggio in notazione (E)BNF:<START> ::= inizio; [ <CODICE> ] fine;<CODICE> ::= [ <DICHIARAZIONE> ] <CODICE1><DICHIARAZIONE> ::= <TIPO> <IDENTIFICATORE>; [ <DICHIARAZIONE> ]<TIPO> ::= intero | reale | stringa | doppiaprecisione | singolaprecisione | carattere | booleano |puntatorePag. 4 di 15
  5. 5. <CODICE1> ::= <CALCOLO> ; [<CODICE1>] | per ( [ <INIZIALIZZAZIONE> ;] <CONDIZIONE> ;<CALCOLO> ) <START> [<CODICE1>] | ripeti <START> finche ( <CONDIZIONE> ) [<CODICE1>] |fintanto che ( <CONDIZIONE> ) fai <START> [<CODICE1>] | se ( <CONDIZIONE> ) allora <START>[ altrimenti <START> ] [ <CODICE1> ] | stampa( <IDENTIFICATORE> ) ; [ <CODICE1> ] | leggi<IDENTIFICATORE> ; [ <CODICE1> ]-ESPRESSIONI MATEMATICHE-<CALCOLO>::= <IDENTIFICATORE> = <CALCOLO1><CALCOLO1>::= ( <CALCOLO1> ) [ <OPERAZIONI> <CALCOLO1> ] | <CALCOLO2><CALCOLO2>::= <IDENTIFICATORE> [ <OPERAZIONI> <CALCOLO1> ]| <REALE> [ <OPERAZIONI><CALCOLO1> ]<OPERAZIONI>::= / | + | - | *-NUMERI REALE-<REALE>::= (<NUM>)+ [ , (<NUM>)+ ]-COSTRUTTI-<INIZIALIZZAZIONE>::= <TIPO> <IDENTIFICATORE><CONDIZIONE>::= <IDENTIFICATORE> <RAPPORTO> <CALCOLO1><RAPPORTO>::= <= | < | > | >= | == | != | => | =<<IDENTIFICATORE>::= ( [ “A” - ”Z” ] )+<NUM>::= ( [ “0” - ”9” ] )+Pag. 5 di 15
  6. 6. CODIFICA:/* Caso di studio di linguaggi di programmazione*/options{ STATIC = false; // default TRUE LOOKAHEAD = 2; // default 1 IGNORE_CASE = true; // default false}Pag. 6 di 15
  7. 7. PARSER_BEGIN (casodistudio)// eventuale dichiarazione di package// eventuale lista di importpublic class casodistudio { public static void main(String args[]) throws ParseException { casodistudio parser = new casodistudio(System.in); parser.start(); }}PARSER_END (casodistudio)SKIP : { " " | "t" | "n" | "r" }SKIP:{ <"/*"> : COMMENTO //gestione dei commenti}<COMMENTO>SKIP:{ <"/*"> : DEFAULT //ritorno dalla gestione dei commenti| <~[ ]>}TOKEN :{ <NUM: (["0"-"9"])+> //token dei numeri | <PIU: "+"> //token della somma | <MENO: "-"> //token della sottrazione | <PER: "*"> //token della moltiplicazione | <DIV: "/"> //token della divisionePag. 7 di 15
  8. 8. | <PARAP: "("> //token della parentesi aperta | <PARCH: ")"> //token della parentesi chiusa | <ELSE: "altrimenti"> //token del ramo else | <IF: "se"> //token dell if | <FOR: "per"> //token del for | <REPEAT: "ripeti"> //token del repeat | <UNTIL: "finche"> //token del until | <WHILE: "fintanto che"> //token del while | <DO: "fai"> //token del do | <THEN: "allora"> //token del then | <SEMICOLON: ";"> //token del semicolon | <STAMPA: "stampa"> //token per la stampa | <LEGGI: "leggi"> //token per la lettura | <INIZIO: "inizio"> //token di inizio | <FINE: "fine"> //token per la fine | <UGUALE: "="> //token per luguale | <MINORESR: "<"> //token per il minore stretto | <MAGGIORESR: ">"> //token per la maggiore stretto | <MAGGIORE: ">="|"=>"> //token per il maggiore uguale | <MINORE: "<="|"=<"> //token per il minore uguale | <DIVERSO: "!="|"=!"> //token per il diverso | <EQUIVALENTE: "=="> //token per lequivalenza | <INT: "intero"> //token per gli integer | <REAL: "reale"> //token per i real | <STRING: "stringa"> //token per le string | <CHAR: "carattere"> //token per i char | <BOOLEAN: "booleano"> //token per i boolean | <FLOAT: "singolaprecisione"> //token per i float | <DOUBLE: "doppiaprecisione">//token per i double | <POINTER:"puntatore"> //token per i puntatoriPag. 8 di 15
  9. 9. | <VIR: ","> //token per la virgola | <IDENTIFICATORE: (["A"-"Z"])+>//token per la gestione delle variabili}void start() :{} { <INIZIO> <SEMICOLON> [codice()] <FINE> <SEMICOLON> } //regola che definiscecome deve iniziare un programmavoid codice() :{} { [dichiarazione()] codice1() } //regola che definisce che il programma deve essere diviso in2 parti una destinata alla dichiarazione e uno destinato al codicevoid dichiarazione() :{} { tipo() <IDENTIFICATORE> <SEMICOLON> [dichiarazione()] } //regola che definisce ladichiarazionevoid tipo() :{} { <INT> | <REAL> | <STRING> | <CHAR> | <BOOLEAN> | <FLOAT> | <DOUBLE> | <POINTER>} //regola che definisce i tipivoid codice1() :{}Pag. 9 di 15
  10. 10. { calcolo() <SEMICOLON> [codice1()] | <FOR> <PARAP> [inizializzazione() <SEMICOLON>]condizione() <SEMICOLON> calcolo() <PARCH> start() [codice1()] | <REPEAT> start() <UNTIL><PARAP> condizione() <PARCH> [codice1()] | <WHILE> <PARAP> condizione() <PARCH> <DO>start() [codice1()] | <IF> <PARAP> condizione() <PARCH> <THEN> start() [<ELSE> start()] [codice1()]| <STAMPA> <PARAP> <IDENTIFICATORE> <PARCH> <SEMICOLON> [ codice1() ] | <LEGGI><IDENTIFICATORE> <SEMICOLON> [codice1()] } //regole che definiscono i costrutti dellinguaggio di programmazione//regole per il calcolovoid calcolo() :{} { <IDENTIFICATORE> <UGUALE> calcolo1() } //regola che definisce linizio diuna espressione matematicavoid calcolo1() :{} { <PARAP> calcolo1() <PARCH> [ operazioni() calcolo1() ] | calcolo2() } //regola chedefinisce la regolarità delle parentesi tondevoid calcolo2() :{} { <IDENTIFICATORE> [ operazioni() calcolo1() ] | reale() [ operazioni() calcolo1() ] } //regolache definisce una espressione matematica semplicevoid operazioni() :{} { <DIV> | <PIU> | <MENO> | <PER> } //regola che definisce il tipo dioperazione che si possono compiere nelle operazioni matematiche//regole per i numeri realiPag. 10 di 15
  11. 11. void reale():{} { (<NUM>)+[<VIR>(<NUM>)+]} //regole che definiscono comecreare un numero reale//regole per i costruttivoid inizializzazione() :{} { tipo() <IDENTIFICATORE> } //regola che definisce la dichiarazione diuna variabilevoid condizione() :{} { <IDENTIFICATORE> rapporto() calcolo1() } //regola che definisce la forma dellacondizionevoid rapporto() :{} { <MAGGIORESR> | <MINORESR> | <MAGGIORE> | <MINORE> | <DIVERSO> |<EQUIVALENTE> }//regola che definisce il tipo di condizioneTEST:Primo test:-inserisco una funzione matematica all interno del codice con utilizzo di parentesi per definire leprecedenze tra le varie operazioni:Pag. 11 di 15
  12. 12. Secondo test:-inserisco il costrutto for all interno del codice definendo le variabili e chiudendo il corpo delcostrutto allinterno di inizio e fine;Terzo test:-inserisco il costrutto repeat-until all interno del codice definendo le variabili e chiudendo il corpodel costrutto allinterno di inizio e fine;Pag. 12 di 15
  13. 13. Quarto test:-inserisco il costrutto while do all interno del codice definendo le variabili e chiudendo il corpo delcostrutto allinterno di inizio e fine;Quinto test:-inserisco le operazioni di stampa e di lettura di una variabile all interno del corpo di unprogramma;Pag. 13 di 15
  14. 14. Sesto test:-inserisco il costrutto if then else all interno del codice definendo le variabili e chiudendo il corpodel ramo vero e falso del costrutto allinterno di inizio e fine;Settimo test:-in caso di presenza di un errore viene mostrato un messaggio in lingua italiana che indica qualeerrore è stato individuato e le coordinate di tale errore.Pag. 14 di 15
  15. 15. Viene anche mostrato un messaggio che cosa ci si sarebbe aspettato al posto dellerrorecommesso.Pag. 15 di 15

×