Análisis Sintáctico Ascendente CI4721 – Lenguajes de Programación II Ernesto Hernández-Novich <[email protected]> Universidad “Simón Bolívar” Copyright ©2012-2016 Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 1 / 20 Motivación Reconocedor ascendente no determinístico Sea G = (N, Σ, P, S) una CFG cualquiera. Entonces el PDA extendido Asc(G) = ({q0 , q1 }, Σ, N ∪ Σ, δ, q0 , {q1 }) con δ definida según δ(q0 , a, λ) = {(q0 , a)}, ∀a ∈ Σ (1) δ(q0 , λ, α) = {A → αR ∈ P : (q0 , A)}, ∀A ∈ N ∧ α 6= S (2) δ(q0 , λ, S) = {(q1 , λ)} ∪ {A → S ∈ P : (q0 , A)} (3) ¿Cuál es la razón del no-determinismo? Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 2 / 20 Contextos LR(0) Contexto LR(0) Sea G = (N, Σ, P, S) una CFG cualquiera. Si tenemos una forma sentencial más derecha ∗ S ⇒ βAv ⇒ βαv Right Right decimos que βα es un contexto LR(0) para A → α ∈ P. • Cada shift deben avanzar de izquierda a derecha hasta completar βα. • Cada reduce corresponden a sustituir α por A. Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 3 / 20 Contextos LR(0) Un ejemplo trivial Posibles derivaciones más derechas Para la gramática S → aA S → bB A → abA A → bB B → bBc B → bc Hernández-Novich (USB) S ⇒ aA i ⇒ a(ab)i A ⇒ a(ab)i bB j ⇒ a(ab)i bbj Bcj S ⇒ bB i ⇒ bbi Bci ⇒ bbi bcci ⇒ a(ab)i bbj bccj Análisis Sintáctico Ascendente 2016 4 / 20 Contextos LR(0) Un ejemplo trivial Podemos construir los contextos Regla S → aA S → bB A → abA A → bB B → bBc B → bc LR(0) − CONTEXT {aA} {bB} {a(ab)i A | i > 0} {a(ab)i bB | i ≥ 0} {a(ab)i bbj Bc, bbj Bc | i ≥ 0, j > 0} {a(ab)i bbj c, bbj c | i ≥ 0, j > 0} • Los contextos se deducen de las formas sentenciales más derechas. • Cada contexto es un lenguaje posiblemente infinito. Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 5 / 20 Gramáticas LR(0) Gramáticas LR(0) Definición Diremos que una gramática G = (N, Σ, P, S) con símbolo inicial no recursivo es LR(0) si ∀α ∈ (N ∪ Σ)∗ ∧ v ∈ Σ∗ cuando α ∈ LR(0) − CONTEXT (A → β1 ) αv ∈ LR(0) − CONTEXT (B → β2 ) entonces v = λ, A = B y β1 = β2 . Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 6 / 20 Gramáticas LR(0) Gramáticas LR(0) Definición Diremos que una gramática G = (N, Σ, P, S) con símbolo inicial no recursivo es LR(0) si ∀α ∈ (N ∪ Σ)∗ ∧ v ∈ Σ∗ cuando α ∈ LR(0) − CONTEXT (A → β1 ) αv ∈ LR(0) − CONTEXT (B → β2 ) entonces v = λ, A = B y β1 = β2 . No hay ningún contexto LR(0) de una regla que sea prefijo de un contexto LR(0) de otra regla. Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 6 / 20 Gramáticas LR(0) Hacia el determinismo Keep shifting until you can reduce Los contextos LR(0) proveen información para actuar ante un α particular: 1 Si α ∈ LR(0) − CONTEXT (A → β), se puede reducir con A → β. 2 Si α es un prefijo viable de algún LR(0) − CONTEXT , se avanza (shift) con algún símbolo (terminal o no-terminal) para extenderlo. 3 En caso contrario, la entrada se rechaza. Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 7 / 20 Gramáticas LR(0) ¿Qué pasa si hay más de una alternativa? Conflictos LR(0) • Si para un α particular encontramos α ∈ LR(0) − CONTEXT (A → β1 ) α ∈ LR(0) − CONTEXT (B → β2 ) con A → β1 6= B → β2 tenemos un conflicto reduce/reduce LR(0) pues no podemos decidir cuál regla reducir. Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 8 / 20 Gramáticas LR(0) ¿Qué pasa si hay más de una alternativa? Conflictos LR(0) • Si para un α particular encontramos α ∈ LR(0) − CONTEXT (A → β1 ) α ∈ LR(0) − CONTEXT (B → β2 ) con A → β1 6= B → β2 tenemos un conflicto reduce/reduce LR(0) pues no podemos decidir cuál regla reducir. • Si para un α particular encontramos α ∈ LR(0) − CONTEXT (A → β1 ) αγ ∈ LR(0) − CONTEXT (B → β2 ) con γ 6= λ tenemos un conflicto shift/reduce LR(0) pues no podemos decidir si reducir o continuar avanzando en la entrada. Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 8 / 20 Máquina característica LR(0) De prefijo hasta contexto Items LR(0) de la gramática Sea G = (N, Σ, P, S) y A → α ∈ P, diremos que [A → α1 · α2 ] es un item LR(0) para cualesquiera α1 , α2 ∈ (N ∪ Σ)∗ y α = α1 α2 • Un item de la forma [A → α·] se denomina item completo. • Una producción A → α genera |α| + 1 items – uno por cada posible posición del marcador en el lado derecho. • Una producción A → λ solamente genera el item [A → ·] Omitiremos los corchetes para ahorrar espacio. Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 9 / 20 Máquina característica LR(0) Otro ejemplo trivial El conjunto de items LR(0) de la gramática Regla S→A A → aAb A→a A→λ Items LR(0) S → ·A S → A· A → ·aAb A → a · Ab A → aA · b A → aAb· A → ·a A → a· A→· LR(0) − CONTEXT {A} {ai Ab | i > 0} {ai | i > 0} {ai | i ≥ 0} ¿Puede identificar los conflictos? Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 10 / 20 Máquina característica LR(0) Máquina característica LR(0) Sea G = (N, Σ, P, S). Construiremos el λ − NFA M = (Q, N ∪ Σ, δ, q0 , Q) Q contiene todos los items LR(0) además del estado q0 , mientras δ(q0 , λ) = {S → ·α | S → α ∈ P} δ(A → α · aβ, a) = {A → αa · β} δ(A → α · Bβ, B) = {A → αB · β} δ(A → α · Bβ, λ) = {B → ·γ | B → γ ∈ P} • M acepta los prefijos viables de la gramática – el cómputo de M “avanza” hasta encontrar el lado derecho de una producción. • Se puede construir determinístico en una sola operación. Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 11 / 20 Máquina característica LR(0) Sigue el ejemplo trivial La máquina característica LR(0) de la gramática A Inicio S→·A A→·aAb I0 : A→·a A→· I1 : S → A· a A→a · Ab A→a· I2 : A→·aAb A→·a A→· a A I3 : A → aA · b b I4 : A → aAb· • Conflicto shift/reduce en I0 – shift a o reduce A → λ. • Conflictos shift/reduce en I2 – shift a, reduce A → λ o reduce A → a. • Conflicto reduce/reduce en I2 – reduce A → λ o reduce A → a. Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 12 / 20 Máquina característica LR(0) ¿Y esa máquina sirve? Theorem Sea G una CFG y M su máquina característica LR(0), entonces A → α · β ∈ δ̂(q0 , w ) si y sólo si w = pα con pαβ contexto LR(0) de A → αβ Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 13 / 20 Máquina característica LR(0) ¿Y esa máquina sirve? Theorem Sea G una CFG y M su máquina característica LR(0), entonces A → α · β ∈ δ̂(q0 , w ) si y sólo si w = pα con pαβ contexto LR(0) de A → αβ Theorem Sea G una CFG con símbolo inicial no recursivo. Entonces G es LR(0) si y sólo si δ̂ de su máquina característica determinística LR(0) satisface: 1 Si δ̂(qs , u) contiene únicamente un item A → α· con α 6= λ. 2 Si δ̂(qs , u) contiene un item A → · entonces el marcador siempre es seguido por un no terminal en el resto de los items. Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 13 / 20 Máquina característica LR(0) ¿Cómo aprovechamos la máquina? Reconocedor basado en la máquina característica input: G = (N, Σ, P, S) CFG LR(0), w ∈ Σ∗ y la Máquina LR(0) de G u, v , error ← λ, w , false repeat if δ̂(q0 , u) contiene A → α· con u = pα then u ← pA else if δ̂(q0 , u) contiene A → α · β ∧ v 6= λ then shift(u, v ) else error ← true end if until u = S ∨ error if u = S then aceptar else rechazar end if Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 14 / 20 Máquina característica LR(0) Un ejemplo completo Gramática GAE de expresiones aditivas S → A# A → A+T A→T T →b T → (A) • # es el terminador – mismo propósito que para LL(k) • b abstrae números e identificadores. Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 15 / 20 Máquina característica LR(0) Expresiones Aditivas La máquina característica LR(0) de GAE I1 : A → T · T T Inicio T →( · A) A→·A+T I7 : A→·T T →·b T →·(A) A ( I8 : ( b S→·A# A→·A+T I0 A→·T T →·b T →·(A) b A I3 : ) ( I2 : T → b· T →(A · ) A→A · +T + A→A+ · T I4 : T →·b b T →·(A) + S→A · # # I6 : S → A#· A→A · +T I9 : T → (A)· T I5 : A → A+T · No hay conflictos – GAE es LR(0) Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 16 / 20 Máquina característica LR(0) Otro ejemplo completo Gramática GE de expresiones aditivas y multiplicativas S → A# A → A+T A→T T → T ∗F T →F F →b F → (A) • F genera subexpresiones multiplicativas – precedencia por gramática. • b abstrae números e identificadores. Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 17 / 20 Máquina característica LR(0) Expresiones Aditivas y Multiplicativas Parte de la máquina característica LR(0) de GE Inicio S→·A# A→·A+T A→·T A→T · T I0 T →·T ∗F I1 : T →T · ∗F T →·F F →·b F →·(A) Conflicto shift/reduce en I1 – GE no es LR(0) Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 18 / 20 Consideraciones Consideraciones • Estudie la demostración del Teorema 20.4.1 del libro de texto. • Estudie la demostración del Teorema 20.4.4 del libro de texto. • Sin construir la máquina característica, ¿la gramática GAE seguiría siendo LR(0) si se agrega A → A−T ? • Construya la máquina característica para GE e identifique todos los conflictos presentes según su tipo. • Use el algoritmo reconocedor basado en la máquina característica de GAE para reconocer b + (b + b) e identifique las formas sentenciales más derechas en el proceso. Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 19 / 20 Referencias Bibliográficas Bibliografía • [Sudkamp] • Secciones 20.1 a 20.4 • Ejercicios 20.1 a 20.5 Hernández-Novich (USB) Análisis Sintáctico Ascendente 2016 20 / 20