%option noyywrap %{ /* Definicion de Constantes */ #define OP_SUM 321 #define OP_RES 322 #define OP_MUL 323 #define OP_DIV 324 #define OP_MOD 325 #define NUM 326 #define P_ABRE 327 #define P_CIERRA 328 #define ERROR 666 #define FIN 999 %} /* Definiciones Regulares */ delimitador [ \t\n] espacio {delimitador}+ digito [0-9] numero {digito}+(\,{digito}+)*(\.{digito}+)? %% "+" {return (OP_SUM);} "-" {return (OP_RES);} "*" {return (OP_MUL);} "/" {return (OP_DIV);} "(" {return (P_ABRE);} ")" {return (P_CIERRA);} {numero} {return(NUM);} "\n" {return(FIN);} %% ================================================================= Uno de ustedes escribió éste código Lex, en su solución a la tarea #6: http://www.di-mare.com/adolfo/cursos/2004-1/ac-ta-6.htm Sin embargo, en éste código es necesario destacar un error de concepto importante, pues para identificar a cada operador se usan nombres "raros", como "OP_SUM" y "OP_DIV". Lo natural es usar las letras, cuyos códigos ASCII son números menores a 256: // #define OP_SUM 321 // ==> ELIMINADO //.... "+" {return ('+');} //... "/" {return ('/');} //... También pueden ustedes argumentar que es más simple usar una gramática con producciones como la que sigue: Expr : Expr OP_SUM Expr | Expr OP_MUL Expr con lo que se evita usar 2 producciones para los operadores artiméticos, que son '+' y '-', y 3 para los multiplicativos, que son '*', '/' y '%' (el último es el del módulo). Eso es un buen argumento, aunque fuerza a examinar el lexema para determinar si lo que hay que hacer es una suma o una resta, y en el segundo caso una multiplicación, división o operación módulo (este estilo de codificar la gramática es el que se usa en el libro de texto para la gramática de Pascal). Sin embargo, si para cada operaddor se usa un nombre de token diferente, en realidad la gramática queda igual de larga pero es más confusa: Expr : Expr OP_SUM Expr | Expr OP_RES Expr | Expr OP_MUL Expr | Expr OP_DIV Expr | Expr OP_MOD Expr Eso se ve horrible. Es más bonito escribir la misma gramática de esta forma: Expr : Expr '+' Expr | Expr '-' Expr | Expr '*' Expr | Expr '/' Expr | Expr '%' Expr Esta otra forma es más clara, y requiere que en el programa Lex el reconicimiento de cada uno de los tokens resulte en el retorno del código ASCII correspondiente, como en: "+" {return ('+');} http://www.cs.wisc.edu/condor/classad/refman/node7.html http://www.google.com/search?hl=en&ie=UTF-8&oe=UTF-8&q=yacc+grammar