4-5_LL(K)

15
El Problema Cálculo del FIRST FOLLOW Las Gramáticas LL Gramáticas con Parsing Eficiente Universidad de Cantabria Gramáticas LL

description

Universidad de Cantabria - CURSO de TEORIA DE AUTOMATAS

Transcript of 4-5_LL(K)

  • El ProblemaClculo del FIRST

    FOLLOW

    Las Gramticas LLGramticas con Parsing Eficiente

    Universidad de Cantabria

    Gramticas LL

  • El ProblemaClculo del FIRST

    FOLLOW

    Outline

    1 El Problema

    2 Clculo del FIRST

    3 FOLLOW

    Gramticas LL

  • El ProblemaClculo del FIRST

    FOLLOW

    El Problema

    Hemos visto que es posible hallar un rbol de derivacin dadauna gramtica libre de contexto. Para ello,

    Se transforma en una gramtica en forma normal deChomsky.Se aplica el algoritmo CYK con la funcin gen().

    Gramticas LL

  • El ProblemaClculo del FIRST

    FOLLOW

    El Problema

    Este algoritmo es ineficiente, nos gustara que el algoritmofuera lineal en el tamao de la entrada. Nos decantaremos porla estrategia descendente, es decir asumiremos que la palabraesta en el lenguaje.

    Gramticas LL

  • El ProblemaClculo del FIRST

    FOLLOW

    El Problema

    Introduciremos varios conceptos que sern necesarios paradefinir los autmatas con pila deterministas que aceptaranestos lenguajes.

    Gramticas LL

  • El ProblemaClculo del FIRST

    FOLLOW

    FIRST

    DefinicinSea G := (V ,,Q0,P) una gramtica libre de contexto. Paracada forma sentencial (V ) y para cada k Ndefiniremos la funcin

    FIRST Gk () := {x :|x | = k , `Glm x|x | < k `Glm x

    }.

    Omitiremos el superndice G siempre que su presencia seainnecesaria por el contexto.

    Gramticas LL

  • El ProblemaClculo del FIRST

    FOLLOW

    FIRST

    El operador FIRSTk asocia a cada forma sentencial losprimeros k smbolos de cualquier forma terminal alcanzabledesde mediante derivaciones ms a la izquierda.

    Gramticas LL

  • El ProblemaClculo del FIRST

    FOLLOW

    FIRST

    Investigaremos el caso de k = 1 y denotaremosFIRST () := FIRST1().La primera pregunta es responder como calcular el FIRST decada elemento.

    Gramticas LL

  • El ProblemaClculo del FIRST

    FOLLOW

    FIRST

    DefinicinSean L1, . . . ,Ln (V ) lenguajes. Definiremos el lenguajeL1 1 1 Ln (V ) mediante la siguiente igualdad: Seaj {1, . . . ,n} tal que Li para 1 i j 1 y 6 Lj .Entonces,

    L1 1 1 Ln :=j

    i=1

    Li .

    Gramticas LL

  • El ProblemaClculo del FIRST

    FOLLOW

    FIRST

    TeoremaCon las anteriores notaciones, se tienen las siguientespropiedades.

    1 Si X = a y la gramtica no contiene smbolos intiles,entonces FIRST (X ) = {a}.

    2 Si := X1 Xn donde Xi (V ), entonces

    FIRST () = FIRST (X1)1 1 FIRST (Xn).3 Si V son los smbolos no terminales que alcanzan la

    palabra vaca, entonces FIRST (X ) si y solamente siX V.

    Gramticas LL

  • El ProblemaClculo del FIRST

    FOLLOW

    Notacin

    Para simplificar la notacin, supongamos dada una aplicacin

    F : (V ) P((V )),

    escribiremos F1 para cada forma terminal queriendodenotar

    F1 := F (X1)1 1 F (Xn),cuando = X1 Xn.

    Gramticas LL

  • El ProblemaClculo del FIRST

    FOLLOW

    Algoritmo

    Hallar V := {A V : A ` }.Si A , entonces F (A) := {A}

    en otro casoG(A) := F (A) :=

    { {A} si A 6 V{A, } si A V

    mientras F (A) 6= G(A) para algn A V hacerG(A) := F (A)F (A) := {F1 : X 7 , X F (A)} {F (A)}

    fin mientras

    Gramticas LL

  • El ProblemaClculo del FIRST

    FOLLOW

    FOLLOW

    Definition (FOLLOW)

    Para cada forma sentencial (V ) definiremos la funcinFOLLOW Gk () del modo siguiente.

    Si existe una forma sentencial (i.e. si Q0 `G ), con (V ), entonces FOLLOW Gk ().Adicionalmente, definamos

    FOLLOW Gk () := {x : Q0 ` , x FIRST Gk ()}.

    De nuevo, omitiremos el superndice G cuando no genereconfusin.

    Gramticas LL

  • El ProblemaClculo del FIRST

    FOLLOW

    FOLLOW

    De nuevo nos ocuparemos solamente deFOLLOW := FOLLOW1. Obsrvese que FOLLOWk () yque para cada x FOLLOWk (), |x | k .

    Gramticas LL

  • El ProblemaClculo del FIRST

    FOLLOW

    Algoritmo

    Hallar FIRST (X ), para cada X (V ).G(X ) := , para cada X VF (Q0) := {}F (A) := , para cada A 6= Q0.mientras F (A) 6= G(A) para algn A V , hacer

    G(A) = F (A) para cada A V

    F (A) :=

    [ B 7A

    (FIRST () \ {})]

    B 7A, FIRST ()

    F (B)

    F (A)fin mientras Gramticas LL

    El ProblemaClculo del FIRSTFOLLOW