Sartomiki.net

  • Aumenta dimensione caratteri
  • Dimensione caratteri predefinita
  • Diminuisci dimensione caratteri
Home Esercizi Jflex e CUP Esercizio 3 - JFlex - Scanner C->HTML

Esercizio 3 - JFlex - Scanner C->HTML

E-mail Stampa PDF
Valutazione attuale: / 0
ScarsoOttimo 

Testo
Scrivere un analizzatore lessicale mediante un programma JFLEX che, dati in ingresso uno o più sorgenti C, riconosca tutti gli elementi propri di tale linguaggio (costanti numeriche, stringhe, direttive del prepocessore, keyword e commenti) e produca in uscita un file HTML in cui ciascun elemento risulti evidenziato con un colore diverso. Tutti i file in ingresso devono comparire in un unico file HTML preceduti dal nome del sorgente di origine. Si ricorda che in HTML i colori vengono espressi con un ‘#’ seguito da tre coppie di cifre esadecimali, ciascuna delle quali rappresenta una componente fondamentale della terna RGB (quindi “#FF0000” è un rosso acceso, “#0000FF” è un blu e così via).

Esempio
Dato il seguente file di ingresso (di nome main.c):
#include <stdio.h>
int prova(int i)
{
if (i==1) return 1;
/* questo è un commento */
else
return 0;
}
si ottiene in uscita quanto segue:
<HTML>
<BODY bgcolor="#FFFFFF">
<H2>main.c</H2>
<CODE>
<FONT COLOR="#00FF00">#include &lt;stdio.h&gt;</FONT>
<br>
<FONT COLOR=#0000FF">int</FONT> prova(
<FONT COLOR=#0000FF">int</FONT> i)<br>
{<br>
<FONT COLOR="#0000FF?>if<(/FONT>
(i==<FONT COLOR="#FF0000">1</FONT>)
<FONT COLOR=#0000FF">return</FONT>
<FONT COLOR="#FF0000">1</FONT>;<br>
<FONT COLOR="#C0C0C0">/*questo è un commento*/
</FONT><BR>
<FONT COLOR=#0000FF">else</FONT>
<FONT COLOR=#0000FF">return</FONT>
<FONT COLOR="#FF0000">0</FONT>;<br>
}<br>
</CODE>
</BODY>
</HTML>

Soluzione
class Colors
{
public static final String MACRO = new String("#00CC00");
public static final String CONSTANT = new String("#CCFFFF");
public static final String NUMBER = new String("#0000CC");
public static final String COMMENT = new String("#CCCCCC");
public static final String STRING = new String("#CC0000");
}

%%

%class e3
%standalone
%xstate COMMENT
%xstate STRING

commentopen = \/\*
commentclose = \*\/
simplecomment = \/\/.*
number = [^a-zA-Z](0x)?[0-9]+(\.[0-9]+)*[^a-zA-Z]
cmacro = [ \t]*\#.*
keyword = (auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if
|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)
newline = (\r|\n|\r\n)
stringboundary = \"

%%

^{cmacro}$ { System.out.println("<font color=\"" + Colors.MACRO + "\">" + yytext().replaceAll("<", "&lt;").replaceAll(">", "&gt;") + "</font>"); }
{keyword} { System.out.println("<b>" + yytext() + "</b>"); }
{newline} { System.out.println("<br>"); }
{number} { System.out.println(yytext().charAt(0) + "<font color=\"" + Colors.NUMBER + "\">" + yytext().substring(1, yytext().length() - 1) + "</font>" + yytext().charAt(yytext().length() - 1)); }
{simplecomment} { System.out.println("<font color=\"" + Colors.COMMENT + "\">" + yytext() + "</font>"); }

{commentopen} { yybegin(COMMENT); System.out.print("<font color=\"" + Colors.COMMENT + "\">/*");  }
<COMMENT>{newline} { System.out.println("<br>"); }
<COMMENT>{commentclose} { yybegin(YYINITIAL); System.out.println(yytext() + "</font>"); }

{stringboundary} { yybegin(STRING); System.out.print("<font color=\"" + Colors.STRING + "\">\"");  }
<STRING>{newline} { System.out.println("<br>"); }
<STRING>{stringboundary} { yybegin(YYINITIAL); System.out.println(yytext() + "</font>"); }


blog comments powered by Disqus
 

http://sartomiki.net/modules/mod_fuofb/assets/it/find-us-on-facebook-1.png

Follow me

Amici

Chi è online

 12 visitatori online

Siti amici

Banner

Notizie flash

Stiamo lavorando per voi... A breve saranno aggiunte nuove pagine sul sito. Per il momento oltre a questo sito in costruzione puoi visitare i miei sottodomini: http://catene.sartomiki.net e http://fasi.sartomiki.net. STAY TUNED!

PUBBLICITA'