LEX Y YACC
Si usted desea utilizar Lex con Yacc, observe que qué Lex escribe es un
programa nombrado yylex(), el nombre requerido por Yacc para su
analizador. Normalmente, el programa principal del defecto sobre la
biblioteca de Lex llama esta rutina, pero si se carga Yacc, y se utiliza
su programa principal, Yacc llamará el yylex(). En este caso cada regla de
Lex debe terminar con
return(token); donde se vuelve el valor simbólico apropiado. Una manera fácil de conseguir el acceso a los nombres de Yacc para el símbolo es compilar el archivo de salida de Lex como parte del archivo de salida de Yacc poniendo la línea # incluye "lex.yy.c" en la sección pasada de la entrada de Yacc. Suponer la gramática para ser nombrado `` buen '' y las reglas léxicas para ser nombradas `` un '' mejor la secuencia del comando de UNIX puede apenas estar: buen lex un cc mejor y.tab.c del yacc - ly - ll La biblioteca de Yacc (- ly) se debe cargar antes de la biblioteca de Lex, para obtener un programa principal que invoque el programa de análisis de Yacc. Las generaciones de los programas de Lex y de Yacc pueden ser hechas en cualquier orden. A continuacion se presenta un ejemplo mas complejo con explicación y algunas corridas del mismo. Ejemplo 2
|
|
Ops |
Descripción |
|
^ , | , & |
XOR , OR y AND bit por bit. (funcionan igual que en C) |
|
+ , - |
Suma y Resta. |
|
* , / , % |
Multiplicacion, Divición y Módulo. |
|
eq , ne , gt , lt , ge , le |
Comparadores entre cadenas, 'igual que', 'diferente de', 'mayor que', 'menor que', 'mayor o igual que' y 'menor o igual que' respectivamente entre cadenas, estos operadores son analogos a las funciones de comparacion entre cadenas de la libreria "string.h" de C. |
|
|| , && , > , < , == , != , >= , <= |
Comparadores y operadores logicos, OR , AND, 'mayor que', 'menor que', 'igual que', 'diferente de', 'mayor o igual que' y 'menor o igual que' respectivamente. |
|
! |
Descripción |
|
- |
Descripción |
|
~ |
Descripción |
Cuando se usan operadores numéricos entre cadenas o mixtos, el valor tomado para las cadenas es la longitud de la misma, si se usan números con operadores de cadenas se genera un error de sintaxis.
A continuación el código de ejemplo :
Lexer :
%{
#define HELLO "Parser booleano/aritmetico\nPor: Oscar Medina Duarte\nBajo licencia BSD"
#include "y.tab.h"
#include <math.h>
#include <string.h>
#include <stdlib.h>
%}
Natural ([0-9]+)
Cadena \"[^"\n]*["]
Return "\n"
%%
%{
int i;
%}
{Return} {return NL;}
"bye"|"quit"|"exit"|"resume" {return BYE;}
{Natural} {
yylval.entero =atoi(yytext);
return ENTERO;
}
{Cadena} {
for(i=1;i<strlen(yytext)-1;i++)
yytext[i-1] = yytext[i];
yytext[i-1] = '\0';
yylval.cadena = malloc(strlen(yytext)+1);
strcpy(yylval.cadena,yytext);
return CADENA;
}
"==" {return EQ;}
"!=" {return NE;}
"||" {return OR;}
"&&" {return AND;}
">=" {return GEQ;}
"=>" {return GEQ;}
"<=" {return LEQ;}
"=<" {return LEQ;}
"eq" {return SEQ;}
"ne" {return SNE;}
"gt" {return SG;}
"lt" {return SL;}
"ge" {return SGE;}
"le" {return SLE;}
[ \t];
. return yytext[0];
%%