Beruflich Dokumente
Kultur Dokumente
or
FACULTAD
DE I NGENIERA
S ISTEMAS
MANUAL UNIVERSITARIO
Bor
Puno - Per
Octubre - 2015
rad
or
ndice
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5
6
6
6
6
7
9
10
11
11
12
14
15
16
2. El generador YACC
2.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . .
2.2. Instalacin . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1. Acciones Semnticas . . . . . . . . . . . . . . .
2.2.2. El Archivo de Entrada . . . . . . . . . . . . . .
2.3. Compilar el Cdigo de Entrada para el YACC Bison
2.4. Una calculadora . . . . . . . . . . . . . . . . . . . . . .
2.5. Con gramtica ambigua . . . . . . . . . . . . . . . . .
2.6. Bison genera cdigo ANSI . . . . . . . . . . . . . . . .
2.7. Calculadora con funciones . . . . . . . . . . . . . . . .
2.8. Ejercicios propuestos . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
18
19
19
19
20
21
21
23
25
27
31
Bor
Bibliografa
33
rad
or
Cdigo Fuente
Bor
1.1.
1.2.
1.3.
1.4.
1.5.
1.6.
2.1.
2.2.
2.3.
2.4.
2.5.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
11
12
13
14
15
16
22
23
25
27
30
Pg. 3
rad
or
Oliver A. Vilca H.
PRLOGO
En el mercado existe varios textos de compiladores, gran parte de ellos se limitan a las
teoras y principios de diseo compiladores con algunos ejemplos prcticos. Otros se orientan
en organizar cdigo fuente de un compilador para un lenguaje de programacin real un sublenguaje reducido. Un compilador escrito a mano (sin utilizar generadores) involucra muchas
lneas de cdigo y conocimiento terico para ser comprendido.
Bor
Acepta ms tipos de gramticas libres del contexto que los mtodos ms sencillos de construccin de compiladores.
Por otro lado la gran mayoria de manuales de LEX y YACC estn escritas en ingles y no
existen, o al menos no hay versiones mnimas en espaol. Se recomienda al lector los manuales
que vienen con los instaladores del F lex y el Bison, que estn disponibles slo en ingles por lo
rramientas el Lex para el anlisis lxico y Y acc para el anlisis sintactico y semntico. Las
versiones que se pueden utilizar para Windows son el F lex y el Bison respectivamente, que
estn disponibles en internet.
puede ser el Dev-C++ (ltima versin disponible en Internet) u otro que se disponga para el
Pg. 4
rad
or
Oliver A. Vilca H.
Mayor informacin se pude encontrar en los libros citados en bibliografa: [Aho et al., 2006],
[Gries, 1971], [Wilhelm and Maurer, 1995],
Bor
compiladores.
DevC++ viene con todo lo que se necesita para compilar y enlazar en modo consola y programas GUI que se
ejecutan en Windows. Dev-C++ es Software de distribucin libre bajo la licencia GNU (General Public License).
2
Un IDE es un programa que le permite editar, compilar, y depurar programas en C++ sin usar el comando de
lnea.
rad
or
Captulo 1
Bor
LEX
1.1. El LEX
Pg. 6
rad
or
Oliver A. Vilca H.
En esta seccin se explicar la implementacin de un analizador lxico utilizando un generador de cdigo, especficamente un generador de analizadores lxicos conocido como LEX.
Esto a partir de la descripcin de tokens de un lenguaje de programacin, por lo general expresiones regulares.
Las versiones ms populares de LEX se conoce como FLEX (Fast Lex en ingles), es una
herramienta para generar programas que efecta reconocimiento de patrones en texto. Hay
muchas aplicaciones para el Flex, incluido la escritura de compiladores en conjunto con el GNU
Bison. Se distribuye como parte del paquete compilador GNU que produce la Free Software
Foundation, y tambin se puede obtener gratuitamente en diferentes sitios de Internet. En los
lugares de descarga de los instaladores por lo general tambin se encuentran sus manuales en
ingles.
El Flex o Lex toma como entrada un archivo de texto (por lo general con extensin y) que
contiene expresiones regulares acompaado de acciones que se ejecutan cuando se iguale cada
expresin. Como salida crea un archivo con cdigo fuente generado en lenguaje C (tambin
hay generadores para otros lenguajes de programacin). En el cdigo fuente generado se crea
una funcin denominado yylex, que es la implementacin de la tabla de un autmata finito
determinista correspondiente a las expresiones regulares del archivo de entrada. El nombre
del archivo de salida del Lex es por lo general lex.yy.c lexyy.c, este se compila junto con un
Bor
1.2. Uso
1.3. Instalacin
Pg. 7
rad
or
Oliver A. Vilca H.
lxico como se muestra en la figura 1.1, finalmente se procede a instalar (debe tener conexin
a Internet). En otras versiones de Linux la instalacin debe ser similar, en caso contrario se
puede consultar su instalacin en Internet.
http://gnuwin32.sourceforge.net/packages/flex.htm, descargue el paquete completo (Complete package, except sources), luego siga las instrucciones. Tambin estan disponibles los c-
Bor
digos fuente .
1.3.2.1.
Pg. 8
rad
or
Oliver A. Vilca H.
Agregar al path del sistema
Si se desea que Flex ( Bison) se integre al conjunto de variables del entorno (esto permite
llamar a Flex desde cualquier ubicacin en la lnea de comandos), debe configuar lo siguiente:
Ingresar a Propiedades del sistema. Seleccionar la pestaa Opciones avanzadas, la
Bor
ventana debera ser similar a la figura 1.3 (las figuras han sido capturadas desde Windows 8).
Luego ingrese a la opcin (botn) Variables de entorno y aparece una ventana como
Pg. 9
rad
or
Oliver A. Vilca H.
Luego, en la ventana Variables del sistema seleccione la variable path y edtelo seleccionando la opcin Editar como se observa la figura 1.4, En seguida aparece una ventana (ver
figura 1.5) donde sin borrar las direcciones desplazar el cursor al final y agregar un punto y
coma ; y finalmente pegar (o escribir) la direccin de los ejecutables (binarios) del Flex por
Bor
Pg. 10
rad
or
Oliver A. Vilca H.
DEFINICIONES.
%%
REGLAS.
Definicin de la regla 1
Definicin de la regla 2
...
Definicin de la regla n
%%
Bor
Oliver A. Vilca H.
Pg. 11
rad
or
1
2
3
4
%{
// y numero de caracteres
%}
9
10
%%
11
12
\n
13
{ ++num_l; ++num_c; }
14
15
%%
16
17
main()
18
19
Bor
yylex();
20
21
Luego de haber generado el archivo de salida (codigo en C por ejemplo archivo lex.yy.c),
se prosigue con la compilacin y ejecucin, en ese momento escribir caracteres y tambin puede
presionar la tecla enter para obtener nuevas lneas, cuando se termina y desea obtener el conteo
de lneas y caracteres se debe presiona Control+D.
que utilizan los siguientes operadores entre los ms utilizados. Sean r y s expresiones regulares.
Pg. 12
rad
or
Oliver A. Vilca H.
x
.
[xy]
[xyz]
[w-z]
[x]
[A-Z]
r*
r+
r?
r{4}
r{2,5}
r{3,}
{XX}
rs
r|s
Representa el caracter x.
Cualquier caracter (byte) excepto nueva lnea.
Clase de caracteres, en este caso, el caracter x
y (pero no ambas).
Clase de caracteres, en este caso, el caracter
x, y z (uno slo).
Clase de caracteres con rango, en este caso,
cualquier letra desde la w hasta la z (estos
son: w,x,y, y z).
Cualquier caracter excepto x.
Complemento de una clase de caracteres, es
decir, cualquier caracter excepto los de la clase. En este caso, cualquier caracter excepto
una letra en maysculas.
Cero o ms repeticiones de r, donde r es una
expresin regular.
Una o ms repeticiones de r.
Cero o una repeticin de r, es decir, una r opcional.
Exctamente cuatro repeticiones de r.
De dos hasta cinco repeticiones r.
De tres a ms repeticiones de r.
La traduccin de XX de la seccin de deficiones.
La expresin regular r seguida de la expresin
regular s, denominado concatenacin.
Una r una s, unin.
Bor
lxico simple para un lenguaje reducido de Pascal (sublenguaje). Identifica diferentes tipos de
T okens.
2
3
4
5
6
%{
#include <math.h>
%}
9
10
DIGIT [0-9]
11
ID [a-z][a-z0-9]*
12
13
%%
14
15
{DIGIT}+
Pg. 13
rad
or
Oliver A. Vilca H.
16
17
18
19
{DIGIT}+"."{DIGIT}* {
20
21
22
23
if|then|begin|end|procedure|function {
24
25
26
27
28
29
30
31
"{"[^}\n]*"}"
/* Elimina comentarios */
32
33
[ \t\n]+
34
35
36
37
%%
38
39
40
41
42
yyin = stdin;
43
yylex();
Bor
44
Si se requiere que analizador lxico cargue la entrada desde un archivo (dado como par-
1
2
4
5
else
yyin = stdin;
8
9
yylex();
macin.
Oliver A. Vilca H.
Pg. 14
rad
or
/*************************************************/
/*
/*
/*
*/
*/
%option noyywrap
%{
#include<iostream>
10
11
int num_lineas = 0;
%}
12
13
cadena \"[^\n"]+\"
14
esptab [ \t]+
15
letra
16
digito [0-9]
17
id
18
num1
[-+]?{digito}+\.?([eE][-+]?{digito}+)?
19
num2
[-+]?{digito}*\.{digito}+([eE][-+]?{digito}+)?
20
numero {num1}|{num2}
[A-Za-z]
{letra}({letra}|{digito}|[_.\-])*
21
22
%%
23
Bor
24
25
26
"/*" {
27
int c;
28
while((c = yyinput()) != 0)
29
30
if(c == \n)
31
++num_lineas;
32
else if(c == *)
33
34
if((c = yyinput()) == /)
35
break;
36
else
37
unput(c);
38
39
40
41
42
{numero}
cout<<"Numero "<<YYText()<<endl;
43
44
\n
num_lineas++;
45
46
47
if|while|for|int|float|char|main|printf|"{"|"}"|"("|")"|";" {
cout<<"Palabra reservada "<<YYText()<<endl; }
48
49
Pg. 15
50
51
52
53
"+"|"-"|"*"|"/"|" %"|"="
54
55
%%
58
59
60
61
62
63
64
65
cout<<"Operador "<<YYText()<<endl;
56
57
rad
or
Oliver A. Vilca H.
return 0;
}
Este archivo de entrada para el Flex++ se puede ejecutar de la siguiente manera: Flex++
e4.y. Esto generar el archivo lex.yy.cc, por lo tanto se puede generar el archivo ejecutable con:
g++ lex.yy.cc. Obtenindose finalmente el archivo requerido.
1. Implemente una entrada para el Lex que copie archivos, sustituyendo cada secuencia no
Bor
2
3
4
5
6
%%
7
8
[ ]+
/* Espacios en blanco */
10
11
12
13
%%
14
15
16
17
yyin = stdin;
18
19
yylex();
Pg. 16
rad
or
Oliver A. Vilca H.
2. Los sistemas Unix (tambin los sistemas Unix-ish incluyendo Linux y los BSD) vienen
con un programa de conteo de palabras, el cual lee desde un archivo e informa del nmero
de lneas, palabras y caracteres que contiene dicho archivo. Flex nos permite escribir el
wc (word counter) en poco mas de una docena de lneas, que se muestra en la siguiente
entrada para el Lex/Flex:
1
2
%{
int caracteres = 0;
int palabras
int lineas = 0;
%}
8
9
%%
10
= 0;
11
[a-zA-Z]+
12
\n
{ caracteres++; lineas++; }
13
{ caracteres++; }
14
15
%%
16
17
18
19
yylex();
20
Bor
21
1. Implemente una entrada para el Lex (o Flex) que reconozca los Tokens para un sublenguaje del lenguaje Java.
2. Implemente una entrada para el Lex/Flex que reconozca los Tokens para un sublenguaje
del siguiente conjunto de lenguajes de propsito general:
(a) C
(b) C++
(c) C#
(d) Php
(e) Python
(f) Basic
(g) ML
(h) Scheme
(i) SQL
Pg. 17
rad
or
Oliver A. Vilca H.
(j) R (estadstico)
3. Implemente una entrada para el Lex (o Flex) que reconozca Tokens para un sublenguaje
del siguiente conjunto de lenguajes orientados a la matemtica:
(a) Mxima
(b) Octave
(c) Maple
(d) Matemtica
(e) MathLab
Bor
rad
or
Captulo 2
Bor
El generador YACC
Oliver A. Vilca H.
Pg. 19
rad
or
2.1. Introduccin
Bison es un generador de propsito general que convierte una descripcin de una gramtica (gramtica libre del contexto LALR(1)) en un programa en C, para analizar la gramtica.
Con esta herramienta es posible desarrollar una amplia gama de analizadores de lenguajes,
desde una calculadora simple de escritorio hasta un complejo lenguaje de programacin. Se
requiere que el usuario domine el lenguaje C.
2.2. Instalacin
Bor
sitio de decarga basta con consultar al amigo Google con la palabra Bison for Windows.
Con la finalidad de que las aplicaciones sean ms tiles, se debe hacer ms que nicamen-
te analizar la entrada. Se puede producir una salida basada en la entrada. De este modo las
gramticas pueden ir acompaadas de acciones (semnticas). Por ejemplo la siguiente gramtica libre del contexto puede implicar acciones semnticas.
exp exp + exp
ejemplo, si se tiene una regla que indica que una expresin es la suma de dos subexpresiones,
cada una de estas expresiones tienen un valor semntico. El valor del no terminal del lado
Pg. 20
rad
or
Oliver A. Vilca H.
izquierdo de la regla se representa por $$, y el lado derecho de la regla se representa considerando el orden de izquierda a derecha por $1, $2, ..., $n, donde n es el nmero de terminales y no
terminales del lado derecho de la regla. Por ejemplo para gramtica en cuestin:
exp : exp + exp { $$ = $1 + $3; }
|{z}
|{z}
|{z}
$$
$1
$3
En este caso $2 representara el segundo terminal + del lado derecho de la regla, el cual no
es necesario y no tendra sentido que tenga valor (porque no le corresponde un valor semntico).
La entrada principal con la cual trabaja son las gramticas libres del contexto (reglas).
Los archivos de entrada comunmente tienen la extensin .y. El formato general del archivo de
entrada para un analizador es como sigue:
%{
CDIGO INICIAL.
%}
DECLARACIONES.
Definicin de Tokens y tipos
Bor
%%
GRAMTICAS.
Definicin de la regla 1
Definicin de la regla 2
...
Definicin de la regla n
%%
definir macros, declarar funciones y variables del analizador. Esta seccin inicia y termina con
los delimitadores %{ y %}. Se puede tener ms que una de estas secciones, intercaladas con la
seccin de DECLARACIONES
Pg. 21
rad
or
Oliver A. Vilca H.
La ltima seccin de RUTINAS DEL USUARIO, el cdigo fuente de esta parte se copia
sin cambio al final del cdigo generado del YACC. Por ejemplo las definiciones de las funciones
yylex y yyerror. Debido a que las funciones del C requieren ser declaradas antes de ser
utilizadas, puede ser necesario que las declare en la seccin de CDIGO INICIAL.
Debido a que el YACC contiene varios macros e identificadores que inician con yy e YY,
no es buena idea utilizar estos prefijos. El archivo fuente puede contener comentarios que se
utilizan en C.
Bor
Se construir un acalculadora que lee expresiones aritmticas, las evalua e imprime su va-
lor numrico. Se inicia con la siguiente GLC para expresiones aritmticas, la gramtica puede
ser recursiva por la izquierda:
Pg. 22
rad
or
Oliver A. Vilca H.
E E + T | E T | T
(2.1)
T F | T /F | F
(2.2)
numero | (E)
(2.3)
/* COMPILADORES : Laboratorio N 1
/* GENERADORES DE ANALIZADORES
*/
*/
*/
%{
*/
*/
#include <math.h>
10
#include <stdio.h>
11
12
13
14
15
16
/* Declaraciones */
%token NUMERO
17
18
20
% % /* Gramtica */
Entrada: /* epsilon */ | Entrada Linea
;
21
Linea: \n
19
/* Muestra el resultado */
| Exp \n { printf ("
Resultado: %g \n", $1); }
Bor
22
23
24
Exp:
25
26
| Term { $$ = $1; }
27
28
29
30
| Fact { $$ = $1; }
31
32
33
| ( Exp ) { $$ = $2; }
34
35
36
37
38
39
int c;
40
41
42
43
44
/* Procesa nmeros */
if (c == . || isdigit (c))
45
46
47
48
return NUMERO;
49
50
51
52
53
54
55
56
57
58
Pg. 23
rad
or
Oliver A. Vilca H.
59
60
61
62
63
64
65
66
67
El archivo de salida se compila (por ejemplo con el gcc u otro) y se obtiene un ejecutable el
cual es la calculadora requerida:
1+2+3+8/2
Resultado: 10
Bor
1+2*3
Resultado: 7
(1+2)*3
Resultado: 9
10/3
Resultado: 3.33333
5.5+3.5*2-5/2
Resultado: 10
^D
/* COMPILADORES : Laboratorio N 2
/* GENERADORES DE ANALIZADORES
3
4
5
*/
*/
/* Calculadora - Notacin Infija. */
/* Gramtica Ambigua => precedencia de operadores */
%{
Pg. 24
rad
or
Oliver A. Vilca H.
#include <math.h>
#include <stdio.h>
10
11
12
13
14
15
/* Declaraciones */
%token NUM
16
%left - +
17
%left * /
%left NEG /* negacin -- menos unario */
%right ^ /* exponenciacin */
18
19
20
21
22
% % /* Gramtica */
input: /* epsilon */
23
| input line
24
25
;
line: \n
26
27
28
;
exp: NUM { $$ = $1; }
29
30
31
32
33
34
35
| ( exp ) { $$ = $2; }
36
37
38
40
Bor
39
41
int c;
42
43
44
45
46
47
/* Procesa nmeros */
if (c == . || isdigit (c))
48
49
50
51
return NUM;
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Pg. 25
rad
or
Oliver A. Vilca H.
Nota: La instruccin: gcc ejm2.c -o ejm2. Puede generar el siguiente mensaje de error:
referencia a pow sin definir. Esto es debido a que la funcin pow es parte de la librera math.h.
Por lo tanto, La invocacin del compilador debe ser como sigue:
Utilizando el Turbo C++ versin 3.0 para Windows (o el Borland C++ versin 3.1) se debe considerar que el cdigo generado respeta las normas ANSI, por lo que se debe indicar al
Bor
compilador del C/C++ que debe compilar cdigo ANSI, esto se puede indicar de la siguiente
manera:
/* COMPILADORES : Laboratorio N 3
/* GENERADORES DE ANALIZADORES
*/
*/
*/
*/
5
6
%{
7
8
#include <math.h>
10
#include <stdio.h>
11
12
13
14
15
16
/* Declaraciones */
%token NUM
17
%left - +
18
%left * /
19
%left NEG
20
21
22
23
% % /* Gramtica */
input: /* epsilon */
24
| input line
25
26
Pg. 26
rad
or
Oliver A. Vilca H.
;
line: \n
27
28
| error \n { yyerrok; }
29
30
;
exp: NUM { $$ = $1; }
31
32
33
34
35
36
if ($3)
37
$$ = $1 / $3;
38
else {
39
$$ = 1;
40
fprintf (stderr, " %d. %d- %d. %d: division por cero",
41
@3.first_line, @3.first_column,
42
@3.last_line, @3.last_column);
43
}
}
45
46
47
| ( exp ) { $$ = $2; }
48
Bor
44
49
50
51
52
53
int c;
54
55
56
++yylloc.last_column;
57
58
60
61
yylloc.first_line = yylloc.last_line;
62
yylloc.first_column = yylloc.last_column;
59
63
64
65
/* Procesar nmeros. */
if (isdigit (c))
66
67
yylval = c - 0;
68
++yylloc.last_column;
69
70
71
++yylloc.last_column;
72
Pg. 27
rad
or
Oliver A. Vilca H.
yylval = yylval * 10 + c - 0;
73
74
75
return NUM;
76
77
78
79
80
return 0;
81
82
83
84
85
++yylloc.last_line;
86
yylloc.last_column = 0;
87
88
else
89
++yylloc.last_column;
90
91
return c;
}
92
93
94
95
96
97
98
99
100
101
yylloc.first_line = yylloc.last_line = 1;
102
yylloc.first_column = yylloc.last_column = 0;
103
Bor
104
/* COMPILADORES : Laboratorio N 4
/* GENERADORES DE ANALIZADORES
3
4
%{
*/
*/
7
8
10
11
%}
12
%union {
13
14
15
16
Pg. 28
rad
or
Oliver A. Vilca H.
17
18
19
%right =
20
%left - +
21
%left * /
%left NEG /* negacin -- menos unario */
%right ^ /* exponenciacin */
22
23
24
25
26
% % /* Gramtica */
27
28
29
input: /* empty */
| input line
30
31
;
line: \n
32
33
| error \n { yyerrok; }
34
35
36
37
| VAR { $$ = $1->value.var; }
38
39
40
41
42
43
44
45
Bor
if ($3)
46
$$ = $1 / $3;
47
else {
48
$$ = 1;
49
fprintf (stderr, " %d. %d- %d. %d: division por cero",
50
@3.first_line, @3.first_column,
51
@3.last_line, @3.last_column);
52
53
54
55
56
| ( exp ) { $$ = $2; }
57
58
/* Fin de la Gramtica. */
59
60
61
62
63
int c;
64
65
66
++yylloc.last_column;
67
68
69
70
return 0;
71
Pg. 29
rad
or
Oliver A. Vilca H.
72
yylloc.first_line = yylloc.last_line;
73
yylloc.first_column = yylloc.last_column;
74
75
77
/* Procesar nmeros. */
/* Si inicia con un dgito => NUM */
if (c == . || isdigit (c))
78
76
79
yylval.val = c - 0;
80
++yylloc.last_column;
81
82
83
++yylloc.last_column;
84
yylval.val = yylval.val * 10 + c - 0;
85
86
87
88
return NUM;
}
89
90
91
92
93
95
symrec *s;
static char *symbuf = 0;
static int length = 0;
96
int i;
97
94
98
99
100
i = 0;
102
do
103
Bor
101
104
105
106
107
length *= 2;
symbuf = (char *) realloc(symbuf,length+1);
108
109
110
111
112
113
114
115
116
117
symbuf[i] = \0;
118
119
s = getsym (symbuf);
120
if (s == 0)
121
122
yylval.tptr = s;
123
124
return s->type;
125
126
127
128
129
++yylloc.last_line;
130
yylloc.last_column = 0;
131
132
else
133
++yylloc.last_column;
134
135
136
137
138
139
Pg. 30
rad
or
Oliver A. Vilca H.
140
141
142
143
144
145
struct init
146
147
148
149
};
150
151
152
153
"FXY", sin,
154
"cos", cos,
155
"atan", atan,
156
"ln", log,
157
"exp", exp,
158
"sqrt", sqrt,
159
0, 0
160
};
Bor
161
162
163
164
165
166
167
168
int i;
169
170
symrec *ptr;
for (i = 0; arith_fncts[i].fname != 0; i++)
171
172
173
ptr->value.fnctptr = arith_fncts[i].fnct;
174
175
176
177
178
179
yylloc.first_line = yylloc.last_line = 1;
180
yylloc.first_column = yylloc.last_column = 0;
181
init_table ();
182
183
Pg. 31
rad
or
Oliver A. Vilca H.
2
3
4
10
11
12
} value;
13
14
15
16
17
18
19
20
21
22
23
24
25
27
symrec *ptr;
ptr = (symrec *) malloc (sizeof (symrec));
ptr->name = (char *) malloc (strlen (sym_name) + 1);
28
strcpy (ptr->name,sym_name);
29
ptr->type = sym_type;
30
31
ptr->value.var = 0; /* Asignar 0. */
ptr->next = (struct symrec *)sym_table;
32
sym_table = ptr;
Bor
26
33
34
return ptr;
35
36
37
38
symrec *ptr;
for (ptr = sym_table; ptr != (symrec *) 0;
ptr = (symrec *)ptr->next)
39
40
41
if (strcmp (ptr->name,sym_name) == 0)
42
return ptr;
43
44
return 0;
1. Implemente un programa en YACC que indique si una cadena de ingresada es palndrome o no. Palndrome es una palabra sentencia que es igual a su inverso. Ejemplo:
sagas, alla, radar, madamimadam (Madam Im Adam, posiblemente lo primero
Pg. 32
rad
or
Oliver A. Vilca H.
(b) La sentencia Print, para imprimir, por ejemplo Print(2+3) que debe imprimir 5 y
Bor
rad
or
Bibliografa
[Aho et al., 2006] Aho, A. V., Lam, M. S., Sethi, R., and Ullman, J. D. (2006). Compilers: Principles, Techniques, and Tools (2nd Edition). Addison Wesley.
[Gries, 1971] Gries, D. (1971). Compiler Construction for Digital Computers. Wiley, New York.
[Lewis and Papadimitriou, 1981] Lewis, H. R. and Papadimitriou, C. H. (1981). Elements of the
Theory of Computation. Prentice-Hall, New York.
[Lewis et al., 1976] Lewis, P. M., Rosenkrantz, D. J., and Stearns, R. E. (1976). Compiler Design
Theory. Addison-Wesley, Reading, MA.
[Louden, 1997] Louden, K. C. (1997). Compiler Construction: Principles and Practice. PWS
Publishing Co., Boston, MA, USA.
Bor
[Wilhelm and Maurer, 1995] Wilhelm, R. and Maurer, D. (1995). Compiler Design. AddisonWesley, Wokingham, England, Reading, MA.