L'articolo su come installa Flex è leggibile
qui.
Primo esempio.
Il primo applicativo con Flex che vi proponiamo consiste nell'eliminare i commenti
C-style da un qualunque file in ingresso. Siccome vogliamo utilizzare il semplice
analizzatore lessicale senza fare uso di un
analizzatore sintattico (come ad esempio
Bison) che prende in ingresso la funzione
yylex() generata da Flex abbiamo implementato nella sezione delle
procedure di supporto un
main() che faccia funzionare
stand-alone il programma creato con
cc. Questo è il listato in ingresso a Flex:
%%
"/*".*"*/"
"//".*
"/*"[^"*/"]+"*/"
%%
int main(int argc, char *argv[]) {
yyin = fopen(argv[1], "r");
yylex();
fclose(yyin);
}
Dopo averlo compilato con questo comando:
flex nomefile
verrà creato un file
lex.yy.c (il file creato avrà sempre questo nome, indipendentemente dal nome del file da compilare!). Compiliamo questo file con
cc oppure con
gcc¹:
cc lex.yy.c -lfl se invece usiamo
Lex il comando sarà:
cc lex.yy.c -ll
Otterremo l'eseguibile
a.out che manderemo in esecuzione con il seguente comando:
./a.out nomefiledaanalizzare Se creassimo un file con il seguente contenuto:
Commento su singola riga 1:
/* commento su singola riga */
Commento su singola riga 2:
// commento su singola riga
Commento su più righe:
/* commento
su
più
righe */
e lo dessimo in pasto all'eseguibile sopracitato, avremmo in uscita su console (a meno di redizionare l'output altrove) il seguente testo:
Commento su singola riga 1:
Commento su singola riga 2:
Commento su più righe:
Secondo esempio.
Vediamo ora come mandare su console un messaggio di errore e terminare l'esecuzione del programma ogni volta che l'applicativo incontra la direttiva
#INCLUDE. Occorre notare che il pattern #INCLUDE può essere sostituito da qualunque altro pattern.
%%
"#include" { printf("ERROR !!! directive #include found.\n");
return 0; }
%%
int main(int argc, char *argv[]) {
yyin = fopen(argv[1], "r");
yylex();
fclose(yyin);
}
Dopo averlo compilato con questo comando:
flex nomefile
verrà creato un file
lex.yy.c (il file creato avrà sempre questo nome, indipendentemente dal nome del file da compilare!). Compiliamo questo file con
cc oppure con
gcc¹:
cc lex.yy.c -lfl
se invece usiamo
Lex il comando sarà:
cc lex.yy.c -ll
Otterremo l'eseguibile
a.out che manderemo in esecuzione con il seguente comando:
./a.out nomefiledaanalizzare Se creassimo un file in cui è presente il pattern #INCLUDE l'applicativo restituirà un errore del tipo:
ERROR !!! directive #include found.
e l'esecuzione dell'applicativo verrà terminata.
¹
In un sistema Debian-like out-of-the-box (appena installato) sicuramente non saranno presenti le librerie necessarie all'esecuzione di cc/gcc. Installiamole con il comando:
sudo apt-get install libc6-dev