Documentos de Académico
Documentos de Profesional
Documentos de Cultura
procese el smbolo a (leer el siguiente smbolo)
Remover A del tope de la pila
Meter B dentro de la pila
Un APD tambin puede representarse por medio de un diagrama
de estados (nuestros ejemplos los utilizaran).
La transicin d(q
i
,a,A) = {[qj,B]} es representada por
a A/B
qi qj
El smbolo / representa reemplazo (reemplazar A en el
tope de la pila por B).
El dominio de la funcin de transicin permite transiciones
lambda en el smbolo de entrada y en el tope de la pila.
Ejemplo:
1. d(q
i
, l,A) = [q
i
, l]
2. d(q
i
, l, l) = [q
i
, A]
3. d(q
i
,a, l) = [q
j
, l]
l A/l
l l/A
q
i
q
i
q
i
q
j
a l/l
*Pop una A
*Push una A
*Lee una a
4.2 Lenguajes aceptados por un Autmata de Push-Down
La adicin o extensin al autmata finto al manejar una pila
(APD) le permite a este ser un aceptador no solo de lenguajes
regulares sino tambin de lenguajes de contexto libre. Esto
nos permite establecer que existe una correspondencia entre
un APD y una gramtica de contexto libre.
Lo anterior es demostrable y la forma de hacerlo es por medio
de ir construyendo un APD a partir de cada produccin de una
gramtica de contexto libre. Para cada regla existe una
transicin dentro del APD.
Por otra parte un APD podra implementarse con puras
transiciones de leer los smbolos de entrada pero sin
movimientos en la pila (l/l). Esto nos dara una mquina
similar a un autmata finito la cual obviamente va a aceptar
cualquier gramtica regular.
4.3 APD determinstico.
Un APD es determinstico si existe no mas de una
transicin que es aplicable por cada combinacin de
estado, smbolo de entrada y tope de la pila. A
continuacin construimos un APD M determinstico
para aceptar el lenguaje {a
i
b
i
| i>=0}.
M: Q = {q
0
,q
1
}
S = {a,b}
G = {A}
F = {q
0
,q
1
}
d(q
0
,a, l) = {[q
0
, A]}
d(q
0
,b, A) = {[q
1
, l]}
d(q
1
,b, A) = {[q
1
, l]}
q
0
q
1
b A/l
a l/A b A/l
Ejercicios:
Construir un APD que acepte el lenguaje {wcw
R
| w es un
miembro de {a,b}*}.
Construir un APD que acepte el lenguaje {a
i
c
j
b
i
| i,j>=0}.
Construir un APD que acepte el lenguaje {a
i
b
j
c
k
| i+k=j}.
4.4 APD y Gramticas de Contexto Libre
Podemos probar que cada lenguaje libre de contexto es
aceptado por un APD. Para llevar a cabo esto, las reglas de la
gramtica se usan para generar las transiciones de un APD
equivalente. Sea L un lenguaje libre de contextos y G una
gramtica para ese lenguaje en forma normal de Greibach. En
esta forma de Greibach todas las producciones de una
gramtica tienen una de las siguientes formas:
A aA
1
A
2
.A
n
A a
A l
La gramtica G en forma de Greibach que acepta {a
i
b
i
| i>=0}
es usada para ilustrar la construccin de un APD equivalente.
G: S aAB | aB
A aAB | aB
B b
El APD tiene dos estados: un estado inicial q
0
y un estado
aceptador o final q
1
. Una regla S de la forma S aA
1
A
2
A
n
genera una transicin que procesa el smbolo terminal a, mete
(push) las variables A
1
A
2
A
n
a la pila y se mueve al estado q
1
.
El resto de las operaciones usan el smbolo de entrada y el tope
de la pila para determinar la transicin apropiada. La funcin de
transicin de el APD es definido directamente de las reglas de
G. d(q
0
,a, l) = {[q
1
,AB], [q
1
,B]}
d(q
1
,a,A) = {[q
1
,AB], [q
1
,B]}
d(q
1
,a,B) = {[q
1
, l]}
Por otra parte es tambin posible construr una gramtica de
contexto libre a partir de un APD.
5. MAQUINAS DE TURING
La mquina de Turing nos proporciona muchas de las
caractersticas comnmente asociadas con una computadora
moderna. De hecho, la mquina de Turing fue el modelo
utilizado para disear y construir la primer computadora de
programa almacenado. Esta mquina utiliza una secuencia
de operaciones elementales para acceder y alterar una
posicin de memoria. A diferencia de una computadora, una
mquina de Turing no tiene un lmite de memoria o de
tiempo para realizar un clculo. Por ltimo, la mquina de
Turing representa lo mximo dentro de los dispositivos de
computacin abstractos.
5.1 Definicin de Mquina de Turing.
Una mquina de Turing es una mquina de estado finto en
donde en una transicin se escribe un smbolo en la cinta
(tape). La cabeza de la cinta puede moverse en cualquier
direccin, permitiendo que la mquina lea y manipule la
entrada tantas veces como se desee.
Mas formalmente, una mquina de Turing es un quintuple
M = (Q, S, G, d, q0) donde Q es un conjunto finito de
estados, G es un conjunto finito llamado el alfabeto de la
cinta y contiene un smbolo especial B que representa un
blanco, S es un subconjunto de S {B} llamado el alfabeto
de entrada, d es una funcin parcial de Q x G a Q x G x
{L,R} llamado la funcin de transicin y q
0
(miembro de Q)
es un estado distinguido llamado estado inicial.
5.2 funcionamiento de la mquina de Turing.
La cinta de una mquina de Turing se extiende
indefinidamente en una direccin. Las posiciones de la cinta
estn numeradas por los nmeros naturales siendo la
posicin mas a la izquierda la nmero cero.
q0
0 1 2 3 4 5 6
.
Una computacin comienza con la mquina en estado q
0
y
la cabeza de la cinta leyendo la posicin mas a la izquierda.
La entrada, una cadena de S
*
se escribe en la cinta
comenzando en posicin uno. Posicin cero y el resto de la
cinta es asumido que estn iniciadas con blancos.
El alfabeto de la cinta proporciona smbolos adicionales que
pueden ser usados durante la computacin.
Una transicin consiste de tres acciones: cambiar el estado,
escribir un smbolo en el cuadro ledo por la cabeza de la cinta
y mover la cabeza de la cinta. La direccin del movimiento de
la cabeza de la cinta puede ser a la izquierda (L) o a la
derecha (R). La configuracin de la mquina
q
1
.
x
y transicin d(q
i
,x) = [q
j
,y,L] se combinan para producir la
nueva configuracin
q
j
y
La transicin cambi el estado de q
i
a q
j
, reemplaz el
smbolo x con y y movi la cabeza de la cinta un cuadro a la
izquierda.
Una mquina de Turing halts (termina) cuando encuentra
un estado (par de smbolos) para los cuales no existe
definida una transicin. Esto es una terminacin normal.
Una transicin de la posicin cero en la cinta puede
especificar un movimiento a la izquierda de los lmites de la
cinta. Cuando esto ocurre, la computacin se dice termina
anormalmente.
Mquina de Turing Standard
Son diseadas para ejecutar computaciones en cadenas del
alfabeto de entrada. Una computacin comienza con la cabeza
de la cinta leyendo el cuadro mas a la izquierda y la cadena de
entrada posicin uno. Todos los cuadros a la derecha de la
cadena de entrada es asumido estn en blanco.
Ejemplo: La funcin de transicin de una mquina de Turing
standard con alfabeto de entrad {a,b} es mostrada a
continuacin. La transicin del estado q
0
mueve la cabeza de
la cinta a posicin uno para leer la entrada. Las transiciones en
estado q
1
leen la cadena de entrada e intercambian los
smbolos a y b. Las transiciones en q
2
retornan la mquina a
la posicin inicial.
d B a b
q
0
q
1
,B,R
q
1
q
2
,B,L q
1
,b,R q
1
,a,R
q
2
q
2
,a,L q
2
,b,L
Una mquina de Turing puede representarse grficamente por
un diagrama de estados.
Ejemplo (tabla anterior): Intercambia as y bs en la cadena de
entrada.
B/B R
B/B L
a/b R
b/a R
b/b L
a/a L
q
0
q
1
q
2
Ejemplo: La siguiente Mquina de Turing con alfabeto de
entrada {a,b} produce una copia de la cadena de entrada. Esto
quiere decir que una computacin que comienza con la cinta
teniendo la forma BuB termina con la cinta BuBuB.
B/B R
a/X R
B/B L
X/a L
Y/b L
a/a R
b/b R
b/Y R
a/a R
b/b R
B/B R
B/b L
a/a R
b/b R
B/B R
b/b R
a/a R
B/a L
X/X R
Y/Y R
a/a L
b/b L
B/B L
COPY: q
0
q
1
q
2
q
3
q
4
q
5
q
6
q
7
Ejercicios:
Construir una mquina de Turing para mover la entrada
un espacio a la derecha. La configuracin de entrada
q
0
BuB resulta en q
f
BBuB.
Construir una mquina de Turing para concatenar una
copia de la cadena de entrada en reversa. La
configuracin de entrada q
0
BuB resulta en q
f
Buu
R
B.
5.3 Lenguajes aceptados por la mquina de Turing
Una mquina de Turing puede ser usada para calcular
funciones y para aceptar lenguajes. En el primer caso el
resultado de una computacin se define in trminos del estado
en donde termina la computacin o la configuracin de la
cinta. En el segundo caso, una computacin acepta o rechaza
la cadena de entrada. A diferencia de un autmata finto o de
Push Down, la mquina de Turing no necesita leer toda la
cadena de entrada para aceptar la cadena. Una mquina de
Turing aumentada con estados finales es un sextuple (Q, S, G,
d, q0, F) donde F es un subconjunto de Q y contiene los
estados finales.
Un lenguaje aceptado por una mquina de Turing es llamado
lenguaje recursivamente enumerable. La hablidad de una
mquina de Turing para moverse en ambas direcciones y
procesar blancos introduce la posibilidad de no parar (halt)
ante ciertas entradas. Un lenguaje que es aceptado por una
mquina de Turing y que termina (halt) ante todas las cadenas
de entrada es llamado lenguaje recursivo. Existen muchas
mquinas de Turing que aceptan un lenguaje en particular;
algunas pueden parar (halt) para todas las entradas mientras
otras no. La existencia de una mquina de Turing que para
(halt) con todas las entradas es suficiente para demostrar que
el lenguaje es recursivo.
B/B R
a/a R
b/b R
q
0
q
1
q
2
Ejemplo: La mquina de Turing
acepta el lenguaje (a U b)*aa(a U b)*. La computacin para
la cadena aabb examina solo la mitad de la entrada antes de
aceptar la cadena completa. El lenguaje (a U b)*aa(a U b)*
es recursivo; las computaciones en la mquina terminan
(halt) para cada cadena de entrada. Una computacin exitosa
termina cuando una subcadena aa es encontrada.
b/b R
a/a R
q
3
5.4 Ejemplo de mayor fuerza de la Mquina de Turing
5.5 Extensiones de la Mquina de Turing
Existen variaciones al modelo de la mquina de Turing
standard. Cada variacin o extensin parece incrementar la
capacidad de la mquina, pero la realidad es que los lenguajes
aceptados por esas mquinas de Turing extendidas son tambin
aceptados por mquinas de Turing Standard.
Mquinas de Turing de Multipistas
En este tipo de mquinas la cinta es dividida en varias pistas.
Una posicin en la multipista-cinta contiene n smbolos del
alfabeto de la cinta.
q
j
PISTA 1
PISTA 2
Una posicin en la cinta en una mquina de 2 pistas es
representada por un par ordenado [x,y] donde x es el smbolo
en pista 1 y y en pista 2. Una transicin lee y escribe la
posicin completa de la cinta y se escribe como:
d(q
i
,[x,y]) = [q
j
,[z,w],d] donde d es {L,R}
La entrada es puesta en la pista 1. Todas las posiciones en la
pista 2 estn en blanco. Aceptacin en este tipo de mquinas
de Turing es por medio de estado final.
Este tipo de mquinas de Turing, al ser equivalentes a la
mquina de Turing standard, acepta lenguajes recursivamente
enumerables.
Mquinas de Turing de dos direcciones (two-way)
Este tipo de mquinas es identico a una mquina de Turing
standard excepto que la cinta se extiende indefinidamente en
ambas direcciones (izquierda y derecha). En este tipo de
mquinas la cadena de entrad puede ser puesta en cualquier
lugar de la cinta. Todas las dems posiciones de la cinta se
asume que estn en blanco.
q0
. .
Se puede colocar un smbolo especial (#) en una posicin para
que sea el lmite de la izquierda (como en una mquina
standard). Este tipo de mquinas es tambin equivalente al de
la mquina standard (aceptan Lenguajes Rec. Enumerables).
Mquinas de Mltiple Cintas
Consiste de k cintas y k cabezas de cintas independientes. Los
estados y alfabetos son los mismos que en la mquina
standard. La mquina lee las cintas simultneamente pero solo
tiene un estado.
CINTA 1
CINTA 2
CINTA 3
q
i
Una transicin es determinada por el estado y el smbolo
ledo por cada cabeza de cinta. Una transicin puede
cambiar el estado
escribir un smbolo en cada cinta
independientemente reposicionar cada cabeza de cinta.
El reposicionamiento consiste de mover la cabeza de la
cinta un cuadro a la izquierda o la derecha o incluso dejar la
cabeza en su posicin actual. La entrada a la mquina es
puesta en la cinta 1. Todas las dems cintas estarn en
blanco.
Al igual que en las mquinas anteriores este tipo de
mquinas acepta lenguajes Rec. Enumerables.
5.6 Mquinas de Turing No Determinsticas
Estas mquinas pueden especificar cualquier nmero finito de
transiciones para una configuracin dada. Los componentes de
una mquina no determinstica, con excepcin de la funcin de
transicin, son idnticos a los de una mquina de Turing
standard. Las transiciones en una mquina no determinstica
son definidas por una funcin de Q x G a los subconjuntos Q x
G x {L,R}.
Cundo una transicin indica que mas de una accin es
posible, una computacin arbitrariamente escoge una de las
transiciones. Una cadena de entrada es aceptada por una
mquina no determinstica si existe una computacin que
termina en un estado aceptador.
5.7 El problema de Halting para las Mquinas de Turing
Un problema de decisin consiste de un conjunto de preguntas
cuyas respuestas son si o no. Una solucin a un problema de
decisin es un procedimiento efectivo que determine la respuesta
para cada una de las preguntas. Una mquina de turing es un
sistema matemtico ideal para solucionar problemas de decisin.
La teora de Church-Turing dice que se puede disear siempre
una mquina de Turing para resolver cualquier problema de
decisin que tenga solucin por un procedimiento efectivo.
Entonces, para establecer que un problema no tiene solucin es
suficiente con mostrar que no existe solucin en una mquina de
Turing (Undecidability).
El mas famoso de los problemas sin solucin (undecidable
problem) es el problema de Halting.
El problema de Halting se formula de la forma siguiente:
Dada una mquina de Turing arbitraria M con alfabeto de
entrada S y una cadena w que pertenece a S
*
, Parara la
computacin de M con la entrada w ?
Es importante entender la declaracin del problema. Debemos
ser capaces de determinar si una mquina de Turing en
particular parar (halt) con una cadena determinada. Por
ejemplo la ltima mquina de Turing revisada para (halt) con
todas las cadenas conteniendo la subcadena aa. Sin embargo,
una solucin del problema halting requiere un algoritmo
general que responda la pregunta de halting que para cada
combinacin posible de mquina de Turing y cadena de
entrada la mquina va a parar.
Ejemplo: Tenemos una mquina de Turing H que resuelve el
problema de parada Halting.
H
R(M)w
acepta
rechaza
M hace parada con entrada w
M no hace parada con entrada w
La entrada consiste de la representacin de la mquina de
Turing M seguido de cadena w. La computacin de M con
entrada w hace parada.
La mquina H es modificada para construir H. Las
computaciones de H son las mismas que H excepto que H se
cicla indefinidamente cuando H termina en un estado aceptador.
Las transiciones de H son construidas agregandole a H que
causan que H se mueva indefinidamente a la derecha cuando H
entre a un estado aceptador.
H es combinado con una mquina de Turing que copia otra
mquina de Turing para formar una nueva mquina D.
R(M)
ciclo
para
M para con entrada R(M)
M no para con entrada R(M)
copy
R(M)R(M)
H
La entrada a la mquina D puede representarse por cualquier
mquina Turing. Considera una computacin de D con entrada
R(D). Entonces tendriamos lo siguiente:
R(D)
ciclo
para
D para con entrada R(D)
D no para con entrada R(D)
copy
R(D)R(D)
H
D
D
En esta ltima mquina D, vemos que D hace parada con
entrada R(D), si y solo si, D no hace parada con entrada
R(D). Esto es una contradiccin. Sin embargo, mquina D
puede construirse desde mquina H que resuelve el
problema de parada. La premisa que el problema de parada
tiene solucin nos lleva a la contradiccin. Podemos
concluir que el problema de parada no tiene solucin.
6. GRAMATICAS Y AUTOMATAS
Las gramticas fueron estudiadas en el captulo 2 donde se
introdujo la clasificacin de estas dada por Chomsky. En esta
clasificacin las gramticas eran divididas en 4 clases de
gramticas: regulares, de contexto libre, de contexto sensitivo
y de estructura de frase o sin restricciones. En esta unidad 6
regresamos a estudiar las tres primeras gramticas con un poco
mas de profundidad.
6.1 Lenguajes Regulares.
Teorema de Kleene.
Este teorema establece que un lenguaje L es aceptado por un
AFD con alfabeto S si y solo si, L es un conjunto regular
para S.
Para demostrar esto haremos uso de dos propiedades:
1. La primera ya explicada durante el tema 3.4, se refiere a
que cada conjunto regular es aceptado por algn AFN- l.
2. La segunda dice que cada lenguaje aceptado por un
autmata finito es un conjunto regular.
Y de acuerdo a lo establecido anteriormente sobre la
equivalencia de autmatas determinsticos y no
determinsticos conclumos con la validez del teorema de
Kleene.
Para demostrar la segunda afirmacin, extenderemos la
nocin de diagrama de estado.
Un grafo de expresin es un grafo dirigido con etiquetas
en donde los arcos estn etiquetados por expresiones
regulares y contiene un nodo inicial y nodos aceptadores o
finales.
El lenguaje de un grafo de expresin es la unin de los
conjuntos representados por las expresiones regulares
aceptadas. Los caminos (paths) en un grafo de expresin
generan expresiones regulares.
Ejemplo: Los sig. grafos aceptan las exp. reg. u* y u*vw*.
u
u
w
v
Para los grafos anteriores los cuales son muy sencillos es
simple determinar las expresiones regulares aceptadas. Existe
un procedimiento para reducir un grafo de expresin a una de
dos formas simples. Esta reduccin se lleva a cabo por medio
de repetir remover nodos de el grafo de tal manera que produce
la expresin aceptada por el grafo.
El diagrama de estados de un autmata finito puede tener
cualquier nmero de estados aceptadores. Cada uno de esos
estados exhibe la aceptacin de un conjunto de cadenas. El
lenguaje de la mquina es la unin de esos conjuntos. Para
determinar el lenguaje de un autmata, la observacin anterior
nos permite considerar los estados aceptadores separadamente.
El algoritmo para construir una expresin regular desde un
diagrama de estados hace exactamente eso; construye una
expresin para un conjunto de cadenas aceptadas por cada
estado aceptador individual.
Los nodos de un AFN- l en el algoritmo se asumen estn
numerados. La etiqueta de un arco de nodo i a nodo j se
denota como w
i,j
. Si no hay arco de nodo i a j, w
i,j
= 0.
Algoritmo: Construccin de una expresin regular desde un autmata finito.
Entrada: Diagrama de estados G de un autmata finito
Los nodos de G numerados 1,2,,n
1. Sea M el nmero de estados aceptadores de G. Hacer m copias de G, cada una de cual tiene un
estado aceptador. Nombra a cada una G
1
,G
2
,,G
m
. Cada estado aceptador de G es el estado
aceptador de algn G
t
, para t= 1,2,.,m.
2. Para cada G
t
Hacer
2.1 Repetir
2.1.1 Escoger un nodo i en G
t
que no sea ni el nodo incial ni un nodo
aceptador de G
t.
2.1.2 Borrar el nodo i en G
t
de acuerdo al siguiente procedimiento:
Para cada j,k no igual a i (esto incluye j = k) Hacer
i. Si w
j,i
<> 0, w
i,k
<>0 y w
i,i
= 0 Entonces
agregar un arco desde nodo j hasta nodo k etiquetado w
j,i
w
i,k
ii. Si w
j,i
<> 0, w
i,k
<>0 y w
i,i
<>0 Entonces
agregar un arco desde nodo j hasta nodo k etiquetado
w
j,i
(w
i,i
)*w
i,k
iii. Si nodos j y k tienen arcos etiquetados w
1
,w
2
,.,w
s
conectandose
Entonces reemplazarlos por un solo arco etiquetado w
1
Uw
2
U.W
s
iv. Remover el nodo i y todos los arcos que inciden en nodo i en G
t
Hasta que los nicos nodos en G
t
sean el nodo inicial y un nico estado aceptador
2.2 Determinar la expresin aceptada por G
t
Fin End
3. La expresin regular aceptada por G es obtenida juntando las expresiones para cada G
t
con U
(unin)
Ejemplo:
b
c
b
c
G:
b
c
b
c
b
c
b
c
G1:
G2:
De G se construyen dos grafos de expresin G1 y G2::
Se reduce G1 borrando nodos 2 y 3:
b
cc
b
b
La expresin aceptada por G1 es b*. Se remueve nodo 2 de G2
y se tiene:
b
cc
b
con expresin asociada b*ccb*.
La expresin aceptada por G, construida desde las
expresiones G1 y G2, es b*| b*ccb*.
Y con esto se prueba lo establecido en el teorema de
Kleene.
Las Aplicaciones del Lema de Pumping
El lema de Pumping es usado para demostrar o
establecer que un lenguaje no es regular y se basa en
ciertas reglas de descomposicin que se aplican a las
cadenas de los lenguajes regulares.
Bombear (Pumping) una cadena se refiere a construir
nuevas cadenas repitiendo (bombeando) subcadenas de la
cadena original.
Ejemplo:
M:
b a
a
a
b
a,b
b
q0
q1
q2
q3
Considere la cadena z=ababbaaab en L(M). Esta cadena
puede descomponerse en subcadenas u, v y w donde u=a,
v=bab, w=baaab y z=uvw. Las cadenas a(bab)
i
baaab son
obtenidas al bombear (pumping) la subcadena bab en
ababbaaab.
El lenguaje L(M) es regular pues producimos un autmata
finito para el. Si las cadenas producidas al bomberase la
cadena original tambin pertenecen a L(M), entonces L(M)
es regular, si no, entonces L(M) no es regular. El lema de
Pumping para lenguajes regulares tiene como objetivo
principal demostrar que un lenguaje no es regular.
Ejemplo: Para demostrar que L={a
i
b
i
| i>=0} no es regular
probaremos con una cadena z=a
k
b
k
y descomponiendo esta
en subcadenas u=a
i
,v=a
j
y w=a
k-i-j
b
k
, donde i+j<=k y j>0.
Si bombeamos cualquier cadena de esta forma produce
uvw=a
i
a
j
a
j
a
k-i-j
b
k
, que no pertenece a L. Por lo tanto, ya que z
pertenece a L y no tiene descomposicin que satisface las
condiciones del lema de pumping, concluimos que L no es
regular.
El Teorema Myhill-Nerode
As como el teorema de Kleene establece la relacin entre
lenguajes regulares y autmatas finitos, el teorema Myhill-
Nerode caracteriza la regularidad por medio de la existencia
de una relacin de equivalencia en las cadenas del lenguaje.
Esta caracterizacin proporciona un mtodo para obtener un
AFD mnimo que acepta un lenguaje.
Este teorema se utiliza, al igual que el lema de Pumping,
para demostrar que un lenguaje no es regular.
6.2 Lenguajes de Contexto Libre
Forma Normal de Chomsky.
Una gramtica de contexto libre est en forma normal de
Chomsky si cada regla tiene una de las siguientes formas:
A BC
A a
S l
Donde B,C son smbolos no terminales y no son smbolo
inicial.
El rbol de derivacin asociado con una derivacin en una
gramtica en forma normal de Chomsky es un arbol binario.
Autmata de Push-Down.
(tema cubierto en captulo IV)
Compilador de Lenguajes Formales
Un compilador es un programa que traduce otro programa
escrito en un lenguaje de alto nivel (java, C++, Ada, etc.)
produciendo como salida un programa objeto usualmente en
cdigo mquina. El compilador para realizar su tarea divide
todo el trabajo en varias fases, las cuales pueden ser:
Anlisis de lxico
Anlisis de sintaxis
Anlisis de semntica
Generacin de cdigo intermedio
Generacin de cdigo objeto
Optimizacin de cdigo
Las dos primeras fases utilizan lenguages formales como
especificacin de entrada a la fase.
Anlisis de lxico. En esta fase el compilador descompone
el programa fuente en tokens (identificadores, constantes,
operadores, etc.) los cules son especificados por medio de
expresiones regulares.
Ejemplo:
Identificador = letra (letra | digito)*
Nmero entero = digito digito*
Anlisis de sintxis. En esta fase el compilador revisa si los
estatutos, expresiones o declaraciones del programa fuente
cumplen con las especificaciones definidas por una
gramtica de contexto libre para el lenguaje siendo
compilado. Existen muchas tcnicas para implementar un
analizador de sintaxis, los cules son llamadas Parsers.
Ejemplos de Parsers son:
Recursivo descendente
LL(1)
Operador precedencia
LR
SLR
LALR
Tambin existen herramientas para producir por medio de
especificaciones analizadores de lxico y sintaxis. Algunas de
estas herramientas son:
Lex
Yacc
JavaCC
Sable