You are on page 1of 9

Lenguajes y Autmatas 1

6.6 Generacin de matriz predictiva (Clculo, First y follow)

Una Gramtica LL1 es aquella gramtica que no tiene recursin izquierda y no tiene ambigedad, existen tcnicas para eliminar la recursin izquierda y con eso convertirla a una gramtica LL1 Cuando tienes una Gramtica LL1 entonces utilizas lo que denominas como First y Follow. Lo que haces es sacar con una serie de reglas (siguiendo un algoritmo) todos los first y follows de la gramtica.

Los First y Follows son significados para verificar y construir parsers 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....Yn es una produccin. a.FIRST(Y1) (es subconjunto de) FIRST(X) b.Si e (pertenece) FIRST(YK) (para todo) k< i FIRST(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)

Te pongo un ejemplo: -------------------------------------E -> TE E -> +TE | e T -> FT T -> *FT | e F -> (E) | id FIRST(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.

Predictivo se menciona porque los reconocedores son predicitivos, es decir si tu tienes un if, ya sabes que puedes o no tener un else y puedes tener reconocedores predictivos botton-up (de abajo hacia arriba), o top-down (de arriba hacia abajo). Pseudocdigo pues solamente es una serie de instrucciones para representar un algoritmo pero de una forma informal, es decir, no con un lenguaje de programacin. Commente se hacen en ingls y todas las reglas para sacar first, follows y tabla de smbolos te vienen en un pseudocdigo para que lo sigas y obtengas todo.

Finalmente, la notacin BNF es una forma de escribir las gramticas de una manera formal, te pongo un ejemplo de una sencilla: ---------------------------1. <nmero-decimal> ::= <entero-sin-signo> | <fraccin-decimal> | 2. <fraccin-decimal> ::= <entero-sin-signo> <fraccin-decimal> 3. <entero-sin-signo> ::= <dgito> | <dgito> <entero-sin-signo> 4. <dgito> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ------------------------------

You might also like