Generador en código lex

Páginas: 28 (6799 palabras) Publicado: 23 de mayo de 2011
Reconocimiento de números binarios, hexadecimales, octales y notación científica. Y expresiones aritméticas
-------------------------------------------------
Código en Lex binarios.l
%{
/* Se incluyen las funciones de conversion de numeros */
#include "funciones.h"
Declaraciones de Reglas
%}

NUMBINARIO [01]+[bB]
NUMHEXA [0][Xx][0123456789ABCDEFabcdef]+
NUMOCTAL [0-7]+[Oo]
NUMNOT[+-]?[0-9]+["."]*[0-9]*[Ee]?[+-]?[0-9]+
expr1 {NUMBINARIO}|{NUMHEXA}|{NUMOCTAL}|{NUMNOT}
expr2 {NUMBINARIO}|{NUMHEXA}|{NUMOCTAL}|{NUMNOT}
SUMA {expr1}[+]{expr2}
RESTA {expr1}[-]{expr2}
MULTI {expr1}[*]{expr2}
DIVI {expr1}[/]{expr2}
%%
"bye" {return 0;}
"BYE" {return 0;}
{NUMBINARIO} { printf("Numero binario encontrado: %s, valor decimal: %u\n", yytext,bin2dec(yytext)); }
Llamando las funciones en C++
{NUMHEXA} { printf("Numero hexadecimal encontrado: %s, valor decimal: %u\n", yytext, hex2dec(yytext)); }
{NUMOCTAL} { printf("Numero octal encontrado: %s, valor decimal: %u\n", yytext, oct2dec(yytext)); }
{NUMNOT} { printf("Notacion cientifica encontrado: %s", yytext); printf(" valor decimal: %f\n", Conver2dec(yytext));}
{SUMA}{ printf("total suma: %f\n", suma(yytext));}
{RESTA} { printf("total resta: %f\n", resta(yytext));}
{MULTI} { printf("total multiplicacion: %f\n", multi(yytext));}
{DIVI} { printf("total division: %f\n", divi(yytext));}
%%
void main( void ) {

Encabezado de ejecución

{printf("INGRESE UNA CANTIDAD LUEGO ELIJA LA OPCCION QUE DESEE\ninserte al final(binario)b \ninserte al inico 0x(Hexadecimal)\ninserte al final(Octal)o\nIngreso de Notacion Cientifica(cantidad)E(exponente)\nIntroduzca bye para salir\ntambien puede realizar operaciones (+-*/)\n ");

}
yylex();
-------------------------------------------------
}

-------------------------------------------------
Código de funciones en C++
Librerías que son llamadas al ingreso de lostokens que van concatenadas desde lex a C++
#ifndef FUNCIONES_H_INCLUDED
#define FUNCIONES_H_INCLUDED

#include <stdio.h>
Librerías que se utilizan para la ejecución del programa
#include <math.h>
#include <string.h>
#include <stdlib.h>

Función llamada desde código lex al ingreso de los tokens cuando son binarios. Ejemplo 11b le muestra decimal 3

/* Se definela funcion para convertir de binario a decimal */
unsigned int bin2dec( char *cadena ) {
unsigned int resultado = 0;
int ciclo;

for( ciclo = strlen(cadena)-2; ciclo >= 0; ciclo-- ) {
resultado += (cadena[ciclo]=='0'?0:1)* (unsigned int)pow(2,strlen(cadena)-2-ciclo);
}

return resultado;
}

/* Se define la funcion para convertir de hex a decimal */unsigned int hex2dec( char *cadena ) {
unsigned int resultado = 0;
int ciclo, valor;

for( ciclo = strlen(cadena)-1; ciclo > 1; ciclo-- ) {
if( cadena[ciclo] >= '0' && cadena[ciclo]<= '9') {
valor = cadena[ciclo]-48;
} else {
Función llamada desde código lex al ingreso de los tokens cuando son hexadecimales. Ejemplo 0xF le muestrael decimal 15
switch (cadena[ciclo]){
case 'A':
case 'a':
valor = 10;
break;
case 'B':
case 'b':
valor = 11;
break;
case 'C':
case 'c':
valor = 12;
break;case 'D':
case 'd':
valor = 13;
break;
case 'E':
case 'e':
valor = 14;
break;
case 'F':
case 'f':
valor = 15;
break;
}
}
resultado +=...
Leer documento completo

Regístrate para leer el documento completo.

Estos documentos también te pueden resultar útiles

  • Generadores de codigo lex y flex
  • Generador de Analizador Léxico LEX
  • Codigo generico
  • Técnicas de un generador de código intermedio
  • Forma De Generar Codigo Mp2
  • Codigos Para Generar Caracteres
  • Herramienta que permite generar código en c#
  • Compilador para generar código intermedio

Conviértase en miembro formal de Buenas Tareas

INSCRÍBETE - ES GRATIS