You are on page 1of 6

Generacin de matriz predictiva (clculo first y follow)

FIRST: Sea G := (V; ; Q0; P) una gramtica libre de contexto. Para cada
forma sentencial (V U )* y para cada k N definiremos la funcin.


En otras palabras, el operador F IRST k asocia a cada forma sentencia los
primeros k smbolos de cualquier forma terminal alcanzable desde mediante
derivaciones masa la izquierda".

FOLLOW: Con las mismas notaciones anteriores, para cada forma sentencia
(V U )* definiremos la funcin FOLLOWG GK () del modo siguiente.

De nuevo nos ocuparemos solamente de FOLLOW: = FOLLOW1. Obsrvese
que FOLLOW k () * y que para cada x FOLLOW (), Ixl k. Obsrvese
que para cada variable A V, FOLLOW(A) son todos los smbolos terminales
que pueden aparecer a la derecha de A en alguna forma sentencia de la
gramtica.
Los First y Follows son significados para verificar y construir pares predictivos, son un
conjunto de tokens que se encuentran en el tope de la pila.
Pseudocdigo y algoritmo para calcular los First de una gramtica:
-------------------------------
1.-Si X es un terminal FIRST (X) = {X}
2.-Si X -> e es una produccin e (pertenece) FIRST(X)
3.-Si X -> Y1Y2....Y n es una produccin.
a . FIRST (Y1) (es subconjunto de) FIRST(X)
b. Si e (pertenece) FIRST (YK) (para todo) k< iFIRST(Yi)
(es subconjunto de) FIRST(X)
c.Si e (pertenece) FIRST(YK) (para todo) I n e (pertenece a) FIRST(X) Nota (a,
b y c pertenecen al paso 3 y solo se toma uno dependiendo el caso)

Algoritmo para calcular los follows:
1.-Si S es el axioma $ (pertenece) FOLLOW(S)
2.-Si A- > B es una produccin
FIRST()- { e } (es subconjunto de) FOLLOW(S)
1.- Si hay una produccin A -> B o A-> B
Con e (pertenece) FIRST()
FOLLOW(A) (es subconjunto de) FOLLOW(B)

EJEMPLO:
E -> TE
E-> +TE | e
T -> FT
T-> *FT | e
F -> (E) | idFIRST(E) = FIRST(T) = FIRST(F) = {(, id}.
FIRST(E) = {+, e }
FIRST(T) = {*, e }
FOLLOW(E) = FOLLOW(E) = {), $}
FOLLOW(T) = FOLLOW(T) = {+,), $}
FOLLOW(F) = {+,*,), $}

Una vez que tienes los first y follows entonces puedes crear una tabla de smbolos y con
ella puedes construir un compilador que te reconozca y la sintaxis de las instrucciones
son correctas o no con las reglas de tu lenguaje definido en la gramtica. Se utiliza Flex
y Bison para poder hacer los reconocedores lxicos y sintcticos, insertndolos en
programas en C para que generes las reglas provenientes de tus tablas y finalmente
hacer tu compilador.

Errores lxicos tpicos son:
Nombre ilegales de identificadores: un nombre contiene caracteres invlidos.
Nmeros incorrectos: Un numero contiene caracteres invlidos o no est formado
correctamente, por ejemplo 3,14 en vez de 3.14 o 0.3.14.
Errores de ortografa en palabras reservadas: caracteres omitidos, adicionales o
cambiados de sitio, por ejemplo la palabra while en vez de hwile.
Fin de archivo: se detecta un fin de archivo a la mitad de un componente lxico.

Manejo de errores.

Un compilador es un sistema que en la mayora de
los casos tiene que manejar una entrada incorrecta.
Sobre todo en las primeras etapas de la creacin de
un programa, es probable que el compilador se
utiliza para efectuar las caractersticas que debera
proporcionar un buen sistema de edicin dirigido por
la sintaxis, es decir, para determinar si las variables
han sido declaradas antes de usarla, o si faltan
corchetes o algo as.

Por lo tanto, el manejo de errores es parte
importante de un compilador y el escritor del
compilador siempre debe tener esto presente
durante su diseo.

Hay que sealar que los posibles errores ya deben
estar considerados al disear un lenguaje de
programacin. Por ejemplo, considerar si cada
proposicin del lenguaje de programacin comienza
con una palabra clave diferente (excepto la
proposicin de asignacin, por supuesto). Sin
embargo, es indispensable lo siguiente:

El compilador debe ser capaz de detectar errores en
la entrada;
El compilador debe recuperarse de los errores
sin perder demasiada informacin;
Y sobre todo, el compilador debe producir un
mensaje de error que permita al programador
encontrar y corregir fcilmente los elementos
(sintcticamente) incorrectos de su programa.
Errores Sintcticos.

Muchos errores de naturaleza sintctica
Recuperacin: Al producirse un error el compilador
debe ser capaz de informar del error y seguir
compilando. (Ideal).

El manejo de errores de sintaxis es el ms
complicado desde el punto de vista de la creacin de
compiladores. Nos interesa que cuando el
compilador encuentre un error, se recupere y siga
buscando errores. Por lo tanto el manejador de
errores de un analizador sintctico debe tener como
objetivos:
Indicar los errores de forma clara y precisa.
Aclarar el tipo de error y su localizacin.
Recuperarse del error, para poder seguir
examinando la entrada.
No ralentizar significativamente la compilacin.
Un buen compilador debe hacerse siempre teniendo
tambin en mente los errores que se pueden
producir; con ello se consigue:
Simplificar la estructura del compilador.
Mejorar la respuesta ante los errores.
Errores semnticos.
Un lenguaje con comprobacin fuerte de tipos es
capaz de garantizar que los programas se pueden
ejecutar sin errores de tipo, por lo que los errores de
tipo se detectarn siempre en tiempo de
compilacin.
Como mnimo, ante un error, un comprobador de
tipos debe informar de la naturaleza y posicin del
error y recuperarse para continuar con la
comprobacin del resto del programa a analizar.

Veamos algunas de las operaciones a tener en
cuenta en una comprobacin de tipos:
Conversin de tipos: A veces es necesario
transformar el tipo de una expresin para utilizar
correctamente un operador o para pasar de
forma adecuada un parmetro a una funcin.
Coercin: Es una conversin de tipos que
realiza de forma implcita el propio compilador.
Si es el programador el que realiza la
conversin se tratar entonces de una
conversin explcita.
Sobrecarga de operadores: La sobrecarga se
resuelve determinando el tipo de cada una de
las expresiones intervinientes en la sobrecarga.
Funciones polimrficas: Son aquellas que
trabajan con argumentos cuyo tipo puede
cambiaren distintas llamadas a la funcin.