SIMPLE PAS
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
Soluzione 1
ATTENZIONE : per un problema di parser non è possibile scrivere %% all'interno del codice che è stato sostituito con <percento><percento>
%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 "{"[^}]*"}"
<percento><percento>
{KEYWORD} |
{IDENTIFICATORE} |
{NUMERO} |
{RELOP} |
{OP} |
{FINEISTRUZIONE} |
{SPAZI} |
{COMMENTI} |
{ASSEGNAZIONE} ;
. ECHO;
<percento><percento>
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");
}
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
Soluzione 2
ATTENZIONE : per un problema di parser non è possibile scrivere %% all'interno del codice che è stato sostituito con <percento><percento>
%option noyywrap
%{
int i=1;
%}
%x comment
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]*
FINERIGA \n
<percento><percento>
{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);
{SPAZI} |
. ;
<percento><percento>
main(int argc, char *argv[]){
--argc;
if (argc > 0)
yyin = fopen( argv[1], "r");
else
yyin = stdin;
if (argc > 1)
yyout = fopen(argv[2], "w");
else
yyout = stdout;
fprintf(yyout, "INIZIO PARSER : \n");
yylex();
fprintf(yyout, "\nFINE PARSER\n");
}
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:".
Torna a Teoria e Tecniche di Compilazione
Non ci sono commenti in questa pagina. [Scrivi commento]