Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lex es una de las herramientas que pueden ser utilizadas para generar un
analizador léxico a partir de una descripción basada en expresiones regulares.
lex ejemplo.l
cc –o miejemplo lex.yy.c –ll
/*A veces puede ser necesario también –lm*/
miejemplo < fichero_prueba.txt
flex ejemplo.l
gcc –o miejemplo lex.yy.c –lfl
La secuencia es la siguiente:
Declaraciones
%%
Reglas de traducción
%%
Procedimientos Auxiliares
main() /* Si se desea ejecutar algo más después del analizador*/
{
yylex();
}
Expresiones regulares.
([0-9]*\.)?[0-9]+
[0-9]+
Dígitos de 0 a 9 (los [] indican elección de uno de entre el rango), al añadir el
+ indicamos la repetición 1 o más veces de lo que lo precede.
([0-9]*\.)
El * significa repetición al igual que el +, aunque en este caso es de 0 o más
veces, es decir lo que precede al * puede no aparecer. El “.” simplemente
indicaría cualquier carácter excepto salto de línea, en este caso queremos
identificar al punto decimal, por ello añadimos el carácter de escape “\”.
Symbol | Meaning
-------------+-------------------
x | The "x" character
. | Any character except \n
[xyz] | Either x, either y, either z
[^bz] | Any character, EXCEPT b and z
[a-z] | Any character between a and z
[^a-z] | Any character EXCEPT those between a and z
R* | Zero R or more; R can be any regular expression
R+ | One R or more
R? | One or zero R (that is an optionnal R)
R{2,5} | Two to 5 R
R{2,} | Two R or more
R{2} | Exactly two R
"[xyz\"foo" | The string "[xyz"foo"
{NOTION} | Expansion of NOTION, that as been defined above in the file
\X | If X is a "a", "b", "f", "n", "r", "t", or
| "v", this represent the ANSI-C interpretation of \X
\0 | ASCII 0 character
\123 | ASCII character which ASCII code is 123 IN OCTAL
\x2A | ASCII character which ASCII code is 2A in hexadecimal
RS | R followed by S
R|S | R or S
R/S | R, only if followed by S
^R | R, only at the beginning of a line
R$ | R, only at the end of a line
<<EOF>> | End of file
Ejemplos.
digit [0-9]
letter [A-Za-z]
delim [ \t\n]
ws {delim}+
%%
{ws} { /* ignore white space */ }
{digit}+ { printf("%s", yytext); printf(" = number\n"); }
{letter}+ { printf("%s", yytext); printf(" = word\n";) }
%%
main()
{
yylex();
}
%{
unsigned charCount = 0, wordCount = 0, lineCount = 0;
%}
word [^ \t\n]+
eol \n
%%
{word} {wordCount++; charCount += yyleng;}
{eol} {charCount++; lineCount++; }
. {charCount++;}
%%
main()
{
yylex();
printf("%d %d %d\n", lineCount, wordCount, charCount);
}
%%
(.|\n)? {printf(""); }
"/*""/"*([^*/]|[^*]"/"|"*"[^/])*"*"*"*/" {printf("[comment]%s", yytext);}
%%
Ejemplo 4. Calculadora
%{
/*
** lex program for simple dc
** input of the form: opd opr opd
** output of the form: opd opr opd = ans
*/
#define NUM 1
#define PLUS 2
#define MINUS 3
#define MUL 4
#define DIV 5
#define MOD 6
#define DELIM 7
%}
ws [ \t]+
%%
{ws} ;
-?[0-9]+ {
printf("%s",yytext);
return (NUM);
}
"+" {
ECHO;
return (PLUS);
}
"-" {
ECHO;
return (MINUS);
}
"*" {
ECHO;
return (MUL);
}
"/" {
ECHO;
return (DIV);
}
"%" {
ECHO;
return (MOD);
}
. |
"\ n" {
ECHO;
return (DELIM);
}
%%
/* main.c */
# include <stdio.h>
main()
{
int opd1, opd2, opr;
switch (opr)
{
case PLUS: {
printf(" = %d\n",opd1 + opd2);
break;
}
case MINUS: {
printf(" = %d\n",opd1 - opd2);
break;
}
case MUL: {
printf(" = %d\n",opd1 * opd2);
break;
}
case DIV: {
if (opd2 == 0)
{
printf("\nERROR: attempt to divide by zero!\n");
exit(1);
}
else
{
printf(" = %d\n",opd1 / opd2);
break;
}
}
case MOD: {
if (opd2 == 0)
{
printf("\nERROR: attempt to divide by zero!\n");
exit(1);
}
else
{ printf(" = %d\n",opd1 % opd2);
break;
}
}
}
}
Generador de analizadores sintácticos YACC.
yacc ejemplo.y
cc –o miejemplo y.tab.c –ly
/*A veces puede ser necesario también –lm*/
miejemplo < fichero_prueba.txt
La secuencia es la siguiente:
Declaraciones
%%
Reglas de traducción
%%
Rutinas de apoyo en C
...
| <alt n> { acción semántica n
;
EE+T|T
TT*F|F
R (E) | dígito
%{
#include <ctype.h>
%}
%token CIFRA
%%
yylex() {
int c;
c = getchar();
if (isdigit(c)) {
yylval = c-´0´;
return CIFRA;
}
return c;
}
PARSING
ascendente descendente
Herramienta
YACC
simple operador