1. Järgnevas on Flex-programm, milles algul sisestatakse lihtne täisrve
määrav grammatika
%option
noyywrap
NUMBER [0-9]
ARV {NUMBER}+
%%
{ARV} printf("Täisarv! ");
%%
main()
{
yylex();
}
Kui asendada väljundit moodustav rida reaga
{ARV} printf("<int> %s</int>", yytext);
moodustatakse sisendis täisarvude ümber XML-märgendid (tag)
<int>...</int>. Nii on lihtne
teisendada kogu sisend XML-märgendatud lekseemide jadaks, nii et järgnevad
teisendused võib teha (näiteks) XSL-interpretaatoriga.
2. Järgneva sisendiga moodustatakse skanner, mis loeb kokku sisendteksti read ja sümbolid:
%option noyywrap
%{
int num_lines = 0, num_chars = 0;
%}
%%
\n ++num_lines; ++num_chars;
. ++num_chars;
%%
main()
{
yylex();
printf( "Ridu: %d, Symboleid (char): %d\n", num_lines, num_chars );
}
3. Järgnev veidi suurem näide leiab sisendteksti lekseemid täisarv, reaalarv, võtmesõna, omistusmärk, loogilised- ja aritmeetilised operaatorid. Siin on oluline reeglite järjekord - näiteks omistusmärgis ":=" esinev "=" ei loeta loogiliseks operaatoriks vaid sellepärast, et omistusmärgi reegel on enne loogilise operaatori reeglit. Kasutatud on ka C-keele tüübiteisendusi atoi(), atof() sisendis esinevate täis- ja reaalarvude (sisendis - märgijadad, s.t. stringid) teisendamine "tõelisteks" täis- ja reaalarvudeks:
/* scanner pisikesele programmeerimiskeelele */
%option noyywrap
%{
/* järgnev on vajalik tüübiteisenduse funktsioonide atoi(),atof()
saamiseks*/
/* atoi() teisendab numbrite jada (stringi) täisarvuks, atof() - reaalarvuks
*/
#include <math.h>
%}
DIGIT [0-9]
ID [a-z][a-z0-9]*
%%
{DIGIT}+ {
printf( "Täisarv: %d\n", atoi( yytext ) );
}
{DIGIT}+"."{DIGIT}* {
printf( "Reaalarv: %g\n", atof( yytext ) );
}
if|then|begin|end|procedure|function {
printf( "Võtmesõna: %s\n", yytext );
}
{ID} printf( "Identifikaator: %s\n", yytext );
"+"|"-"|"*"|"/"
printf( "Aritmeetikaoperaator: %s\n", yytext );
":=" printf(" Omistamine: %s\n", yytext );
">"|"<"|"="|"!=" printf( "Loogikaoperaator:
%s\n", yytext );
";" printf(" Käsu lõpp: %s\n", yytext );
"{"[^}\n]*"}" /* eat up one-line comments */
[ \t\n]+ /* eat up whitespace */
. printf( "Tundmatu märk: %s\n", yytext );
%%
main( argc, argv )
int argc;
char **argv;
{
++argv, --argc; /* see jätab vahele programmi nime, nii et protseduuri
saab kasutada nii failist kui ka klaviatuurilt antud sisendiga*/
if ( argc > 0 )
yyin = fopen( argv[0], "r" );
else
yyin = stdin;
yylex();
}
Eelneva põhjal moodustatud skanner teisendab sisendi
väljundiks:
Identifikaator: y
Omistamine: :=
Täisarv: 3
Käsu lõpp: ;
Identifikaator: x
Omistamine: :=
Reaalarv: 2.5
Aritmeetikaoperaator: +
Identifikaator: y
Käsu lõpp: ;
Võtmesõna:: if
Identifikaator: x
Loogikaoperaator: !=
Identifikaator: y
Võtmesõna:: then
Identifikaator: y
Omistamine: :=
Identifikaator: y
Aritmeetikaoperaator: +
Täisarv: 1
Käsu lõpp: ;
Ülesandeid:
Moodusta eespoolesitatud näidete põhjal skanner, mis teisendab Pascal-i (mingi lihtsa alamosa) XML-tekstiks, kus XML-märgendid määravad lekseemi tüübi (identifikaator, arv, võtmesõna, omistamine, aritmeetiline- või loogiline operaator, eraldaja).