Curso de Compiladores - Universidad Tecnológica de la Mixteca

COMPILADORES
Universidad
Tecnológica de la
Mixteca
__________________________
__________________________
Compiladores
M.C. Gabriel Gerónimo Castillo
Laboratorio Edumóvil
Universidad Tecnológica de la Mixteca
[email protected]
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
Temario
1. Introducción al proceso de compilación
__________________________
__________________________
__________________________
2. Análisis Léxico
_________________________
3. Análisis Sintáctico
__________________________
4. Análisis Semántico
5. Generadores de Código
6. Optimización de Código
__________________________
__________________________
__________________________
__________________________
__________________________
NOTAS DEL CURSO
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
Referencias
__________________________
•! Compiladores Principios, técnicas y herramientas. Alfred V. Aho, Ravi Sethi,
Jeffrey D. Ullman.!Adisson Wesley.
•! Compiladores Conceptos fundamentales. Teufel, Schmidt, Teufel. Adisson
Wesley Iberoamericana.
__________________________
__________________________
_________________________
__________________________
•! Modern compiler implementation in C. Appel. Cambridge
•! Teoría de Autómatas y Lenguajes Formales. Dean Kelley. PrenticeHall
Cambridge
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
Introducción al proceso
de compilación
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
Tipos de sistemas de compilación
dependiendo del tipo de código y funcionamiento
__________________________
__________________________
Fuente
Compiladores
Objeto
__________________________
_________________________
Ensamblador: Traducen programas escritos en lenguaje ensamblador a
código de máquina.
Compilador: Traducen programas escritos en lenguaje de alto nivel a código
intermedio o a código de máquina.
Intérprete: Un intérprete no genera código objeto sino que analiza y ejecuta
directamente cada proposición del código fuente.
Preprocesador: Sustituye los macros, incluye archivos o la extensión del
lenguaje.
NOTAS DEL CURSO
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
Análisis Léxico
__________________________
__________________________
Consiste en reconocer los componentes léxicos dentro del flujo, es decir,
transformar un flujo de caracteres en un flujo de componentes léxicos.
Por ejemplo la proposición
produciendo lo siguiente:
__________________________
i = 10 ;
i
=
10
;
_________________________
Identificador
Asignación
Número
Delimitador
__________________________
Los identificadores reconocidos se organizan en una tabla de símbolos, que
contiene un registro de campos de atributos asociado a dicho identificador.
__________________________
!
!
!
!
__________________________
__________________________
La tabla de símbolos se construye con el análisis léxico y sintáctico, para ser
usada en el análisis semántico y la generación de código.
__________________________
Los espacios en blanco que separan los componentes léxicos normalmente se
eliminan.
__________________________
Análisis Léxico
__________________________
__________________________
__________________________
La primer tarea de un compilador es agrupar una secuencia de caracteres
de entrada en tokens.
_________________________
__________________________
El analizador léxico o escaner típicamente accesa a la tabla de símbolos
para almacenar y/o retirar información de ciertos conceptos del lenguaje
como son variables, tipos, funciones.
VUB-DINF/2009/2
__________________________
__________________________
13
�LBRACE�
�DECLARE symbol table ref=0�
10
�NAME symbol table ref=3�
�SEMICOLON�
e syntax of Micro is described by the �NAME
rules insymbol
Figuretable
1.2.ref=3�
We will see in Chap�ASSIGN�
3 that such rules can be formalized into
what is called a grammar.
�LPAREN�
VUB-DINF/2009/2
�NUMBER
value=33�
ote that NUMBER and NAME have not
been further
defined. The idea is, of
�PLUS�
�LBRACE�represents
urse, that NUMBER represents a sequence
of digits and that NAME
�DECLARE symbol table ref=0�
�NUMBER value=3�
tring of letters and digits,
starting
with
a
letter.
�NAME symbol table ref=3�
Código fuente: �RPAREN�
�SEMICOLON�
�MINUS�
simple Micro program is shown in Figure
1.3
�NAME symbol table ref=3�
�ASSIGN�
�NUMBER value=35�
�LPAREN�
�SEMICOLON�
{
�NUMBER value=33�
�WRITE symbol table ref=2�
declare �NAME
xyz; symbol table ref=3��PLUS�
�NUMBER value=3�
xyz = (33+3)-35;
�RPAREN�
�SEMICOLON�
�MINUS�
write xyz;
�RBRACE�
�NUMBER value=35�
__________________________
__________________________
UB-DINF/2009/2
Análisis Léxico
}
Figure 1.5: Result of lexical analysis of
Figure 1.3: A Micro program
__________________________
13
�SEMICOLON�
�WRITE symbol table ref=2�
�NAME symbol table ref=3�
program
in Figure 1.3
�SEMICOLON�
�RBRACE�
Después
finalizar
escaner,table
la tabla
deexample
símboloscould
queda:
After the
scannerde
finishes,
theelsymbol
in the
look like
Figure 1.5:consists
Result of lexical
analysis of program in Figure 1.3
e semantics of Micro should be clear2 : a Micro program
of a sequence
read/write or assignment statements. There
are integer-valued
variables (which
0After
“declare”
DECLARE
the scanner finishes, the symbol table in the example could look like
ed to be declared before they are used) and
are restricted to addition
1 expressions
“read”
READ
2 “write”
WRITE 0 “declare” DECLARE
d substraction.
3
“xyz”
NAME
1
2
3
“read”
“write”
“xyz”
READ
WRITE
NAME
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
where the third column indicates the type of symbol.
3.2 x86 code
where the third column indicates the type of symbol.
Clearly, the main difficulty in writing a lexical analyzer will be to decide, while
Clearly, the main difficulty in writing a lexical analyzer will be to decide, while
readingwill
characters
whencharacters
a token
ofbywhich
type
is
finished.
Weiswill
e target language
be codeone
for by
the one,
x86reading
processor
family.
Figure
1.4
shows
one
one, when
a token
of which type
finished. We will
see in Chapter
2and
that finite
regular
expressions
and
finite automata
provide a powerful
see in
2 thatfor
regular
expressions
provide
a powerful
rt of the output
ofChapter
the compiler
the program
of Figure
1.3. automata
The
full output
NOTAS DEL CURSO and convenient method to automate this job.
and
convenient
to automate this job.
n be found in
Section
B.6.2,method
page 157.
86 processors have a number of registers, some of which are special purpose,
1.3.4 Syntax analysis
ch as the esp register which always points to the top of the stack (which grows
1.3.4 Syntax analysis
Once lexical
analysis is finished,
the parser
wnwards). More information on x86 assembler
programming
can be
foundtakes
in over to check whether the se-
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
Análisis Sintáctico
VUB-DINF/2009/2
14
__________________________
Such matching can conveniently be represented as a parse tree. The parse tree
corresponding to the token sequence of Figure 1.5 is shown in Figure 1.6.
__________________________
<program>
<LBRACE>
<statement>
<SEMICOLON>
<statement>
<declaration>
(xyz)
<NAME>
<ASSIGN>
<statement> <SEMICOLON>
<MINUS>
<WRITE>
<term>
<LPAREN> <expression> <RPAREN>
<statement_list>
<write_statement>
<expression>
(xyz)
<term>
_________________________
<SEMICOLON> <statement_list>
<assignment>
<DECLARE> <NAME>
__________________________
<RBRACE}
<statement_list>
<>
<expression>
<NUMBER>
<term>
(35)
<term>
<PLUS>
<term>
(33)
<NUMBER>
(3)
__________________________
__________________________
<var>
<NAME>
<NUMBER>
__________________________
(xyz)
Figure 1.6: Parse tree of program in Figure 1.3
Note that in the parse tree, a node and its children correspond to a rule in the
syntax specification of Micro: the parent node corresponds to the left hand side
of the rule while the children correspond to the right hand side. Furthermore, the
yield3 of the parse tree is exactly the sequence of tokens that resulted from the
lexical analysis of the source text.
__________________________
__________________________
__________________________
Análisis Sintáctico
Hence the job of the parser is to construct a parse tree that fits, according to the
syntax specification, the token sequence that was generated by the lexical analyzer.
In Chapter 3, we’ll see how context-free grammars can be used to specify the
syntax of a programming language and how it is possible to automatically generate
parser programs from such a context-free grammar.
Revisa 1.3.5
si los símbolos
Semantic aparecen
analysis en el orden correcto (es decir, revisa si el
programa fuente fue diseñado de acuerdo con la sintaxis del de lenguaje
Having established
that the source
text is syntactically
correct,fuente
the compiler
mayformar
programación)
y combina
los símbolos
del código
para
now perform additional checks such as determining the type of expressions and
unidades gramaticales (frases gramaticales).
3
The yield of a tree is the sequence of leafs of the tree in lexicographical (left-to-right) order
En general, las unidades gramaticales se organizan y representan con
árboles de análisis sintáctico o árboles sintácticos.
Árbol Sintáctico
__________________________
Ejemplo:
__________________________
h=x+y-x+y
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
NOTAS DEL CURSO
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
Análisis Semántico
__________________________
__________________________
Se considera el significado de una unidad gramatical, es decir, se debe
interpretar. Esto se puede lograr traduciendo la entrada a una forma de
representación intermedia.
__________________________
_________________________
__________________________
Por ejemplo, en la proposición h = x + y - x + y
__________________________
Si nunca se hubiese definido la variable h, la proposición de asignación no
tendría sentido. También por ejemplo, la asignación de una variable
booleana a una variable real tampoco tendría sentido. Este tipo de
inconsistencia será reconocido por el análisis de tipos.
__________________________
__________________________
__________________________
__________________________
Generador de Código
__________________________
__________________________
El código objeto se genera en la última fase de la compilación. En esta
fase el código intermedio se transforma en código de máquina y la
memoria necesaria quedará determinada.
__________________________
Ésta es la única fase que depende del hardware, dado que el conjunto de
instrucciones varía de una computadora a otra.
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
Fases de un compilador
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
NOTAS DEL CURSO
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
__________________________
__________________________
__________________________
_________________________
Análisis Léxico
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
Analizador Léxico vs Analizador
Sintáctico
__________________________
__________________________
__________________________
_________________________
Componente
léxico
Programa
fuente
Analizador
léxico
__________________________
Analizador
sintáctico
__________________________
Obtén el siguiente
componente léxico
__________________________
__________________________
Tabla de
símbolos
__________________________
__________________________
Análisis Léxico
__________________________
__________________________
__________________________
Entrada
‘6’ ’.’ ‘1’
‘+’
‘r’ ‘i’ ‘g’ ‘h’ ‘t’
‘*’
‘2’ ‘1’
A. Léxico
Número
6.1
Operador +
Variable
right
Operador *
Entero
21
Numero
Variable
Parser
_________________________
ADD
__________________________
MUL
Entero
__________________________
__________________________
__________________________
__________________________
__________________________
NOTAS DEL CURSO
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
Definiciones
__________________________
__________________________
Símbolo. Es una entidad abstracta. Normalmente los símbolos son letras
(a,b,...,z, A, B,...Z), dígitos (0,1,...,9) y otros caracteres (+,-,*,/,?,...)
__________________________
_________________________
Alfabeto ! . Es un conjunto finito de símbolos, no vacío.
V1= {A,B, C, D, E, F, G, ..., X, Y, Z}
V2= {a, b, c, d, 0, 1, 2, 3, 4, *, #, +}
V3= {0,1}
V4= {if, while, do, repeat, until, else}
Para definir que un símbolo a pertenece a un alfabeto V se utiliza la
notación a! V
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
Definiciones
__________________________
Cadena. Es una secuencia finita de símbolos de un determinado Alfabeto.
__________________________
Longitud de cadena. Es el número de símbolos que contiene.
__________________________
_________________________
|a + 2 * b| ! 5
|if a > b then a = b ;| ! 9
__________________________
Cadena vacía. Aquella cadena que no tiene símbolos y se denota por ε,
entonces su longitud es:
|ε|! 0
__________________________
Concatenación de cadenas. Sean ! y " dos cadenas cualesquiera, se denota
concatenación de ! y " a una nueva cadena !" constituida por los símbolos
de la cadena ! seguidos por los de la cadena ".
__________________________
El elemento neutro de la concatenación es ε.
Lenguaje
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
El término Lenguaje se refiere a cualquier conjunto de cadenas de un
alfabeto fijo.
Se puede tener el lenguaje ∅, que es el conjunto vacío, o {ε} el conjunto
que sólo contiene la cadena vacía.
Existen varias operaciones que se pueden aplicar a los lenguajes, para el
análisis léxico, los que interesan son la Unión, Concatenación y la
Cerradura, así como la Exponenciación ( L0 = ε, y Li = Li-1 L)
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
NOTAS DEL CURSO
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
Lenguajes regulares
__________________________
__________________________
Definición
Sea ∑ un alfabeto. El conjunto de los lenguajes regulares sobre ∑ se
definen recursivamente como sigue:
__________________________
1. ∅ es un lenguaje regular.
__________________________
2. {ε}, el conjunto que contiene la cadena vacía, es un lenguaje regular.
__________________________
3. ∀a∈∑, {a} es un lenguaje regular.
__________________________
4. Si A y B son lenguajes regulares, entonces A!B, AB, A* son lenguajes
regulares.
_________________________
__________________________
__________________________
__________________________
5. Ningún otro lenguaje sobre ∑ es regular.
Operaciones sobre
Lenguajes
__________________________
__________________________
__________________________
Operación
Definición
Unión: L!M
L∪M= { s | s está en L o s está en M }
Concatenación: LM
LM= { st | s está en L y t está en M }
Cerradura de Kleene: L* L* = i=0U∞Li
Cerradura Positiva: L+ L+ = i=1U∞Li
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
Lenguaje
Ejemplo: Sea
L = {A, B, . . . , Z, a, b, . . . , z}
D ={ 0, 1, 2, . . . , 9}
Algunos lenguajes creados a partir de L y D aplicando operaciones sobre
lenguajes son:
1. L!D es el conjunto de letras y dígitos
2. LD es el conjunto de cadenas que consta de una letra seguido de un dígito
3. L4 es el conjunto de todas las cadenas de cuatro letras
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
__________________________
4. L* es el conjunto de todas las cadenas de letras, incluyendo ∊
__________________________
5. L (L!D)* es el conjunto de todas las cadenas de letras y dígitos que
comienzan con una letra
__________________________
6. D+ es el conjunto de todas las cadenas de uno o más dígitos
NOTAS DEL CURSO
__________________________
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
Expresiones regulares
__________________________
__________________________
Una expresión regular r representa un lenguaje L(r).
Una expresión regular se construye a partir de expresiones regulares más
simples utilizando un conjunto de reglas definidas.
Las reglas de definición especifican cómo se forma L(r) combinando de
varias maneras los lenguajes representados por las subexpresiones de r.
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
Expresiones regulares
__________________________
__________________________
Definición. Reglas de las expresiones regulares del alfabeto ∑
1. ∅ es un lenguaje regular.
__________________________
_________________________
2. ε es una expresión regular designada por {ε}, es decir, el conjunto que
contiene la cadena vacía, es un lenguaje regular.
__________________________
3. Si a ∈ ∑, entonces a es una expresión regular designada por {a}
__________________________
4. Suponiendo que r y s sean expresiones regulares representadas por los
lenguajes L(r) y L(s), entonces
a) (r) | (s) es una expresión regular representada por L(r) ! L(s)
b) (r)(s) es una expresión regular representada por L(r)L(s)
c) (r)* es una expresión regular representada por L(r)*
d) (r) es una expresión regular representada por L(r)
__________________________
5. Ninguna otra secuencia de símbolos es una expresión regular.
Comparando la definición anterior con la definición de lenguajes
regulares se deduce que toda expresión regular sobre ∑ denota un
lenguaje regular sobre ∑.
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
NOTAS DEL CURSO
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
Equivalencias
Teorema.
Sean r, s y t expresiones regulares sobre el mismo alfabeto ∑. Entonces:
1. r ! s = s ! r
2. r ! ∅ = r = ∅ ∪ r
3. r ! r = r
4. (r ! s) ∪ t = r ∪ (s ! t)
5. rε= εr = r
6. r∅ = r∅ = ∅
7. (rs) t = r (st)
8. r (s ! t) = rs ! rt y (r ! s) t = rt ! st
9. r* = r** = r*r* = (ε ! r)* = r* (r ! ε) = (r ! ε) r* = ε ! rr*
10. (r ! s)* = (r* ! s*)* = (r*s*)* = (r*s)* r* = r* (sr*)*
11. r (sr)* = (rs)* r
12. (r*s)* = ε ! (r ! s)* s
13. (rs*)* = ε ! r (r ! s)*
14. s (r ! ε)* (r ! ε) ! s = sr*
15. rr* = r*r
Convenciones de escritura
de expresiones regulares
Se pueden evitar los paréntesis innecesarios si se adoptan las convenciones:
1. El operador unario * tiene la mayor precedencia y es asociativo por la
izquierda,
2. La concatenación tiene la segunda mayor precedencia y es asociativo por la
izquierda,
3. | tiene la menor precedencia y es asociativo por la izquierda.
Ejemplo:
(a)| ((b)*(c)) es equivalente a a|b*c
Estas dos expresiones designan el conjunto de cadenas que tienen una
sola a, o cero o más b seguidas de una c.
Propiedades algebraicas de las
expresiones regulares
Axioma
r|s = s|r
r|(s|t) = (r|s)|t
(rs)t= r(st)
r (s|t) = rs | rt
(s|t) r = sr | tr
εr=r
rε=r
r* = (r| ε)*
r** = r*
NOTAS DEL CURSO
Descripción
| es conmutativo
| es asociativo
la concatenación es asociativa
la concatenación distribuye sobre |
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
__________________________
∊ es el elemento identidad para la concatenación
__________________________
la relación entre * y ε
__________________________
* es idempotente
__________________________
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
Definiciones regulares
__________________________
__________________________
Por conveniencia de notación, puede ser deseable dar nombres a las
expresiones regulares y definir expresiones regulares utilizando dichos
nombres como si fueran símbolos.
__________________________
Si ! es un alfabeto, entonces una definición regular es una secuencia de
__________________________
definiciones de la forma
d1 ! r1
d2 ! r2
...
dn ! rn
donde cada di es un nombre distinto, y cada ri es una expresión regular sobre ! !
{d1, d2, . . ., di-1}
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
Definiciones regulares
__________________________
__________________________
Ejemplo.
Definiciones regulares para identificadores de un lenguaje:
__________________________
_________________________
letra ! A | B | . . . | Z | a | b | . . . | z
__________________________
digito ! 0 | 1 | 2 | . . . | 9
__________________________
id ! letra (letra | digito)*
digitos ! digito digito*
__________________________
fraccion ! . digito | ε
__________________________
exponente ! ( E ( + | - | ε ) digitos ) | ε
__________________________
numero ! digitos fraccion exponente
Abreviatura en la notación
__________________________
__________________________
__________________________
1. Uno o mas casos. El operador unario + significa “uno o más casos
de”.
r * = r + | ε y r + = r r*
__________________________
2. Cero o un caso. El operador unario ? significa “cero o un caso de”.
r? = r | ε
__________________________
3. Clases de caracteres. La notación [abc] es equivalente a a | b | c, [az] es equivalente a a | b | . . . | z
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
NOTAS DEL CURSO
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
Reconocimiento de
componentes léxicos
Ejemplo. Consideremos el siguiente fragmento gramatical
prop ! if expr then prop | if expr then prop else prop | ε
expr ! termino oprel termino | termino
termino ! id | num
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
if ! if
then ! then
else ! else
oprel ! < | <= | = | <> | > | >=
id ! letra (letra | digito)*
num ! digito+ (. digito+)? (E(+ | - )? digito +)?
__________________________
__________________________
__________________________
delim ! blanco | tab | lineanueva
eb ! delim+
__________________________
Patrones de expresiones regulares
para componentes léxicos
__________________________
__________________________
Expresión
regular
Componente
léxico
Valor del atributo
__________________________
eb
-
-
if
if
-
_________________________
then
then
-
else
else
-
id
id
apuntador a la entrada de la tabla
num
num
apuntador a la entrada de la tabla
<
oprel
MEN
<=
oprel
MEI
=
oprel
IGU
<>
oprel
DIF
>
oprel
MAY
>=
oprel
MAI
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
Diagramas de transiciones
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
NOTAS DEL CURSO
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
Diagramas de transiciones
__________________________
Es una colección finita de círculos (estados), los cuales se pueden rotular,
conectados por flechas que reciben el nombre de arcos o aristas.
__________________________
Cada uno de estos arcos se etiqueta con un símbolo o categoría de
símbolos (p.e. dígito, letra, numero) que representa la cadena de entrada que
se analiza.
_________________________
__________________________
__________________________
Uno de los círculos se designa con un apuntador, y representa la posición
inicial (estado Inicial), y por lo menos uno se representa como un círculo
doble, llamado posición final (estado de Aceptación).
__________________________
Decimos que una cadena de símbolos es aceptada por un diagrama de
transiciones si los símbolos que aparecen en la cadena (de izquierda a
derecha) corresponden a una secuencia de arcos rotulados que conducen
del círculo designado por el apuntador a un círculo doble.
__________________________
Diagramas de transición para
>=
Inicio
>
0
7
otro
__________________________
__________________________
__________________________
__________________________
__________________________
=
6
__________________________
_________________________
*
8
__________________________
__________________________
Si surge un fallo mientras se está siguiendo un diagrama de
transiciones, se debe retroceder el apuntador delantero hasta
donde estaba en el estado inicial de dicho diagrama, y activar el
siguiente diagrama de transiciones.
__________________________
__________________________
__________________________
__________________________
Diagramas de transición para el
componente léxico oprel
Inicio
0
<
1
=
return (oprel, MEI)
2
>
=
5
otro
4
>
6
=
otro
7
8
NOTAS DEL CURSO
return (oprel, DIF)
3
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
*
return (oprel, MEN)
return (oprel, MAI)
*
return (oprel, MAY)
__________________________
__________________________
__________________________
__________________________
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
Algoritmo de Diagrama de
transición
ALGORITMO
Estado=1
Leer símbolo
while !EOF
case Estado
1: if símbolo==Letra
Estado=3
else if símbolo==Dígito
Estado=2
else Error
2: Error
3. if símbolo==Letra
Estado=3
else if símbolo==Dígito
Estado=3
else Error
Leer símbolo
end_while
if Estado!=3 Error
Tabla de transiciones
Es un arreglo bidimensional cuyos elementos proporcionan el resumen de
un diagrama de transiciones.
ALGORITMO
Letra
Dígito
FDC
1
3
2
Error
2
Error
Error
Error
3
3
3
Aceptar
Estado=1
do
Lee símbolo
case símbolo
Letra: Entrada=”Letra”
Dígito: Entrada=”Dígito”
EOF: Entrada=”FDC”
default: ERROR
fin_case
Estado=Tabla[Estado,Entrada]
if Estado==”ERROR”
SALIR A RUTINA DE ERROR
while (Estado!=”Aceptar”)
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
Diagrama de transiciones de un
número real
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
NOTAS DEL CURSO
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
Tabla de transiciones construida a partir
de diagrama de transición anterior
__________________________
__________________________
Dígito
.
E
+
-
FDC
__________________________
1
2
Error
Error
Error
Error
Error
_________________________
2
2
3
5
Error
Error
Error
__________________________
3
4
Error
Error
Error
Error
Error
__________________________
4
4
Error
5
Error
Error Aceptar
5
7
Error
Error
6
6
Error
6
7
Error
Error
Error
Error
Error
7
7
Error
Error
Error
Error Aceptar
__________________________
__________________________
__________________________
__________________________
A. Léxico basado en la tabla
de transiciones anterior
__________________________
__________________________
__________________________
ALGORITMO
_________________________
Estado=1
do
Lee símbolo
case símbolo
0 a 9: Entrada=”Dígito”
EOF: Entrada=”FDC”
., E, +, -: Entrada=símbolo
default: ERROR
fin_case
Estado=Tabla[Estado,Entrada]
if Estado==”ERROR”
SALIR A RUTINA DE ERROR
while (Estado!=”Aceptar”)
__________________________
Ejercicios
1. Diseñe un diagrama de transiciones para reconocer expresiones aritméticas de longitud
arbitraria que comprenden enteros positivos separados por signos de suma, resta, multiplicación o
división.
2. Escriba una analizador léxico a partir del siguiente diagrama de transiciones.
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
3. Construya una tabla de transiciones a partir del diagrama del ejercicio 2 y escriba un
analizador léxico basado en esa tabla.
NOTAS DEL CURSO
__________________________
__________________________
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
Ejercicios
__________________________
__________________________
4. Describa las cadenas que acepta el autómata finito determinista representado en el siguiente
diagrama de transiciones.
letra
letra
__________________________
_________________________
__________________________
__________________________
dígito
dígito
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
Autómatas Finitos
Deterministas
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
ADF
Definición:
Un autómata finito determinista (AFD) es una quíntupla (Q, !, ", qo, F)
donde
. Q es un conjunto finito de estados
. ! es el alfabeto de entrada finito
. ": Q x ! ! Q es una función de transición
. qo ! Q es el estado inicial
. F " Q es el conjunto de estados finales o de aceptación
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
NOTAS DEL CURSO
M.C. GABRIEL GERÓNIMO CASTILLO
COMPILADORES
__________________________
__________________________
__________________________
_________________________
__________________________
__________________________
__________________________
__________________________
__________________________
__________________________
NOTAS DEL CURSO
M.C. GABRIEL GERÓNIMO CASTILLO