Vous êtes sur la page 1sur 16

Artculo cientfico

1

IMPLEMENTACIN DE LAS FASES LXICAS Y
SINTCTICAS DE UN TRADUCTOR.
Resumen- Este articulo nos habla de que
es un compilador o traductor, como
funciona y sus diferentes fases. Que
permiten la introduccin de un cdigo
fuente escrito en lenguaje humano,
traducido a lenguaje maquina
comprensible al computador.
Introduccin- Un traductor o compilador
es un programa que tiene como base
fundamental tomar datos de entrada
llamados cdigo fuente escrito por
programadores y como salida la
traduccin del mismo denominado
objeto que el computador es capaz de
entender. Este proceso de traduccin es
logrado mediante ciertas fases: (V.aho,
2008) (wikipedia, 2014)
. Anlisis Lxico.
. Anlisis Sintctico.
. Anlisis Semntico.
. Generador de Cdigo intermedio.
. Optimador de cdigo.
. Generador de Cdigo.
. Tabla de smbolos.
. Manejador de Errores.
En este artculo abordaremos las
primeras dos fases.
Desarrollo- Funcionamiento del Anlisis
Lxico: Lee los caracteres de entrada que
es el cdigo fuente. Los agrupa en
lexemas y produce como salida una
secuencia de token para cada lexema del
fuente el flujo de token se envan al
analizador sintctico interactuando con
la tabla de smbolos cuando en
analizador descubre un lexema que
constituye a un identificador debe ser
introducido tal lexema a la tabla de
smbolos una de estas tareas es eliminar
los comentarios y el espacio en blanco.
Otra de las funciones es correlacionar los
mensajes de error generados por el
compilador del cdigo fuente (wikipedia,
2014; V.aho, 2008)

Artculo cientfico
2

Tokens, Patrones y Lexemas.-Al hablar
de analizador lxicos hablamos de estos tres
trminos. (V.aho, 2008)
Token: Es un smbolo abstracto que
representa un tipo de unidad lxica; como
por ejemplo una palabra calve especifica o
una secuencia de caracteres de entrada que
denotan un identificador. (V.aho, 2008)
Patrones: Es una descripcin de la forma que
puede tomar los lexemas de un token en el
caso de palabras claves como token, el
patrn es solo la secuencia de caracteres que
forman la palabra clave. (V.aho, 2008)
Lexema: Es una secuencia de caracteres en
el cdigo fuente que coinciden con el
patrn para un token y que en analizador
lxico identifica como una instancia de ese
token. (V.aho, 2008)
Atributo para los Tokens.-Cuando ms de un
lexema puede coincidir con un patrn, el
analizador lxico debe proporcionar a las
subsiguientes fases del compilador
informacin adicional sobre el lexema
especfico que coincidi. Por ende, en
muchos casos el analizador lxico devuelve
al analizador sintctico no solo el nombre de
un token, sino un valor de atributo que
describe al lexema que representa a ese
token; el nombre del token influye en las
traducciones de los tokens despus del
anlisis sintctico. (V.aho, 2008)
Errores Lxicos.-Sin la ayuda de los dems
componentes es difcil para un analizador
lxico saber que hay un error en el cdigo
fuente. Por ejemplo si la cadena fi un
analizador lxico no puede saber si fi si es
una palabra reservada if mal escrita, o un
identificador de una funcin no declarada.
Como fi es un lexema valido para el token
id, el analizador lxico debe regresar el
token id al analizador sintctico y dejar que
alguna otra fase del compilador mande un
error debido a la transposicin de las letras.
(V.aho, 2008)
La estrategia de recuperacin ms simple es
la recuperacin en modo de pnico.
Eliminamos caracteres sucesivos del resto de
la entrada, hasta que el analizador lxico
pueda encontrar un token bien formado al
principio de lo haya quedado de entrada.
Esta tcnica puede confundir al analizador
sintctico. (V.aho, 2008)
Existen otras tcnicas de recuperacin de
errores:
. Eliminar un carcter del resto de la
entrada
. Insertar un carcter faltante en el resto
de la entrada.
. Sustituir un carcter por otro.
. Transponer dos caracteres adyacentes.

Uso de bfer en la entrada.-Antes de hablar
del problema de reconocer lexemas en la
entrada, examinaremos algunas formas de
agilizarse la tarea de leer el cdigo fuente.
Esta tarea se dificulta debido a que a
menudo tenemos que buscar uno o ms
caracteres ms all del siguiente lexema para
estar seguro de que tenemos el lexema
correcto. (V.aho, 2008)

Pares de bferes.-Debido al tiempo
requerido para procesar caracteres y al
extenso nmero de caracteres que se deben
procesar durante la compilacin de un
cdigo fuente extensa, se han desarrollado
tcnicas especializadas de uso de bfer para
Artculo cientfico
3

reducir la cantidad de sobrecarga requerida
en el proceso de un solo carcter de
entrada.


Centinelas.-Por cada lectura de caracteres
hacemos dos pruebas: una para el final del
bfer y la otra para determinar qu carcter
se lee. Podemos cambiar la prueba del final
del bfer con la prueba del carcter si
extendemos cada bfer para que contenga
un valor centinela al final. El centinela es un
carcter especial que no puede formar parte
del cdigo fuente, para lo cual una opcin
natural es el carcter eof. (V.aho, 2008)

Especificacin de los tokens.-Las
expresiones regulares son una notacin
importante para especificar patrones de
lexemas. Aunque no pueden expresar todos
los patrones posibles, son muy efectivos para
expresar los tipos de patrones que en
realidad necesitamos para los tokens. (V.aho,
2008)

Cadenas y lenguajes.-Un alfabeto es un
conjunto finito de smbolos. Entre ellos
tenemos las letras, dgitos, y los signos de
puntuacin. (V.aho, 2008)
Cadena.- sobre un alfabeto es una secuencia
finita de smbolos que se extrae de ese
alfabeto. En la teora de lenguajes, los
trminos oracin y palabra se utilizan
como sinnimo de cadena. La longitud de
una cadena s, es el nmero de ocurrencias
de smbolos en s. La palabra banana es una
cadena con longitud de seis y la cadena
vaca representada por , es la cadena de
longitud cero. (V.aho, 2008)

Lenguaje.- Es cualquier conjunto contable
de cadenas sobre algn alfabeto fijo.
Operaciones con los lenguajes.- En el
anlisis lxico, las operaciones ms
importantes en los lenguajes son la unin, la
concatenacin y la cerradura las cuales se
definen de manera formal. La unin es la
operacin familiar que se hace con los
conjuntos, la concatenacin de lenguaje es
cuando se concatenan todas las cadenas que
se forman al tomar una cadena del primer
lenguaje y una cadena del segundo lenguaje,
en todas las formas posibles. La cerradura
(Kleene) de un lenguaje L, que se denota por
L
*
, es el conjunto de cadenas que se
obtienen al concatenar L cero o ms veces.
(V.aho, 2008)

Expresiones regulares.-Este proceso es tan
til que se ha empezado a utilizar
comnmente una notacin conocida como
expresiones regulares, para describir a todos
los lenguajes que pueden construirse a partir
de estos operadores, aplicado a los smbolos
de cierto alfabeto. (V.aho, 2008)

La barra significa la unin, los parntesis se
utilizan para agrupar las subexpresiones, el
asterisco significa cero o ms ocurrencias
de, y la yuxtaposicin letra_ con el resto
de la expresin indica la concatenacin.

Las expresiones regulares se construyen de
forma recursiva a partir de las expresiones
ms pequeas, usando las siguientes reglas:
cada expresin regular r denota un
lenguaje L(r), el cual tambin se define de
forma recursiva, a partir de los lenguajes
denotados por las subexpresiones de r.
(V.aho, 2008)

Artculo cientfico
4

Definiciones regulares.-Es conveniente
poner nombres a ciertas expresiones
regulares, y utilizarlo en las expresiones
subsiguientes como si los nombres fueran
smbolos por s mismo.

Extensiones de las expresiones regulares.-
Se han agregado muchas extensiones para
mejorar su habilidad al especificar los
patrones de cadenas tales como:
. Cero o ms instancias. El operador unario
posfijo *.
. Una o ms instancias. El operador unario
posfijo +.
. Cero o una instancia. El operador unario
pos fijo ?.
. Clases de caracteres. Una expresin
regular a
1
|a
2
|.|a
n

Reconocimiento de token.- Toma los
patrones para todos los tokens necesarios y
construir una pieza de cdigo para examinar
la cadena de entrada y buscar un prefijo
que sea un lexema que coincida con uno de
esos patrones.

Las terminales de la gramtica, que son if,
then, else, oprel, id y numero, son los
nombres de los token en los que el
analizador lxico. Los patrones de estos
tokens se definen mediante expresiones
regulares.

Diagrama de transicin de estado.- Como
paso intermedio en la construccin de un
analizador lxico, primero convertiremos los
patrones en diagramas de flujos estilizados, a
los cuales se les llama Diagrama de
transicin de estados. Las lneas se dirigen
de un estado a otro del diagrama de
transicin de estados. Cada lnea se etiqueta
mediante un smbolo o conjunto de smbolo.
Algunas conversiones importantes de los
diagramas de transicin son:
. Se dice que ciertos estados son de
aceptacin o finales.
. Si es necesario retroceder el apuntador
avance una posicin, entonces deberemos
colocar de manera adicional * cerca del
estado de aceptacin.
. Un estado se designa como el estado
inicial; esto se indica mediante una lnea
etiquetada como inicio, que no proviene
de ninguna parte.

Reconocimiento de las palabras calves y de
los identificadores.-El reconocimiento de
estos elementos presenta un problema. Por
lo general, las palabras claves como if o then
son reservadas, por lo que no son
identificadores, aun cuando lo parecen. Por
tal razn se usa un diagrama de transicin de
estados.

Hay dos formas en las que podemos manejar
las palabras reservadas que parecen
identificadores:
. Instalar las palabras reservadas en la tabla
de smbolos desde el principio. Un campo de
la entrada de la tabla de smbolos indica que
estas cadenas nunca sern identificadoras
ordinarios, y nos dice que token representan.
Artculo cientfico
5

. Crea diagramas de transicin de estados
separados para cada palabra clave.

Arquitectura de un analizador lxico basado
en diagramas de transicin de estado.- Hay
varias formas en las que se pueden utilizarse
los diagramas de transicin de estados para
construir un analizador lxico. Sin importar la
estrategia general, cada estado se
representa mediante una lnea de cdigo. A
menudo, el cdigo para un estado, es en si
una instruccin switch o una bifurcacin de
varias vas que determina el siguiente estado
mediante el proceso de leer y examinar el
siguiente carcter de entrada.

El generador de anlisis lxico lex o flex.-
Es un implementacin ms reciente, que nos
permite especificar un analizador lxico
mediante la especificacin de expresiones
regulares para describir patrones de tokens.
La notacin de entrada para la herramienta
lex se conoce como el lenguaje lex y la
herramienta en si es el compilador lex.

Uso del lex.- Un archivo de entrada que
llamaremos lex.1, est escrito en lenguaje lex
y describe el analizador lxico que se va a
generar el compilador lex transforma a lex.1
en un programa en C.


Estructura de programas en lex.- Un
programa en lex tiene la siguiente forma:


Autmatas finitos.- Ahora vanos a descubrir
como lex convierte un programa de entrada
en un analizador lxico.
. Los autmatas finitos son reconocidos;
solo dicen si o no en relacin con cada
posible cadena de entrada.
. Los autmatas finitos pueden ser de dos
tipos:
1. Autmatas finitos no
deterministas (AFND).
2. Autmatas finitos
deterministas (AFD).
Ambos autmatas son capases de reconocer
los mismos lenguajes.

Tabla de transicin.- Podemos representar
un AFN mediante una tabla de transicin,
cuyas filas corresponden a los estados, y
cuyas columnas corresponden a los smbolos
de entrada y a .


Aceptacin de las cadenas de entrada
mediante los autmatas.- Un AFN acepta la
cadena x si, y solo si hay algn camino en
el grfico de transicin, desde el estado final
hasta uno de los estados de aceptacin, de
forma que los smbolos a lo largo del camino
deletreen a x.
Artculo cientfico
6

Conversin de un AFN a AFD.- La idea de la
construccin de subconjuntos es que cada
estado del AFD construido corresponde a
un conjunto de estados del AFN. Es posible
que el nmero de estados del AFD sea
exponencial al nmero de estados del AFN,
lo cual podra provocar dificultades al tratar
de implementar este AFD.

Simulacin de un AFN.- Una estrategia que
se utiliza es la construccin de un AFN a
partir de una expresin regular, y despus
simular el AFN utilizando la construccin de
subconjuntos sobre la marcha.

Introduccin.- En esta seccin
examinaremos la forma en que un
analizador sintctico se acomoda en un
compilador ordinario. (V.aho, 2008)

Anlisis Sintctico: utiliza los primeros
componentes de los token producido por
el analizador lxico para crear una
representacin interna en forma de rbol
que describa la estructura gramatical del
flujo de token. (V.aho, 2008)
Funcin de un analizador sintctico.- El
analizador sintctico obtiene una cadena
de tokens del analizador lxico, y verifica
que la cadena de nombres de los tokens
pueda generarse mediante la gramtica
para el lenguaje fuente. Esperando que
el analizador sintctico reporte cualquier
error en forma inteligible y que se
recupere de los errores que ocurren con
frecuencia para seguir procesando el
resto del cdigo fuente. (V.aho, 2008)

Existen tres tipos de analizadores para las
gramticas: Universales, descendentes y
ascendentes. (V.aho, 2008)
Los mtodos universales de anlisis
sintctico son demasiados ineficientes
como para usarse en la produccin de
compiladores. (V.aho, 2008)
Los mtodos que se utilizan, por lo
general, en compiladores pueden
clasificarse como: descendentes o
ascendentes. Segn sus nombres, los
mtodos descendentes construyen
arboles de anlisis sintctico de la parte
superior (raz) a la parte inferior (hojas),
mientras que los mtodos ascendentes
empiezan de las hojas y avanza hasta la
raz. En cualquier caso, la entrada al
analizador se explora de izquierda a
derecha, un smbolo a la vez. (V.aho,
2008)
Representacin de la gramtica LL y LR.-
La asociatividad y precedencia se
resuelven en la siguiente gramtica para
describir expresiones, trminos y
factores. E representa a las
expresiones que consiste en trminos
separados por los signos +, T
representa a los trminos que consisten
en factores separados por los signos *,
y F representa a los factores que
Artculo cientfico
7

pueden ser expresiones entre parntesis
o identificadores:
Recursiva por la izquierda.
La gramtica LR es adecuada para el
anlisis sintctico ascendente. Esta
gramtica puede adaptarse para manejar
operadores adicionales y niveles
adicionales de presencia. Sin embargo no
puede usarse para el anlisis sintctico
descendente, ya que es recursiva por la
izquierda. (V.aho, 2008)
La siguiente gramtica no recursiva se
utiliza para el anlisis sintctico
descendente:

Manejo de los errores sintcticos.-
Recuperacin en modo de pnico y a
nivel de frases son algunas de estas
estrategias.
Los errores de programacin comunes
pueden ocurrir en muchos niveles
distintos.
. Errores lxicos: incluyen la escritura
incorrecta de los identificadores, las
palabras clave o los operadores; el uso
de un identificador tamanioElipce en vez
de tamanioElipse, y la omisin de
comillas alrededor del texto que se debe
interpretar como una cadena.
. Errores sintcticos: incluyen la
colocacin de los signos de punto y
coma, adems de llaves adicionales o
faltantes; es decir, ,o-.
. Errores semnticos: incluyen los
conflictos de tipos entre los operadores y
los operando.
. Errores lgicos: pueden ser cualquier
cosa, desde un razonamiento incorrecto
del programador en el uso del operador
de asignacin =, en vez del operador de
comparacin ==.
La precisin de los mtodos de anlisis
sintctico permite detectar los errores
sintcticos con mucha eficiencia.
Estrategia para recuperarse de los
errores.- Una vez que se detecte un error
Cmo debe recuperarse el analizador
lxico? Aunque no hay una estrategia
que haya demostrado ser aceptable en
forma universal, algunos mtodos
pueden aplicarse en muchas situaciones.
El mtodo ms simple es que el
analizador sintctico termine con un
mensaje de error informativo cuando
detecte el primer error. A menudo se
descubren errores adicionales si el
analizador sintctico puede restaurarse a
s mismo, a un estado en el que pueda
continuar el procesamiento de la
entrada, con esperanzas razonables de
que un mayor procesamiento
Artculo cientfico
8

proporcione informacin til para el
diagnstico.
Recuperacin en modo de pnico.- Con
este mtodo, al describir un error el
analizador sintctico descarta los
smbolos de entrada, uno a la vez, hasta
encontrar un conjunto designado de
tokens de sincronizacin.
Recuperacin a niveles de frases.- Al
descubrir un error, un analizador
sintctico puede realizar una correccin
local sobre la entrada restante; es decir,
puede sustituir un prefijo de la entrada
restante por alguna cadena que le
permita continuar.
La sustitucin a nivel de frase se ha
utilizado en varios compiladores que
reparan los errores, ya que puede
corregir cualquier cadena de entrada.
Producciones de errores.- Al anticipar los
errores comunes que se podran generar,
podemos aumentar la gramtica para el
lenguaje, con producciones que generen
las construcciones errneas.
Correcciones globales.- La idea sera que
un compilador hiciera la menor cantidad
de cambios en el procesamiento de una
cadena de entrada incorrecta. Existen
algoritmos para elegir una secuencia
mnima de cambios, para obtener una
correccin con el menor costo a nivel
global.
Gramticas libres de contexto.- Si
utilizamos una variable sintctica instr
para denotar las instrucciones, y una
variable expr para denotar las
expresiones:

Especifica la estructura de esta forma de
instruccin condicional.
Definicin formal de una gramtica libre
de contexto.- Consiste en terminales, no
terminales, smbolo inicial y
producciones.
. Terminales: son los smbolos bsicos a
partir de los cuales se forman las
cadenas.
. No terminales: son variables
sintcticas que denotan conjuntos de
cadenas.
. En una gramtica, un no terminal se
distingue como el smbolo inicial, el
conjunto de cadenas que denota es el
lenguaje generado por la gramtica.
. Las producciones de una gramtica
especifican la forma en que pueden
combinarse los terminales y los no
terminales para formar cadenas. Cada
produccin consiste en:
.Un no terminal, conocido
como encabezado o lado izquierdo de la
produccin; esta produccin define
algunas de las cadenas denotadas por el
encabezado.
. El smbolo. Algunas veces se
ha utilizado ::= en vez de la flecha.
Artculo cientfico
9

.Un cuerpo o lado derecho, que
consiste en cero o ms terminales y no
terminales.
Conversin de notacin.- Para evitar
tener que decir que estos son los
terminales, estos son los no
terminales, etc. Utilizamos las siguientes
conversiones de notacin para la
gramtica.
. Smbolos terminales:
Las primeras letras minsculas del
alfabeto tales como: a, b, c
Los smbolos de operadores: +, *, etc.
Los smbolos de puntuacin:
parntesis, coma, etc.
Los dgitos: 0,1.9.
Las cadenas en negrita como id o if,
cada una de las cuales representan un
solo smbolo terminal.
.Smbolos no terminales:
Las primeras letras maysculas del
alfabeto: A, B, C.
La letra S que, al aparecer es, por lo
general, el smbolo inicial.
Los nombres en cursiva y minsculas,
como: expr o instr.
Al hablar de las construcciones de
programacin, las letras maysculas
pueden utilizarse para representar no
terminales.
Las ultimas letras maysculas del
alfabeto: X, Y, Z, representan smbolos
gramaticales; es decir, pueden ser no
terminales o terminales.
Las ultimas letras minsculas del
alfabeto: x, y, z, representan cadenas de
terminales posiblemente vacas.
Las letras griegas minsculas: , , ,
representen cadenas de smbolos
gramaticales.
Un conjunto de producciones A->
1,
A-
>
2,
A->
k
, con un encabezado comn A,
puede escribirse como: A->
1
|
2
|...|
k,
las cuales les llamamos las alternativas
para A.
A menos que se indique lo contrario, el
encabezado de la primera produccin es
el smbolo inicial.
Derivaciones.- La construccin de un
rbol de anlisis sintctico puede hacerse
precisa si tomamos una vista
derivacional, en la cual las producciones
se tratan como reglas de reescritura.
Empezando con el smbolo inicial, cada
paso de reescritura sustituye a un no
terminal por el cuerpo de una de sus
producciones. Como veremos, el anlisis
sintctico ascendente se relaciona con
una clase de derivaciones conocidas
como derivaciones de ms a la
derecha, en donde el no terminal por la
derecha se reescribe en cada paso.

Artculo cientfico
10

La produccin E-> -E significa que si E
denota una expresin, entonces E debe
tambin denotar una expresin:

Lo cual se lee E deriva a E. En forma
general, considere un no terminal A en la
mitad de una secuencia de smbolos
gramaticales, como en A, en donde y
son cadenas arbitrarias de smbolos
gramaticales.
Arboles de anlisis sintctico y
derivaciones.- Un rbol de anlisis
sintctico es una representacin grfica
de una derivacin que filtra el orden en
el que se aplican las producciones para
sustituir los no terminales. Cada nodo
interior de un rbol sintctico representa
la aplicacin de una produccin. El nodo
interior se etiqueta con el nodo terminal
A en el encabezado de la produccin; los
hijos del nodo se etiquetan, de izquierda
a derecha, mediante los smbolos en el
cuerpo de la produccin por la que se
sustituy esta A durante la derivacin.

Ambigedad.- Una gramtica que
produce ms de un rbol de anlisis
sintctico para cierto enunciado es
ambigua. Es decir una gramtica es
ambigua que produce ms de una
derivacin por la izquierda, o ms de una
derivacin por la derecha para el mismo
enunciado. (V.aho, 2008)


Verificacin del lenguaje generado por
una gramtica.- Aunque los diseadores
de compiladores muy raras veces lo
hacen para una gramtica de lenguaje de
programacin completa, es til poder
razonar que un conjunto dado de
producciones genera un lenguaje
especfico. (V.aho, 2008)
Comparacin entre gramtica libres de
contexto y expresiones regulares.- Las
gramticas son una notacin ms
poderosa que las expresiones regulares.
Cada construccin que puede describirse
mediante una expresin regular pude
describirse mediante una gramtica,
pero no al revs. De manera alternativa,
cada lenguaje regular es un lenguaje libre
de contexto, pero no al revs. (V.aho,
2008)
Estructura de una gramtica.- Las
gramticas son capaces de describir casi
Artculo cientfico
11

la mayora de las sintaxis de los lenguajes
de programacin. Por ejemplo, el
requerimiento de que los identificadores
deben declararse antes de usarse, no
puede describirse mediante una
gramtica libre de contexto. Por lo tanto,
las secuencias de los tokens que acepta
un analizador sintctico forman un supe
conjunto de lenguaje de programacin;
Las fases siguientes del compilador
deben analizar la salida del analizador
sintctico, para asegurar que cumpla con
las reglas que no verifica el analizador
sintctico.
Comparacin entre anlisis lxico y
anlisis sintctico.- hay que preguntarse
Por qu usar expresiones regulares para
definir la sintaxis lxica de un lenguaje?
Existen varias razones:
Al separar la estructura sintctica de
un lenguaje en partes lxicas y no lxicas,
se proporciona una manera conveniente
de colocar en mdulos la interfaz de
usuarios de un compilador en dos
componentes de un tamao manejable.
Las reglas lxicas de un lenguaje son
con frecuencia bastante simples, y para
describirlas no necesitamos una notacin
tan poderosa como las gramticas.
Por lo general, las expresiones
regulares proporcionan una notacin
ms concisa y fcil de entender para los
tokens, en comparacin con las
gramticas.
Pueden construirse analizadores
lxicos ms eficientes en forma
automticas a partir de expresiones
regulares, en comparacin con las
gramticas arbitrarias.
Eliminacin de la ambigedad.- Algunas
veces, una gramtica ambigua puede
reescribirse para eliminar la ambigedad.

Eliminacin de la recursividad por la
izquierda.- Una gramtica es recursiva
por la izquierda si tiene una terminal A
tal que haya una derivacin A-
+
> A para
cierta cadena . Los mtodos de anlisis
sintctico descendente no pueden
manejar las gramticas recursivas por la
izquierda, por lo que se necesita una
transformacin para eliminar la
recursividad por la izquierda.

La recursividad inmediata por la
izquierda puede eliminarse mediante la
Artculo cientfico
12

siguiente tcnica, que funciona para
cualquier nmero de producciones A. se
agrupan las producciones de la siguiente
manera:

En donde ninguna
i
termina con una A.
despus, se sustituye las producciones A
mediante lo siguiente:

El no terminal A genera las mismas
cadenas que antes, pero ya no es
recursiva por la izquierda. Este
procedimiento elimina toda la
recursividad por la izquierda de las
producciones A y A, pero no elimina la
recursividad por la izquierda que incluye
a las derivaciones de dos o ms pasos:

El no terminal S es recursiva por la
izquierda, ya que S -> Aa -> Sda, pero no
es inmediatamente recursiva por la
izquierda.
Algoritmo de eliminacin de
recursividad por la izquierda.-
Entada- La gramtica G sin ciclos ni
producciones .
Salida- Una gramtica equivalente sin
recursividad por la izquierda.
Mtodo- Aplicando el siguiente
algoritmo:

Factorizacin por la izquierda.- La
factorizacin por la izquierda es una
transformacin gramatical, til para
producir una gramtica adecuada para el
anlisis sintctico predictivo, o
descendente. Cuando la eleccin entre
dos producciones A alternativas no est
clara, tal vez podamos reescribir las
producciones para diferir la decisin
hasta haber visto la suficiente entrada
como para poder realizar la eleccin
correcta. (V.aho, 2008)
Ejemplo:

Al ver la entrada if, no podemos saber de
inmediato que produccin elegir para
expandir instr. Si se factorizan por la
izquierda, las producciones originales se
convierten en:

Artculo cientfico
13

Algoritmo factorizacin por la
izquierda.-
Entrada.-Gramtica G.
Salida.- Una gramtica equivalente
factorizada por la izquierda.
Metido.- Para cada no terminal A,
encontrar el prefijo ms largo que sea
comn para una o ms de sus
alternativas. Si , se sustituyen todas
las producciones A, A->
1
|
2
||

n
| , en donde representa a todas las
alternativas que no empiezan con ,
mediante lo siguiente:

Aqu A es un no terminal nuevo. Se
aplica esta transformacin en forma
repetida hasta que no haya dos
alternativas para un no terminal que
tenga un prefijo comn.
Construccin de lenguajes que no son
libres de contexto.- Algunas
construcciones sintcticas que se
encuentran en los lenguajes de
programacin ordinarios no pueden
especificarse solo mediante el uso de
gramticas.
Anlisis sintctico descendente.- Puede
verse como el problema de construir un
rbol de anlisis sintctico para la cadena
de entrada, partiendo desde la raz y
creando los nodos del rbol en pre
orden. De manera equivalente, podemos
considerar el anlisis sintctico
descendente como la bsqueda de una
derivacin por la izquierda para una
cadena de entrada.





Algoritmo de anlisis sintctico de
descenso recursivo.-

Artculo cientfico
14

Primero y Siguiente.- La construccin de
los analizadores sintcticos descendentes
y ascendentes es auxiliada por dos
funciones, PRIMERO y SIGUIENTE,
asociadas con la gramtica G. durante el
anlisis sintctico descendente, primero
y siguiente nos permite elegir la
produccin que vamos a aplicar, con
base en el siguiente smbolo de entrada.
Durante la recuperacin de errores en
modo de pnico, los conjuntos de tokens
que producen siguiente pueden usarse
como tokens de sincronizacin.
Definimos a Primero (), en donde es
cualquier cadena de smbolos
gramaticales, como el conjunto de
terminales que empiezan las cadenas
derivadas a partir de .
Para una vista previa de cmo usar
PRIMERO durante el anlisis sintctico
predictivo, considere dos producciones
A, A -> |, en donde PRIMERO () y
PRIMERO () son conjuntos.





Gramticas LL (1).- Los analizadores
sintcticos predictivos, es decir, los
analizadores sintcticos de descenso
recursivo que no necesitan rastreo hacia
atrs, pueden construirse para una clase
de gramticas llamadas LL(1). La primera
L es para explorar la entrada de
izquierda a derecha, la segunda L es
para producir una derivacin por la
izquierda, y el 1 para usar un smbolo
de entrada de anticipacin en cada paso,
para tomar las decisiones de accin del
anlisis sintctico.
La clase de gramticas LL (1) es lo
bastante robusta como para cubrir la
mayora de las construcciones de
programacin, aunque hay tener cuidado
al escribir una gramtica adecuada para
el cdigo fuente.
Una gramtica G es LL (1) si, y solo si
cada vez que A -> | son dos
producciones distintas de G, se aplican
las siguientes condiciones:
Para el no terminal a, tanto como
derivan cadenas que empiezan con a.
A lo ms, solo o pueden derivar la
cadena vaca.
Si ->
*
, entonces no deriva a
ninguna cadena que empiece con una
terminal en SIGUIENTE (A). De igual
forma, si -
*
> , entonces no deriva a
ninguna cadena que empiece con una
terminal en SIGUIENTE(A).
Algoritmo construccin de tabla.-
Artculo cientfico
15

Entrada.- La gramtica G.
Salida.- La tabla de anlisis sintctico M.
Mtodo.- Para cada produccin A -> de
la gramtica, hacer lo siguiente:
Para cada terminal a en PRIMERO(A),
agregar A -> a M *A, a+.
Si est en PRIMERO (), entonces
para cada terminal b en SIGUIENTE(A), se
agrega A -> a M *A, b+. Si est en
PRIMERO () y $ se encuentra en
SIGUIENTE(A), se agrega A -> a M *A,$+
tambin.


Conclusiones.- Podemos concluir que
todas las fases descritas en este
documento son fundamentales para el
aprendizaje del diseo de compiladores
en sus diferentes plataformas de
programacin que pueda dominar un
determinado programador.
Datos del autor.-
Estudia: Universidad Nacional Autnoma
de Nicaragua (UNAN-MANAGUA).
Carrera: Lic. Ciencias de la Computacin.
Nombre: Donis Santiago Montoya
Poveda.
E-mail: quienquiero@gmail.com
Bibliografa.-
Bibliografa
V.aho, A. (2008). Compiloadores. mexico:
pearson educacion.
wikipedia. (26 de 6 de 2014).
http://es.wikipedia.org/. Recuperado
el 26 de 6 de 2014, de
http://es.wikipedia.org/:
http://es.wikipedia.org/wiki/Compila
dor














Artculo cientfico
16

Vous aimerez peut-être aussi