Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Notas2 PDF
Notas2 PDF
La fase de rastreo (scanner), tiene las funciones de leer el programa fuente como un archivo de
caracteres y dividirlo en tokens. Los tokens son las palabras reservadas de un lenguaje,
secuencia de caracteres que representa una unidad de informacin en el programa fuente. En
cada caso un token representa un cierto patrn de caracteres que el analizador lxico
reconoce, o ajusta desde el inicio de los caracteres de entrada. De tal manera es necesario
generar un mecanismo computacional que nos permita identificar el patrn de transicin entre
los caracteres de entrada, generando tokens, que posteriormente sern clasificados. Este
mecanismo es posible crearlo a partir de un tipo especifico de maquina de estados llamado
autmata finito.
El analizador lxico opera bajo peticin del analizador sintctico devolviendo un componente
lxico conforme el analizador sintctico lo va necesitando para avanzar en la gramtica. Los
componentes lxicos son los smbolos terminales de la gramtica. Suele implementarse como
una subrutina del analizador sintctico. Cuando recibe la orden obtn el siguiente componente
lxico, el analizador lxico lee los caracteres de entrada hasta identificar el siguiente
componente lxico.
componente
lxico
programa analizador analizador rbol de anlisis
fuente lxico sintctico sintctico
obtn siguiente
componente lxico
tabla de
smbolos
Una de las ventajas de separar el anlisis lxico y anlisis sintctico es que facilita la
transportabilidad del traductor si se decide realizar cambios posteriores, por ejemplo cambiar
las etiquetas begin-end por llaves de apertura y cierre { }.
1
UAA Sistemas Electrnicos Compiladores Eduardo Serna-Prez
patrn es una regla que genera la secuencia de caracteres que puede representar a un
determinado componente lxico (expresin regular).
lexema es una cadena de caracteres que concuerda con un patrn que describe un
componente lxico (valor de cadena).
El analizador lxico recoge informacin sobre los componentes lxicos en sus atributos
asociados. Los tokens influyen en las decisiones del anlisis sintctico, y los atributos, en la
traduccin de los tokens. En la practica los componentes lxicos suelen tener solo un atributo.
Para efectos de diagnostico, puede considerarse tanto el lexema para un identificador como el
numero de lnea en el que se encontr por primera vez. Esta informacin puede ser
almacenada en la tabla de smbolos para el identificador (estructura de datos).
Para la cadena E=M*C**2 de ejemplo, los componentes lxicos y los valores de atributo
asociado son:
Tome en cuenta que ciertas parejas no necesitan un valor de atributo. Los atributos
relacionados con ese token debern ser conservados y transferidos a alguna estructura de
datos para que sean empleados en las siguientes etapas del anlisis
Hay veces en que el analizador lxico necesita analizar previamente varios caracteres, adems
del lexema para un patrn, antes de poder anunciar una concordancia. Se pueden emplear
muchos esquemas de manejos de buffer, pero, aqu tan solo se sealarn algunos principios
bsicos.
2
UAA Sistemas Electrnicos Compiladores Eduardo Serna-Prez
Parejas de buffer Se utiliza un buffer dividido en dos mitades de N (1024 512) caracteres
cada una, Se leen N caracteres de entrada en cada mitad del buffer con un orden de lectura del
sistema, en vez de invocar una instruccin de lectura para cada carcter de entrada. Si quedan
menos de N caracteres en la entrada, entonces se lee un carcter especial eof en el buffer
despus de los caracteres de entrada. Es decir, eof marca el final del archivo fuente y es
distinto a cualquier carcter de la entrada.
E = M * C * * 2 eof
Inicio frente
lexema
Se mantienen dos apuntadores en el buffer de entrada. La cadena de caracteres entre los dos
apuntadores es el lexema en curso. Al principio, los dos apuntadores apuntan al primer
carcter del prximo lexema que hay que encontrar. Uno de ellos, apuntador delantero,
examina hacia adelante hasta encontrar una concordancia con un patrn. Una vez determinado
el siguiente lexema, el apuntador delantero se coloca en el carcter de su extremo derecho.
Despus de haber procesado el lexema, ambos apuntadores se colocan en el carcter situado
inmediatamente despus del lexema. Con este esquema se pueden considerar los comentarios
y los espacios en blanco como patrones que no producen componentes lxicos.
Centinela Corrigiendo la deficiencia del mtodo anterior para reducir la necesidad de dos
pruebas para cada avance del apuntador delantero. Se amplia cada mitad del buffer para
admitir un carcter centinela al final. De esta manera se vuelve mas eficiente el proceso de
cargar del buffer, realizando una carga en cada mitad.
E = M * \0 C * * 2 \0 eof
inicio frente
lexema
Un lenguaje formal o gramtica formal es una secuencia de smbolos que podran ser
construidos aplicando reglas de produccin para esas secuencias de smbolos, y podran en
casi todos los casos describir de manera precisa un lenguaje de programacin.
3
UAA Sistemas Electrnicos Compiladores Eduardo Serna-Prez
o Gramticas sin restricciones (Tipo-0), son capaces de generar todos los lenguajes
reconocidos por una maquina de Turing.
o Gramticas de contexto sensitivo (Tipo-1), son lenguajes capaces de ser reconocidos por
una maquina de Turing no determinista.
o Gramticas libres de contexto (Tipo-2), estos lenguajes son exactamente todos aquellos
lenguajes que pueden ser reconocidos por un autmata de pila no-determinstico. Las
gramticas libres de contexto son la base terica para la construccin de la sintaxis en la
mayora de los lenguajes de programacin.
o Gramticas regulares (Tipo-3), son exactamente todos los lenguajes que pueden ser
reconocidos por un autmata de estado finito. Esta familia de lenguajes formales puede ser
obtenida a partir de una expresin regular. Las expresiones regulares son comnmente
usadas para realizar la bsqueda de patrones en estructuras lxicas de lenguajes de
programacin.
A las expresiones regulares frecuentemente se les llaman patrones, ya que son expresiones
que describen a un conjunto de cadenas. Frecuentemente son usadas para dar una
descripcin concisa de un conjunto, sin tener que listar todos sus elementos.
4
UAA Sistemas Electrnicos Compiladores Eduardo Serna-Prez
ejemplo:
ejemplo:
S* = U S n
n =0 Donde Sn = S S es la concatenacin de S n veces (S0 = { }).
ejemplo:
Para evitar los parntesis se asume que la repeticin tiene la precedencia mas alta, luego la
concatenacin y al final la unin. Si no existiera ambigedad los parntesis pueden ser
omitidos . Por ejemplo , (ab)c se escribe como abc y a|(b(c*)) puede ser escrito como a|bc*.
De manera que los lenguajes regulares deben su nombre al hecho de que presentan
regularidades o repeticiones de los mismo componentes, como por ejemplo el lenguaje L1:
As pues, una expresin regular se construye a partir de expresiones regulares mas simples
utilizando un conjunto de reglas definitorias (operaciones bsicas). Cada expresin regular r
representa un lenguaje L(r). Las reglas de definicin especifican como se forma L(r)
combinando de varias maneras los lenguajes representados por las subexpresiones de r.
Se dice que un lenguaje designado por una expresin regular es un conjunto regular. Es
importante recordar que la especificacin de una expresin regular es un ejemplo de definicin
recursiva.
5
UAA Sistemas Electrnicos Compiladores Eduardo Serna-Prez
letra = a | b | c | | z | A | B | Z
digito = 0 | 1 | 2 | | 9
identificador = letra ( letra | digito )*
Los nmeros con signo son literales numricas constituidas por el punto decimal despus de
un digito y por una literal que represente la parte del exponente. Con esta informacin
desarrollamos las definiciones regulares y las expresiones regulares necesarias:
Esta definicin establece que fraccin es un punto decimal seguido de uno o mas dgitos, o
esta ausente. Un exponente, que es E seguido de un signo + - ausente, seguidos de uno o
mas dgitos, o la ausencia de exponente. Tome en cuanta que, como mnimo debe existir un
dgito despus del punto. De manera que numero concuerda con 1 y con 1.0.
Abreviaturas en la notacin
o Uno o mas casos el operador unitario postfijo + significa uno o mas casos de, de manera
+
que la expresin regular r que designa al lenguaje L(r), entonces r es una expresin que
+ +
designa al lenguaje L(r) . As la expresin regular a representa al conjunto de todas las
cadenas de una o mas a. El operador + tiene la misma precedencia que la repeticin, las
identidades algebraicas son r* = r | y r + = r r*.
o Cero o un caso el operado unitario postfijo ? significa cero o un caso de. La notacin r?
es la abreviatura de r | . Si r es una expresin regular, entonces (r)? es una expresin
regular que designa el lenguaje L(r) U { }.
o La primera establece que, cuando una cadena puede ser identificador o palabra clave, se
prefiere por lo general la interpretacin como palabra clave.
6
UAA Sistemas Electrnicos Compiladores Eduardo Serna-Prez
o La segunda establece que, cuando una cadena puede ser un token simple o una secuencia
de varios tokens, por lo comn se prefiere la interpretacin del token simple. Esta
preferencia se conoce a menudo como el principio de sub-cadena mas larga.
Una cuestin que surge en el principio de sub-cadena mas larga es lo referente a los
delimitadores de tokens, o caracteres que implican que una cadena mas larga en el punto
donde aparecen no pueden representar un token. Los caracteres que son parte no ambigua de
otros tokens son delimitadores. Por ejemplo xtemp=ytem, el signo de = sirve como delimitador
pues no forma parte de los identificadores. Los espacios en blanco, los retornos de lnea y los
caracteres de tabulacin generalmente se asumen como delimitadores de token.
if = if
else = else
oprelacion = < | <= | = | <> | > | >=
identificador = letra ( letra | digito )*
entero = ( + | )? digito+
real = ( + | )? digito+ ( . digito+ )? ( E ( + | )? digito+ )?
Para este fragmento de lenguaje, el analizador lxico reconocer las palabras clave if, else, al
igual que los lexemas representados por opRelacion, identificador, numero y delimitador.
7
UAA Sistemas Electrnicos Compiladores Eduardo Serna-Prez
El siguiente ejemplo nos muestra un autmata que reconoce cadenas de lenguaje para una
expresin regular ( a | b )* abb. El conjunto de estados del DFA es { 0, 1, 2, 3 } y el alfabeto de
smbolos de entrada es { a, b }. Se considera 0 como el estado de inicio, y 3 el estado de
aceptacin que esta indicado mediante un doble circulo. La siguiente funcin define dicho
autmata:
F = ({ 0, 1, 2, 3 }, { a, b }, T, 0, { 3 } )
Donde T es la tabla de transicin que refleja el patrn de la expresin regular que estamos
evaluando T ( si ,c ) = si+1 definida como:
Smbolos de entrada
Estado a b
0 1 0
1 1 2
2 1 3
3 1 0
La tabla de transicin tambin puede ser representada mediante un grafo de transicin, donde
cada nodo representa los posibles estados y las lneas reflejan el flujo de la transicin que
registran un cambio de un estado a otro en una coincidencia de carcter el estado 0 es
considerado el inicio de la transicin y el estado 3 (doble circulo) representa el fin de la
transicin o estado de aceptacin:
a a
a b b
0 1 2 3
a
b b
Justamente el autmata que se acaba de disear es capas de aceptar cadenas de entrada que
pertenezcan a la expresin regular dada anteriormente, es decir, { abb, aabb, babb, ababb,
baabb, aaabb, }. Cualquier cadena de entrada que no corresponda con dicho patrn ser
considerada como ajena al lenguaje, es decir, terminar en cualquier punto que no sea 3 (fin de
la transicin) es considerado como un posible error.
Igualmente es posible disear un algoritmo que realice exactamente las mismas operaciones
que el autmata dado anteriormente para la expresin regular ( a | b )* abb. As pues,
8
UAA Sistemas Electrnicos Compiladores Eduardo Serna-Prez
s = 0;
c = sigtecar( cadena );
while ( c != \0 ) {
case ( s ) {
0: s = ( c == b )? 0 : 1
1: s = ( c == b )? 2 : 1
2: s = ( c == b )? 3 : 1
3: s = ( c == b )? 0 : 1
}
c = sigtecar( cadena )
}
if ( s == 3 ) cadena valida
Dicho algoritmo es capas de evaluar una entrada de cadena y determinar si la misma forma
parte del patrn especificado por la expresin regular dada. Si el algoritmo llega a un fin de
cadena con un estado de aceptacin 3, quiere decir que dicha cadena es valida o concuerda
con el patrn.
Ahora estamos en posicin de poder construir autmatas mas elaborados partiendo de las
expresiones regulares ya definidas, por ejemplo, pensemos en la definicin regular para un
identificador que esta compuesta por la siguiente expresin regular letra ( letra | digito )*, para
este caso considerremos el conjunto de estados como 2 { 0, 1 }, el alfabeto de entrada estar
compuesto de las definiciones regulares letra y digito. El 0 es considerado como el inicio y 1
como el fin de la transicin.
letra
letra
0 1
digito
Bibliografa
Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios, tcnicas y herramientas,
capitulo 1, pginas: 1- 25, 743-747.
http://en.wikipedia.org/wiki/Compiler