INFOPedia : TTCSimplePas

HomePage :: Categorie :: Indice :: Ultime modifiche :: Ultimi commenti :: Login/Registrazione

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]

Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by Wikka Wakka Wiki 1.1.6.1
La pagina è stata generata in 0.0346 secondi