Sei sulla pagina 1di 7

UNIVERSIDAD NACIONAL JORGE BASADRE GROHMANN

FACULTAD DE INGENIERÍA

ESCUELA ACADÉMICO PROFESIONAL DE INGENIERÍA EN INFORMÁTICA Y SISTEMAS

PRACTICA Nº6: “ANALISIS SINTACTICO CON BISON”

CURSO: Compiladores y teoría de lenguajes

DOCENTE: Ing. Hugo Barraza Vizcarra

ESTUDIANTE: Condori Cabrera Diego Armando

CÓDIGO UNIVERSITARIO: 2015-119013

AÑO: Tercero CICLO: Sexto SECCIÓN: Mañana

FECHA DE ELABORACION: 29/09/17

FECHA DE ENTREGA DE LA TAREA: 06/10/17


EJEMPLO 01: ANALIZADOR PARA FRASES

 Se crea el archivo frase.l

%{
#include <string.h>
#include "frase.tab.h"
%}

%%

el|la|los|las { return ARTICULO; }


hijo|hija|hijos|hijas|coche|casa|barco|gato|gata|gatos|gatas|manzana|m
anzanas|pan|panes { return NOMBRE; }
azul|rojo|veloz|alto|alta|altos|altas|feo|fea|feos|feas { return
ADJETIVO;}
come|comen|mira|miran|salta|saltan|rie|rien|vive|viven { return VERBO;
}
a|de|en|con|por|desde { return PREPOSICION; }

\n { return ('\n');}

. ;
%%

 Se crea el archivo frase.y

%{
#include <stdlib.h>
#include <stdio.h>
#define YYSTYPE char*
%}
%token ARTICULO NOMBRE ADJETIVO PREPOSICION VERBO

%%

dialogo :frase
|dialogo frase
;
frase : '\n'
|sujeto predicado '\n'{printf("\n>> Frase correcta\n");}
;
sujeto :frase_nominal
;
frase_nominal :NOMBRE
|ARTICULO NOMBRE
|ARTICULO NOMBRE ADJETIVO
|ARTICULO NOMBRE frase_preposicional
;
frase_preposicional :PREPOSICION frase_nominal
;
predicado :frase_verbal
;
frase_verbal :VERBO
|VERBO frase_nominal
|VERBO frase_preposicional
;

%%

int main(){
yyparse();
}

yyerror (char *s){


printf("%s\n",s);
}

int yywrap(){
return 1;
}

Ejecutamos en la terminal:

$ bison –d frase.y

$ flex frase.l

$ gcc –o frase frase.tab.c lex.yy.c

 Primero ejecutamos la frase.y que sería el bison que genera frae.tab.h , lo que
hará será verificar el orden en que se inserten en conjunto de palabras, ya que
deben estar en un orden gramatical.
 Luego ejecutamos frase.l que sería el lex que genera lex.yy.c, nos permitirá tomar
conjunto de caracteres que formen una palabra.
 Luego se genera el ejecutable que sería nuestra aplicación
 Finalmente creamos un ejemplo1.txt donde se ingresó una frase correcta: “El gato
come” y otra incorrecta “el come gato”. Respectivamente el terminal me arroja un
mensaje de frase correcta y la otra incorrecta.
EJEMPLO 02: CALCULADORA DE SUMAS Y RESTAS

 Se crea el archivo calculadora.l


%{
#include "calculadora.tab.h"
%}
NUM [0-9]+

%%
{NUM} { yylval = atoi(yytext);
return (ENTERO);}
"+"|"-" { return (yytext[0]);}
"\n" { return (yytext[0]);}
. ;
%%

 Se crea el archivo calculadora.y

%{
#define YYSTYPE int
#include <math.h>
#include <stdio.h>
%}

/* Declaraciones de BISON */
%token ENTERO
%left '-' '+'

/* Gramatica */
%%

input : /* cadena vacia */


| input line
;
line :'\n'
| exp '\n' { printf ("\t%d\n",$1);}
;
exp : ENTERO { $$ = $1;}
| exp '+' exp {$$ = $1 + $3;}
| exp '-' exp {$$ = $1 - $3;}
;

%%

int main(){
yyparse();
}

yyerror (char *s){


printf("%s\n", s);
}

int yywrap() {
return 1;
}
 Primeramente ejecutamos el bison de calculadora.y, este archivo nos
permitirá sumar o restar dos tokens que se encuentren, se generara el
calculadora.tab.h.
 Luego se genera el lex.yy.c de calculadora.l, donde capturara los tokens de
signos “+” o “-” y números.
 Luego generamos el aplicativo llamado calculadora y creamos un archivo
ejemplo2 donde insertaremos “5+5” votándonos como resultado 10.

EJEMPLO 3: CALCULADORA CON EXPRESIONES ATIRMETICAS COMPLEJAS

 Se crea ejemplo3.l
%{
#include "ejemplo3.tab.h"
#include <stdlib.h>
#include <stdio.h>

%}
white [\t]+
digit [0-9]
integer {digit}+
%%
{white} { /* Ignoramos espacios en blanco */}
"exit"|"quit"|"bye" {printf("Terminando
programa\n");exit(0);}
{integer} {
yylval.dval=atof(yytext);
return(NUMBER);
}
"+" return(SUMA);
"-" return(RESTA);
"*" return(MULTI);
"/" return(DIVIDE);
"^" return(EXPO);
"(" return(IZQ_PAREN);
")" return(DERE_PAREN);
"\n" return(END);
%%
 Se crea el archivo ejemplo3.y

%{
#include <stdio.h>
#include <math.h>
%}
%union {
double dval;
}
%token <dval> NUMBER
%token SUMA RESTA MULTI DIVIDE EXPO
%token IZQ_PAREN DERE_PAREN
%token END
%left SUMA RESTA
%left MULTI DIVITE
%left NEG
%right EXPO
%type <dval> Expression
%start Input
%%

Input: Line
|Input Line
;
Line: END
| Expression END {printf("Result: %f\n",$1);}
;
Expression: NUMBER {$$=$1;}
|Expression SUMA Expression{$$=$1+$3;}
|Expression RESTA Expression{$$=$1-$3;}
|Expression MULTI Expression{$$=$1*$3;}
|Expression DIVIDE Expression{$$=$1/$3;}
|RESTA Expression %prec NEG{$$=-$2;}
|Expression EXPO Expression {$$=pow($1,$3);}
|IZQ_PAREN Expression DERE_PAREN {$$=$2;}
;
%%
int yyerror(char *s){
printf("%s\n",s);
}
int main(void){
yyparse();
}
 Primeramente tenemos que generar ejemplo3.tab.h de ejemplo3.y, nos
permitirá generar operaciones aritméticas de acuerdo a los tokens recibidos.
 Luego se genera el lex.yy.c de ejemplo3.l , que se ocupara de capturar los tokens
que existen en una operación aritmética.
 Finalmente usamos la aplicación generada, lo aplicamos a prueba.txt que
contiene una operación aritmética: (10+10)*50 = 100.

Potrebbero piacerti anche