Generátor FLEX

Dokument bez názvu

Program Flex generuje zo súboru prvy.c súbor druhy.c ktorý po skompilovaní rozpoznáva regulárne výrazy definované v prvy.c.

IP adresa a telefónne číslo

Pomocou nástroja lex vygenerujte analyzér, ktorý na vstupe rozpozná IP adresu a telefónne číslo.

Súbor prvy.c je šablóna rozdelená do troch častí oddelených znakmi %%. Regulárne výrazy umiestnime do strednej časti:

%{
#include <stdio.h>
#include <string.h>
int poc_mien = 0;
//{meno} { printf("meno:%s\n", yytext); poc_mien++; }
//{vek} { printf("vek:%s\n", yytext); }

%}
ipadresa (([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
telcislo (\+421)?\ ?[0-9]{3,4}\ ?[0-9]{3}\ ?[0-9]{3}
%%
{ipadresa} { printf("IP: %s\n", yytext); }
{telcislo} { printf("Tel cislo: %s\n", yytext); }
%%
int yywrap() {
return 1;
}
int main(void) {
yylex();
printf("pocet mien:%i\n", poc_mien);
return 0;
}

Parser tokenov

Pomocou nástroja lex vygenerujte analyzér, ktorý na vstupe rozpozná také isté tokeny, ako sa rozpoznávali v úlohe Tabuľkou riadená implementácia.

%{
#include <stdio.h>
#include <string.h>
int poc_mien = 0;
//{meno} { printf("meno:%s\n", yytext); poc_mien++; }
//{vek} { printf("vek:%s\n", yytext); }

%}
znak [A-Za-z]
cislica [0-9]
vek {cislica}+

klucoveslovo (vstup|vystup)*
identifikator {znak}({znak}|{cislica})*
konstanta {cislica}+
priradenie \=
scitanie \+
odcitanie \-
nasobenie \*
delenie \/
bodkociarka \;
lavazatvorka \(
pravazatvorka \)
%%
{klucoveslovo} { printf("klucoveslovo: %s\n", yytext); }
{identifikator} { printf("identifikator: %s\n", yytext); }
{konstanta} { printf("konstanta: %s\n", yytext); }
{priradenie} { printf("priradenie: %s\n", yytext); }
{scitanie} { printf("scitanie: %s\n", yytext); }
{odcitanie} { printf("odcitanie: %s\n", yytext); }
{nasobenie} { printf("nasobenie: %s\n", yytext); }
{delenie} { printf("delenie: %s\n", yytext); }
{bodkociarka} { printf("bodkociarka: %s\n", yytext); }
{lavazatvorka} { printf("lavazatvorka: %s\n", yytext); }
{pravazatvorka} { printf("pravazatvorka: %s\n", yytext); }
%%
int yywrap() {
return 1;
}
int main(void) {
yylex();
printf("pocet mien:%i\n", poc_mien);
return 0;
}

Overenie vstupu

Pripravený zdrojový kód najskôr prevedieme programom Flex: flex prvy.c.
Výstupom bude lex.yy.c, ktorý následne skompilujeme do strojového kódu: gcc lex.yy.c -o vystup.

Program spustíme príkazom ./vystup. Po zadaní textu a odriadkovania uvidíme, ktorým regulárnym výrazom vstup vyhovuje.

potto@debian:~/flex$ ./tel_cislo
0907 425 634
Tel cislo: 0907 425 634

+421 907 4256344
Tel cislo: +421 907 425634
4
nie som cislo
nie som cislo