Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
FACULTAD DE INGENIERÍA
%{
#include <string.h>
#include "frase.tab.h"
%}
%%
\n { return ('\n');}
. ;
%%
%{
#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();
}
int yywrap(){
return 1;
}
Ejecutamos en la terminal:
$ bison –d frase.y
$ flex frase.l
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
%%
{NUM} { yylval = atoi(yytext);
return (ENTERO);}
"+"|"-" { return (yytext[0]);}
"\n" { return (yytext[0]);}
. ;
%%
%{
#define YYSTYPE int
#include <math.h>
#include <stdio.h>
%}
/* Declaraciones de BISON */
%token ENTERO
%left '-' '+'
/* Gramatica */
%%
%%
int main(){
yyparse();
}
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.
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.