Prílohy:1|2

Generátor FLEX & Bison

Vo Flexe definujem pravidlá, ktoré použijem v Bisone na kontrolu syntaxe.

Zostavenie flex + bison príkladu:

bison -d priklad.y 
flex priklad.lex 
gcc lex.yy.c priklad.tab.c

Výstup z gcc bude súbor a.out.

Rozpoznane IP a tel. čísel oddelených čiarkou

Pomocou nástroja bison vygenerujte analyzér, ktorý akceptuje vstup v nasledovnom formáte:

siet: <ip_adresa>, <ip_adresa>, <ip_adresa>, ... \n
kontakt: <tel_cislo>, <tel_cislo>, <tel_cislo>, ... \n

Token ip adresy aj telefónneho čísla sa musí vyskytovať minimálne raz, maximálne N krát.

generator1.lex

%{
#include "generator1.tab.h"

#include <stdio.h>
#include <string.h>
%}
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}
ciarka \,
%%
{ipadresa}  { yylval = strdup(yytext); return IP; }
{telcislo}  { yylval = strdup(yytext); return CISLO; }
{ciarka}  { yylval = strdup(yytext); return CIARKA; }
%%
int yywrap() {
        return 1;
}

generator1.y

%{
%}
%token IP CISLO CIARKA
%%
vstup	: siet 
	| kontakt
	;

siet	: siet CIARKA IP 
	| IP
        ;

kontakt : kontakt CIARKA CISLO
        | CISLO
        ;

%%
int main()
{
        yyparse();
        return 0;
}
int yyerror(char *msg)
{
        printf("Chyba: %s\n", msg);
}

Rozpoznanie programovacieho jazyka

Pomocou nástroja bison vygenerujte analyzér, ktorý na vstupe rozpozná jednoduchý programovací jazyk, na základe nasledujúceho príkladu:

vstup z; vystup z;
x=3;
y=4;
z=(x+y*y+z)/2+10;
vystup z;
vystup (x+y)/3.

Použite tokeny, ktoré sa rozpoznávali v úlohe Vlastná implementácia.

generator2.lex

%{
#include "generator2.tab.h"

#include <stdio.h>
#include <string.h>
%}
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} 	{ yylval = strdup(yytext); return KLUCOVESLOVO; }
{identifikator} { yylval = strdup(yytext); return IDENTIFIKATOR; }
{konstanta} 	{ yylval = strdup(yytext); return KONSTANTA; }
{priradenie} 	{ yylval = strdup(yytext); return PRIRADENIE; }
{scitanie} 	{ yylval = strdup(yytext); return SCITANIE; }
{odcitanie} 	{ yylval = strdup(yytext); return ODCITANIE; }
{nasobenie} 	{ yylval = strdup(yytext); return NASOBENIE; }
{delenie} 	{ yylval = strdup(yytext); return DELENIE; }
{bodkociarka} 	{ yylval = strdup(yytext); return BODKOCIARKA; }
{lavazatvorka} 	{ yylval = strdup(yytext); return LAVAZATVORKA; }
{pravazatvorka} { yylval = strdup(yytext); return PRAVAZATVORKA; }
%%
int yywrap() {
        return 1;
}

generator2.y

%{
%}
%token KLUCOVESLOVO IDENTIFIKATOR KONSTANTA PRIRADENIE SCITANIE ODCITANIE NASOBENIE DELENIE BODKOCIARKA LAVAZATVORKA PRAVAZATVORKA
%%
jazyk	: prikazy BODKOCIARKA 
prikazy	: prikazy BODKOCIARKA prikaz
	| prikaz
	;
prikaz	: KLUCOVESLOVO vyraz
	| IDENTIFIKATOR PRIRADENIE vyraz
	;
vyraz		:	vyraz operator vyraz
		|	KONSTANTA
		|	IDENTIFIKATOR
		|	LAVAZATVORKA vyraz PRAVAZATVORKA
		;
operator	:	SCITANIE
		|	ODCITANIE
		|	NASOBENIE
		|	DELENIE
		;
%%
int main()
{
        yyparse();
        return 0;
}
int yyerror(char *msg)
{
        printf("Chyba: %s\n", msg);
}