La versione più recente è stata modificata il 2007-03-28 19:03:40 da DenteDiLupo
Aggiunzioni:
ATTENZIONE : per un problema di parser non è possibile scrivere %% all'interno del codice che è stato sostituito con <percento><percento>
Soluzione 2
ATTENZIONE : per un problema di parser non è possibile scrivere %% all'interno del codice che è stato sostituito con <percento><percento>
Omissioni:
ATTENZIONE : per un problema di parser non è possibile scrivere %% all'interno del codice che è stato sostituito con <percento><percento>
Soluzione 2
ATTENZIONE : per un problema di parser non è possibile scrivere %% all'interno del codice che è stato sostituito con <percento><percento>
Modificato il 2007-03-28 19:02:30 da DenteDiLupo
Aggiunzioni:
Soluzione 2
%{
int i=1;
%}
%x comment
SPAZI [ \t]*
FINERIGA \n
{KEYWORD} fprintf(yyout, "%d :%30s \t<KEYWORD>\n",i,yytext);
{IDENTIFICATORE} fprintf(yyout, "%d :%30s \t<IDENTIFICATORE>\n",i,yytext);
{ASSEGNAZIONE} fprintf(yyout, "%d :%30s \t<ASSEGNAZIONE>\n",i,yytext);
{NUMERO} fprintf(yyout, "%d :%30s \t<NUMERO>\n",i,yytext);
{RELOP} fprintf(yyout, "%d :%30s \t<RELOP>\n",i,yytext);
{OP} fprintf(yyout, "%d :%30s \t<OP>\n",i,yytext);
{FINEISTRUZIONE} fprintf(yyout, "%d :%30s \t<FINEISTRUZIONE>\n",i,yytext);
{FINERIGA} i;
"{" BEGIN(comment);
<comment>[^}\n]* ;
<comment>\n i;
<comment>"}" BEGIN(INITIAL);
. ;
if (argc > 1)
yyout = fopen(argv[2], "w");
yyout = stdout;
fprintf(yyout, "INIZIO PARSER : \n");
fprintf(yyout, "\nFINE PARSER\n");
Modificato il 2007-03-28 19:00:06 da DenteDiLupo
Aggiunzioni:
ATTENZIONE : per un problema di parser non è possibile scrivere %% all'interno del codice che è stato sostituito con <percento><percento>
Omissioni:
ATTENZIONE : per un problema di parser non è possibile scrivere %% all'interno del codice che è stato sostituito con <percento><percento>
Modificato il 2007-03-28 18:59:02 da DenteDiLupo
Aggiunzioni:
ATTENZIONE : per un problema di parser non è possibile scrivere %% all'interno del codice che è stato sostituito con <percento><percento>
<percento><percento>
<percento><percento>
Omissioni:
Modificato il 2007-03-28 18:49:45 da DenteDiLupo
Omissioni:
‰‰
Modificato il 2007-03-28 18:49:30 da DenteDiLupo
Aggiunzioni:
%%
Omissioni:
%%
Modificato il 2007-03-28 18:48:42 da DenteDiLupo
Aggiunzioni:
%%
Modificato il 2007-03-28 18:46:56 da DenteDiLupo
Aggiunzioni:
‰‰
‰‰
Omissioni:
‰
\%\%
&percent;&percent;
Modificato il 2007-03-28 18:46:13 da DenteDiLupo
Aggiunzioni:
‰
\%\%
&percent;&percent;
Omissioni:
&percent;
&percent&percent
&percent&percent
Modificato il 2007-03-28 18:45:33 da DenteDiLupo
Aggiunzioni:
&percent;
Omissioni:
&percent
Modificato il 2007-03-28 18:45:16 da DenteDiLupo
Aggiunzioni:
&percent
Modificato il 2007-03-28 18:44:23 da DenteDiLupo
Aggiunzioni:
&percent&percent
&percent&percent
Omissioni:
%%
%%
Modificato il 2007-03-28 18:36:58 da DenteDiLupo
Aggiunzioni:
%%
%%
Modificato il 2007-03-28 18:36:37 da DenteDiLupo
Omissioni:
%%
%%
Modificato il 2007-03-28 18:35:20 da DenteDiLupo
Aggiunzioni:
%option noyywrap
LETTERA [A-Za-z]
DIGIT [0-9]
IDENTIFICATORE {LETTERA}({LETTERA}|{DIGIT})*
NUMERO {DIGIT}+
RELOP "<"|"<="|">"|">="|"="|"<>"
OP "+"|"-"|"/"|"*"
KEYWORD "program"|"begin"|"write"|"read"|"if"|"then"|"else"|"repeat"|"until"
ASSEGNAZIONE ":="
FINEISTRUZIONE ";"
SPAZI [ \t\n]*
COMMENTI "{"[^}]*"}"
""
{KEYWORD} |
{IDENTIFICATORE} |
{NUMERO} |
{RELOP} |
{OP} |
{FINEISTRUZIONE} |
{SPAZI} |
{COMMENTI} |
{ASSEGNAZIONE} ;
. ECHO;
""
main(int argc, char *argv[]){
--argc;
if (argc > 0)
yyin = fopen( argv[1], "r");
else
yyin = stdin;
printf("INZIO PARSER : \n");
yylex();
printf("\nFINE PARSER\n");
}
Modificato il 2007-03-28 18:31:26 da DenteDiLupo
Aggiunzioni:
Soluzione 1
Modificato il 2007-03-28 18:30:51 da DenteDiLupo [Aggiunto testo esercizi]
Aggiunzioni:
SINTASSI del LINGUAGGIO SIMPLE PAS
programma -> program identificatore ";" istruzione
istruzione -> begin istruzione listaistruzioni
istruzione -> write espressione
istruzione -> read identificatore
istruzione -> if test then istruzione else istruzione
istruzione -> if test then istruzione
istruzione -> repeat istruzione until test
istruzione -> identificatore ":=" espressione
listaistruzioni -> end
listaistruzioni -> ";" istruzione listaistruzioni
espressione -> costante
espressione -> costante op espressione
costante -> numero
costante -> identificatore
test -> espressione relop espressione
op -> "+" | "-" | "*" | "/"
relop -> "<" | "<=" | ">" | ">=" | "=" | "<>"
identificatore -> lettera (lettera | cifra)*
numero -> cifra+
lettera -> "A" | ... | "Z" | "a" | ... | "z"
cifra -> "0" | ... | "9"
Non sono previste procedure o funzioni. Tutte le variabili sono intere e sono dichiarate assegnando loro un valore. Sono inoltre previsti i caratteri spazio, nuova linea, e tabulazione come separatori, e commenti racchiusi tra parentesi graffe. Nota che, così come si evince dall’esempio, i commenti possono estendersi su più righe.
Esercizio 1
Scrivere un analizzatore lessicale che stampi solo i caratteri NON riconosciuti dal lessico. Richiamare l’analizzatore lessicale con il comando
simpas nomefileinput
Esercizio 2
Scrivere un analizzatore lessicale che stampi in uscita la lista dei token utilizzati, il numero di linea in cui si trova, il relativo lessema saltando tutti i token non significativi, cioè commenti, blank, tab, newline. Richiamare l’analizzatore lessicale con il comando
simpas2 nomefileinput nomefileoutput
Esercizio 3
Scrivere un analizzatore lessicale che stampi in uscita le informazioni, contenute nei commenti del programma, relative ad autore, data e versione del programma. Precisamente, se nel commento una riga è costituita dalla parola "AUTORE:", allora l'analizzatore restituisce in output la riga successiva, e lo stesso avviene se nei commenti si incontrano le righe costituite dalle stringhe "DATA:" oppure "VERSIONE:".
Omissioni:
Qui potete scrivere quello che volete...
La versione più vecchia di questa pagina è stata modificata il 2007-03-28 18:28:06 da DenteDiLupo []
Vista della pagina:
SIMPLE PAS
Qui potete scrivere quello che volete...
Torna a Teoria e Tecniche di Compilazione