P. 1
Análisis sintáctico.pdf

Análisis sintáctico.pdf

|Views: 176|Likes:
Published by satan trismegisto

More info:

Published by: satan trismegisto on Sep 17, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

11/16/2014

pdf

text

original

Sections

  • Análisis Sintáctico
  • En realidad
  • Analizador Sintáctico, Tipos
  • Analizador Sintáctico
  • Análisis Sintáctico Descendente
  • Análisis Sintáctico Ascendente
  • Analizadores Sintácticos, Problemas
  • Análisis Sintáctico Predictivo
  • Análisis Sintáctico Predictivo: Descendente Recursivo
  • Análisis Sintáctico Predictivo, DEFINICIONES: PRIMERO
  • Análisis Sintáctico Predictivo, DEFINICIONES: SIGUIENTE
  • Análisis Sintáctico Predictivo: Condiciones
  • Análisis Sintáctico Predictivo: Tabla de Análisis Sintáctico
  • Análisis Sintáctico Predictivo No Recursivo; LL(1)
  • Análisis Sintáctico LL(1)
  • Análisis Sintáctico Ascendente: Gramática de Operadores
  • Precedencia de Operador: Relaciones de Precedencia
  • Precedencia de Operador: Evaluador de Expresiones
  • Evaluación de Expresiones
  • Análisis Sintáctico Ascendente: Precedencia de Operador
  • Precedencia de Operador: Construir la Tabla de Precedencia
  • Precedencia de Operador: Operadores Unarios(¬)
  • Obtención de las relaciones de precedencia (cálculo)
  • Precedencia de Operador: Calcular la Tabla de Precedencia
  • Ejemplo Calculo de Tabla de Precedencia
  • Análisis Ascendente LR
  • Tipos de AnálizadoresLR
  • Modelo de un Analizador LR
  • Modelo de Analizador LR
  • Algoritmo de Análisis LR
  • Ejemplo de Análisis LR
  • Construcción de Tabla de Análisis SLR
  • Algoritmo: crear conjunto canónico LR(0)
  • Construir la tabla SLR (por fin)
  • Construir la tabla SLR
  • Tabla SLR Resultante
  • Resumen
  • Analizador canónico LR
  • ConjuntoLR(0)
  • Tabla de análisis LR(0)
  • Conflicto en la tablaSLR!
  • Itemsen LR(1)
  • Construir el conjunto canónico LR(1)
  • Algoritmo: crear conjunto canónico LR(1)
  • Conj. LR(1)
  • Estados de analizador canónico LR(1)
  • Construir la tabla canónica LR
  • Analizador LALR
  • Ejemplo
  • Estados de analizador LALR(1)
  • Construir la tabla LALR
  • Uso de gramáticas ambiguas
  • Ejemplo 1ª gramática ambigua
  • Acciones analizador SLR(1)
  • Ejemplo 2ª gramática ambigua
  • Conflictos en analizador SLR
  • Tabla SLR sin conflictos
  • Ejemplo 3ª gramática ambigua

Análisis Sintáctico

Cadena de Analizador Sintáctico Árbol Sintáctico

tokens

En realidad...
Componente léxico

Analizador Léxico

Obtén otro componente léxico

Analizador Sintáctico

Árbol sintáctico

Tabla de Símbolos

Análisis Sintáctico. Procesadores de Lenguaje I

Análisis Sintáctico
Funciones
„

„

Comprobar que la secuencia de componentes léxicos cumple las reglas de la gramática Generar el árbol sintáctico Son especificaciones sintácticas y precisas de lenguajes Se puede generar automáticamente un analizador El proceso de construcción puede llevar a descubrir ambigüedades Imparte estructura al lenguaje de programación, siendo más fácil generar código y detectar errores Es más fácil ampliar y modificar el lenguaje

Ventajas de utilizar gramáticas
„

„ „

„

„

Análisis Sintáctico. Procesadores de Lenguaje I

Analizador Sintáctico, Tipos
Tres tipos generales de analizadores sintácticos:
„

Métodos Universales: Cocke-Younger-Kasami y Earley
Š Sirven para cualquier gramática Š Muy ineficientes

„

Descendentes (top-down)
Š Construyen el árbol de análisis sintáctico desde arriba (raíz,

axioma) hasta abajo (hojas, terminales) „ Analizadores Descendentes Recursivos „ Analizadores LL(1) con tabla

„

Ascendentes (bottom-up)
Š Construyen el árbol de análisis sintáctico desde abajo hacia

arriba „ Analizadores de Precedencia de Operador „ Analizadores LR(1)

Análisis Sintáctico. Procesadores de Lenguaje I

Analizador Sintáctico
Tanto para el análisis descendente como para el ascendente:
„

„

La entrada se examina de izquierda a derecha, un símbolo cada vez Trabajan con subclases de gramáticas LR(k) ⊃ LL(k) En la práctica solo se utilizan LR(1) y LL(1)

En general las gramáticas serán LL y LR
„ „

Muchos compiladores se llaman “parser-driven” debido a que el analizador sintáctico es el que llama al léxico Existen herramientas para generar automáticamente analizadores sintácticos (YACC, Bison)

Análisis Sintáctico. Procesadores de Lenguaje I

Analizador Sintáctico
Árbol sintáctico
„

Ejemplo: Id.*.Id.+.Id
Expresión

Gramática: Expresión::= Expresión.*.Término | Expresión.+.Término | Término Término ::= Id | Número

Expresión

+

Término

Expresión

*

Término

Id

Término

Id

Id

Análisis Sintáctico. Procesadores de Lenguaje I

Análisis Sintáctico Descendente
Algoritmo
1. 2.

Poner el axioma como raíz del árbol de derivación Hasta que solo haya símbolos terminales, derivar más a la izquierda Entrada: Id.*.Id.+.Id Gramática:
Expresión::=Expresión.*.Término | Expresión.+.Término | Término Término ::= Id | Número

Ejemplo
„ „

„

Derivación:
Expresión → Expresión.+.Término → Expresión.*.Término.+.Término → Término.*.Término.+.Término → Id.*.Término.+.Término → Id.*.Id.+.Término → Id.*.Id.+.Id

Análisis Sintáctico. Procesadores de Lenguaje I

Análisis Sintáctico Ascendente
Definición: Pivote
„

„

Secuencia más larga de símbolos (ΣT y ΣN) en la parte más izquierda de la entrada que se puede encontrar en la parte derecha de una producción y tal que todos los símbolos a su derecha son terminales Ejemplo: Š Si entrada es: Expresión.*.Término.+.Id Š el pivote es: Expresión.*.Término Empezar con la cadena de entrada Intentar llegar hasta el axioma, encontrando el pivote y reduciéndolo con la producción correspondiente

Algoritmo
1. 2.

Ejemplo
Id.*.Id.+.Id → Término.*.Id.+.Id → Expresión.*.Id.+.Id → Expresión.*.Término.+.Id → Expresión.+.Id → Expresión.+.Término → Expresión

Procesadores de Lenguaje I Mas de una opción: A::= α | ⠊ Retroceso Š Analizar los siguientes elementos de la entrada „ Recursividad izquierda Š Eliminación de la recursividad „ Ambigüedad Š Factorización por la izquierda Ascendentes „ Más de una opción: A::= α y α es el pivote Problemas semánticos Otros „ Análisis Sintáctico. Procesadores de Lenguaje I Análisis Sintáctico Predictivo No necesita realizar retroceso para analizar bien las sentencias del lenguaje Sólo con ver el siguiente carácter de la entrada puede decidir cuál va a ser la siguiente producción a emplear Condiciones „ „ „ Diseñar bien la gramática Eliminar la recursividad izquierda Factorizar por la izquierda No está asegurado el tener una gramática predictiva Las gramáticas son difíciles de leer Para las partes de las gramáticas que no son predictivas se pueden utilizar otros analizadores .Analizadores Sintácticos. Problemas Descendentes „ Análisis Sintáctico.

} else if (car== i) { scan(). if (car == asig) {scan(). Procesadores de Lenguaje I Se ejecuta un conjunto de procedimientos recursivos para procesar la entrada A cada NO Terminal de una gramática se le asocia un procedimiento „ Decide la producción que utilizará analizando el símbolo de preanálisis. if (car in [igual. else error().} else error(). } else error() } Análisis Sintáctico. Si el token no coincide entonces Error La secuencia de procedimientos llamados para procesar la entrada define implícitamente un árbol de análisis sintáctico Análisis Sintáctico Predictivo: Descendente Recursivo Ejemplo: S → if B then S | write B | i := B B → i = i | i <> i | true | false Procedure S() { if (car== if) { scan(). false]) scan(). B(). if (car == i) then scan else error. else error().Análisis Sintáctico Predictivo: Descendente Recursivo Análisis Sintáctico. } else if (car==write) {scan(). Š si está en PRIMERO(α) entonces se usa la producción con lado derecho α Š si no está en ningún PRIMERO entonces se usa una producción λ „ Usa una producción imitando al lado derecho Š no terminal da como resultado una llamada a otro procedimiento Š terminal (que coincide con el símbolo de preanálisis) produce otra lectura de otro token. B(). noigual]) scan(). S(). B(). if (car== then) {scan(). Procesadores de Lenguaje I Procedure B() { if (car= i) { scan(). } elseif (car in [true. } .} else error().

(x ∈ ΣT ∪ {λ}).T’ T’ ::= *.E’ | λ T ::= F..F. PRIMERO(α) es el conjunto de terminales que inician las cadenas derivadas de α. Procesadores de Lenguaje I Si α es una cadena de símbolos gramaticales.) | Id „ „ „ „ Análisis Sintáctico.. 2.+. 3. (α. Id } PRIMERO(F) = { (.. Id } PRIMERO(Id. PRIMERO(α)={x | (α →* xβ)..E’ E’ ::= +.E. Ejemplo: E ::= T. β ∈Σ*)} Repetir hasta que no se puedan añadir más terminales o λ a ningún conjunto PRIMERO Si X ∈ ΣT ⇒ PRIMERO(X) es { X } Si X → λ ⇒ añadir λ a PRIMERO(X) Si X ∈ ΣN y X →Y1Y2.Análisis Sintáctico Predictivo.T’ | λ F ::= (. λ } .Id) = { Id } PRIMERO(Id) = { Id } PRIMERO(T’) = { *. „ Conjunto PRIMERO(X) para todos los símbolos gramaticales X 1.YKY ⇒ a ∈ PRIMERO(X) si a ∈ PRIMERO(Yi) y λ ∈ PRIMERO(Y1). PRIMERO(Y2).*. Id } PRIMERO(E’) = { +.. Procesadores de Lenguaje I PRIMERO(E) = { (.T. λ } PRIMERO(T.. DEFINICIONES: PRIMERO Análisis Sintáctico. PRIMERO(Yi-1) Š Si Y1 deriva a λ ⇒ se añade PRIMERO(Y2) Š Si Y1 no deriva a λ ⇒ no se añade más a PRIMERO(X) Análisis Sintáctico Predictivo. DEFINICIONES: PRIMERO PRIMERO(α). 4. Id } PRIMERO(T) = { (.Id) = { (.

Ejemplo: E ::= T.) | Id ΣN E E’ F T T’ SIGUIENTE $. +.E. + $. *. ). Procesadores de Lenguaje I . Procesadores de Lenguaje I SIGUIENTE(A)={x|(S→*α·A·β).E’ E’ ::= +. (x∈PRIMERO(β)-{λ})} Conjunto de terminales que pueden aparecer inmediatamente a la derecha de A en alguna forma sentencial. ) $.T’ | λ F ::= (. 3. DEFINICIONES: SIGUIENTE SIGUIENTE(A). DEFINICIONES: SIGUIENTE Conjunto SIGUIENTE(A) „ „ Análisis Sintáctico. 2.Análisis Sintáctico Predictivo. (A∈ΣN). +. ) Análisis Sintáctico.T’ T’ ::= *. β→*λ (λ ∈PRIMERO(β)) ⇒ SIGUIENTE(B) = SIGUIENTE(A) ∪ SIGUIENTE(B) Repetir hasta que no cambie ningún conjunto SIGUIENTE Algoritmo 1.E’ | λ T ::= F. (α∈Σ*). (β∈Σ+).F.T. si A es el último símbolo entonces se incluye el separador $ SIGUIENTE(S)={$} La regla A→αBβ ⇒ SIGUIENTE(B) = (PRIMERO(β)-{λ}) ∪ SIGUIENTE(B) La regla A→αBβ | β=λ. Análisis Sintáctico Predictivo. ) $. ) $. 4.

Análisis Sintáctico Predictivo: Condiciones Pregunta: „ Análisis Sintáctico. de forma descendente? Si A::= α | β ⇒ Š PRIMERO(α) ∩ PRIMERO(β) = ∅. SIGUIENTE(N) debe ser disjunto de los conjuntos PRIMERO de todas sus alternativas „ No puede haber entradas con definiciones múltiples en la tabla de análisis . Procesadores de Lenguaje I ¿Que debe cumplir una gramática para que pueda ser reconocida sin retroceso. con solo mirar el siguiente elemento de la entrada. Procesadores de Lenguaje I No puede haber conflictos PRIMERO/PRIMERO Š ∀N∈ΣN. para ningún terminal a tanto α y β derivan a la vez cadenas que comiencen con a Š No puede ocurrir que α →*λ y β →*λ Š Si β →*λ. el conjunto PRIMERO de todas sus alternativas debe ser disjunto „ No puede haber múltiples alternativas nulas Š ∀N∈ΣN. solo pueden tener una producción N→*λ „ No puede haber conflictos PRIMERO/SIGUIENTE Š ∀N∈ΣN. entonces α no deriva ninguna cadena que comience con un terminal en SIGUIENTE(A) Respuesta: „ „ Condición LL(1) Análisis Sintáctico Predictivo: Condiciones Condición LL(1) „ Análisis Sintáctico. con una alternativa nula.

T.c)= error Análisis Sintáctico Predictivo: Tabla de Análisis Sintáctico Ejemplo E ::= T.E’ F.T’ λ * ( T.F.E’ E’ ::= +.E’ ) λ Análisis Sintáctico.c)= ∅ Then tabla(A. Procesadores de Lenguaje I $ λ λ E E’ T T’ F . El analizador sintáctico expandirá A por α cuando el símbolo actual de la entrada sea a Algoritmo ForAll (A::= α) ∈ Ρ do ForAll a ∈ PRIMERO(α) do tabla(A.F.a)= α Si λ ∈ PRIMERO(α) Entonces ForAll b ∈ SIGUIENTE(A) do tabla(A.) + +.T’ | λ F ::= (.b)= α ForAll A∈ΣN y c∈ΣT do If tabla(A.) | Id Id T.E.Análisis Sintáctico Predictivo: Tabla de Análisis Sintáctico Funcionamiento „ Análisis Sintáctico.E’ | λ T ::= F.T’ (.T’ λ Id *.E.T’ T’ ::= *.T.E’ F. Procesadores de Lenguaje I Sea A→α con a∈ΣT | a∈PRIMERO(α).

LL(1) Análisis Sintáctico. se sustituye la X de la pila por WVU (U queda como cima de la pila) Š Si M[X.a]= error.Análisis Sintáctico Predictivo No Recursivo. LL(1) Análisis Sintáctico.a] Š Si M[X. el programa consulta la entrada M[X. el analizador se detiene y anuncia el éxito del análisis X=a≠$. Procesadores de Lenguaje I Los símbolos de la entrada actual “a” y cima de la pila “X” determinan la acción del analizador Hay tres posibilidades: „ „ „ X=a=$.a]=UVW. el analizador saca X de la pila y mueve el apuntador de la entrada al siguiente símbolo de entrada X∈ΣN. Procesadores de Lenguaje I Modelo de analizador sintáctico predictivo no recursivo ENTRADA PILA X Y Z $ a + b $ Programa de Análisis Sintáctico Predictivo SALIDA Tabla de Análisis Sintáctico M Análisis Sintáctico Predictivo No Recursivo. se llama a la rutina de recuperación de error .

. Repeat X=$ then If X ∈ΣT or If X=a then Pop.Y1 Emitir la producción X else error(). Push Yk..a]=X→Y1Y2. else error().Análisis Sintáctico. Push S. Procesadores de Lenguaje I Análisis Sintáctico LL(1) Algoritmo: pila =$.Yk-1. Else If M[X. meter$ al final de la entrada.Yk then Pop. a:= GetToken. until X=$ If X=$ and a=$ then Aceptar. Análisis Sintáctico. a:= GetToken... Else error.. Procesadores de Lenguaje I Análisis Sintáctico LL(1) Ejemplo: Pila $⋅E $ ⋅ E’ $ ⋅ E’ $ ⋅ E’ $ ⋅ E’ $ ⋅ E’ $ ⋅ E’ $ ⋅ E’ $ ⋅ E’ $ ⋅ E’ $ ⋅ E’ $ ⋅ E’ $ ⋅ E’ $ ⋅ E’ $ ⋅ E’ $ ⋅ E’ $ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ T T’ T’ T’ T’ T’ T’ T’ ⋅F ⋅ Id ⋅F⋅* ⋅F ⋅ Id Entrada Id ⋅ * ⋅ Id ⋅ + Id ⋅ * ⋅ Id ⋅ + Id ⋅ * ⋅ Id ⋅ + Id ⋅ * ⋅ Id ⋅ + * ⋅ Id ⋅ + ⋅ Id * ⋅ Id ⋅ + ⋅ Id Id ⋅ + ⋅ Id ⋅ $ Id ⋅ + ⋅ Id ⋅ $ + ⋅ Id ⋅ $ + ⋅ Id ⋅ $ + ⋅ Id ⋅ $ Id ⋅ $ Id ⋅ $ Id ⋅ $ $ $ $ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ Id Id Id Id $ $ ⋅ ⋅ ⋅ ⋅ $ $ $ $ Producción E::= T ⋅ E’ T::= F ⋅ T’ F::= Id T’::= * ⋅ F ⋅ T’ F::= Id T’::= λ E’::= + ⋅ T ⋅ E’ T::= F ⋅ T’ F::= Id T’::= λ E’::= λ T⋅+ T T’ ⋅ F T’ ⋅ Id T’ .

Procesadores de Lenguaje I Análisis Sintáctico Ascendente Análisis por desplazamiento y reducción „ „ Por precedencia de operadores LR Construir un árbol de análisis sintáctico para una cadena de entrada que comienza por las hojas y avanza hacia la raíz. eficientes analizadores sintácticos por desplazamiento y reducción Gramática de operadores „ „ No tiene reglas de producción del tipo A::=λ No tiene dos no terminales adyacentes A::=α·B·C·β | A. de operadores E→E+E | E-E | E*E | E/E | (E) | -E | id . Reducir una cadena de entrada w al símbolo inicial de la gramática (axioma) En cada paso de reducción se sustituye una subcadena que concuerde con el lado derecho de una producción por el símbolo del lado izquierdo. a mano. de operadores E→EAE | (E) | -E | id A→+ | .B.Análisis Sintáctico. se traza una derivación por la derecha en sentido inverso Análisis Sintáctico Ascendente: Gramática de Operadores Análisis Sintáctico.C ∈ΣN Ejemplo No es G. Procesadores de Lenguaje I Para una pequeña clase de gramáticas se puede construir con facilidad.| * | / Si es G.

Procesadores de Lenguaje I Se definen tres relaciones de precedencia disjuntas a<•b si a tiene menos precedencia que b a=b si a tiene igual precedencia que b a•>b si a tiene más precedencia que b Algoritmo Sustituir todos los símbolos no terminales por un único símbolo Insertar $ al principio y al final de la cadena de entrada Insertar las relaciones de precedencia en la cadena de entrada Mientras entrada≠$S$ hacer Recorrer entrada desde la izquierda hasta encontrar •> Buscar a la izquierda. ignorando los no terminales Precedencia de Operador: Ejemplo Análisis Sintáctico. Procesadores de Lenguaje I Entrada: $·(·Id·+·Id·)·$ Gramática: E::= E·+·E | E·*·E | (·E·) | Id Tabla de precedencia: ( ) Id * + ( $ Análisis Id * •> •> •> <• <• <• + •> •> •> •> <• <• ) •> •> •> •> = $ •> •> •> •> = Derivación $·(·E·+·Id·)·$ $·(·E·+·E·)·$ $·(·E·)·$ $·E·$ <• <• <• <• <• <• <• <• Entrada $ $ $ $ <• <• <• <• ( ( ( ( <• Id •> + <• Id •> ) •>$ <• E + <• Id •> ) •> $ <• E + E •> ) •> $ E = ) •> $ . el primer <• Reducir el pivote que se encuentra en el medio Reinsertar las relaciones de precedencia. a partir de ese punto.Precedencia de Operador: Relaciones de Precedencia „ „ „ Análisis Sintáctico.

hasta encontrar la relación de precedencia mayor. a: =GetToken. a:= GetToken. a) then PushOperador (a). else if (cimaOperandos <. a) o (cimaOperandos =. Procesadores de Lenguaje I El análisis recorre la entrada de izquierda a derecha y se encuentra en dos posibles estados: Esperando un operando (variables o constantes) Esperando un operador (resto de terminales) Pila de Operadores Pila de Operandos El análisis mantiene dos pilas „ „ Cuando un operador en la cima de su pila es de más precedencia que el siguiente leído. Procesadores de Lenguaje I Evaluación de Expresiones Algoritmo de evaluación de expresiones: pilaOperadores = $. poner $ al final de la entrada. else repeat opAnterior= PopOperador aplicar opAnterior a pilaOperandos until (cimaOperadores <. Cada operador extraído se aplica a los operandos más arriba de la pila de operandos Análisis Sintáctico. entonces arranca la reducción del pivote. repeat if a=$ y cimaOperadores=$ then return if a es Operando then PushOperando (a). a:=GetToken.Precedencia de Operador: Evaluador de Expresiones „ „ Análisis Sintáctico. opAnterior) else Error until true .

Idc Ida. Idd Ida.(Idb·+·Idc. Idb . Idb. Idc.Idd)$ $ (Idb·+·Idc . Idb .Idd)$ $*( ·+·Idc .(Idb·+·Idc .*.Idd)$ $*(+ . Idc Ida.*. Idd)$ $ . Idb .Idd)$ $*(+ Idd)$ $*(+* )$ $*(+* )$ $*(+ )$ $*( $ $*() $ $ Análisis Sintáctico.*. Idb Ida.*. Idc Ida .*. Idb Ida. Idb+Idc*Idd Ida*(Idb+Idc*Idd) .*. Idb .*. Idb+Idc*Idd Ida.Idd)$ $*( Idc .*. Idb Ida.*.Análisis Sintáctico Ascendente: Precedencia de Operador Entrada: „ Análisis Sintáctico. Procesadores de Lenguaje I Pila Operandos ∅ Ida Ida Ida Ida. Idc*Idd Ida. Procesadores de Lenguaje I Id·+·Id·*·Id E:=E·+·E | E·*·E | (·E·) | Id Gramática „ La gramática es ambigua pero este tipo de análisis proporciona una única derivación Entrada Ida·+·Idb·*·Idc$ +·Idb·*·Idc$ Idb·*·Idc$ *·Idc$ Idc$ $ $ $ Pila Operadores $ $ $+ $+ $+* $+* $+ $ Pila Operandos ∅ Ida Ida Ida.Idd)$ $* Idb·+·Idc . Idb*Idc Ida+Idb* Idd Análisis Sintáctico Ascendente: Precedencia de Operador Entrada: Id*(Id+Id*Id) Entrada Pila Operadores Ida. Idb Ida.

Id•>θ $<• θ. Idd$ . (<•θ. Id•>$.*. Idd$ ).+. Idd$ (Idb·+·Idc).(Idb·+·Idc). Id•>).+. $<• (. Idd$ .+.*. entonces hacer: „ „ Análisis Sintáctico.+.+. θ<•Id. )•>$ . Procesadores de Lenguaje I Pila Operadores $ $ $ $ $ $ $ $ $ $ $ $ $ $ * * * * * * * * + + Pila Operandos Ida Ida Ida Ida IdaIdb IdaIdb IdaIdbIdc IdaIdb+Idc IdaIdb+Idc IdaIdb+Idc Ida*(idb+Idc) Ida*(idb+Idc) Ida*(idb+Idc) Idd Ida*(idb+Idc)+Idd ( ( (+ (+ ( () Precedencia de Operador: Construir la Tabla de Precedencia Si el operador θ1 tiene mayor precedencia que θ2 entonces hacer θ1 •>θ2 y θ2 <• θ1 Si los operadores θ1 y θ2 son de igual precedencia (por ejemplo el mismo operador).+.+. (=).+·Idc). Idd$ .(Idb·+·Idc). Idd$ Idc). Idd$ Idd$ $ $ Análisis Sintáctico. Idd$ Idb·+·Idc).+. Idd$ .+. $<•Id. Procesadores de Lenguaje I θ1 •>θ2 y θ2 •> θ1 si son asociativos por la izquierda θ1 <•θ2 y θ2 <• θ1 si son asociativos por la derecha θ<•(. θ•>) )•>) Resto: (<•Id.+. Idd$ . θ•>$. )•>θ. (<• (. Idd$ ).+.Análisis Sintáctico Ascendente: Precedencia de Operador Entrada: Id*(Id+Id)+Id Entrada Ida.

. un paréntesis izquierdo... Procesadores de Lenguaje I sii existe: sii existe: A →. Š Ejemplo: Es el menos unario si antes el componente léxico leído era un operador.xC C∈{N ∪ λ} ..By. B →+ Cy.... Procesadores de Lenguaje I Manejo de Operadores Unarios (¬) Operador Unario que no es además Binario Š θ <• ¬ ∀ θ Š ¬ •> θ ∀ θ si ¬ tiene mayor precedencia que θ Š ¬ <• θ ∀ θ si ¬ tiene menor precedencia que θ „ Operador Unario que además es Binario Š Mediante la tabla de precedencia no puede analizarse correctamente cadenas como: Id*-Id Š Solución: Utilizar el analizador léxico para devolver dos componentes léxicos distintos. recordando el componente léxico anterior debe distinguir uno de otro... B →+.xB.... B∈{N ∪ λ} A →....xBy.. C∈{N ∪ λ} x <• y „ „ x •> y „ „ sii existe: A →. una coma o un símbolo de asignación Obtención de las relaciones de precedencia (cálculo) x±y „ Análisis Sintáctico.Precedencia de Operador: Operadores Unarios (¬) „ Análisis Sintáctico.

A. A. *. a siempre aparece en un nivel superior a los símbolos terminales de Cabecera(C) y Último(B) en el árbol de derivación Precedencia de Operador: Calcular la Tabla de Precedencia Reglas: 1. B. *. 2. B. Procesadores de Lenguaje I (A::= α·B·a·C·β) ∈ P. Análisis Sintáctico. a=b . β ∈ Σ* Si existe más de una relación de precedencia entre dos símbolos terminales. C ∈ ΣN. 3. C ∈ ΣN. Id} Ejemplo: Propiedad: „ ∀(A::= α·B·a·C·β) ∈ P. ). Procesadores de Lenguaje I „ Cabecera(A) = { x | (A→* α·x·β) ∧ (x ∈ ΣT) ∧ (A ∈ ΣN) ∧ (α ∈ ΣN*) ∧ (β ∈ Σ*)} Último(A) = { x | (A→* α·x·β) ∧ (x ∈ ΣT) ∧ (A ∈ ΣN) ∧ (α ∈ Σ*) ∧ (β ∈ ΣN*)} E::=E·+·T | T T::=T·*·F | F F::=(·E·) | Id Cabecera(E)={+. 2 y 3 ForAll a ∈ Cabecera(S) do $ <• a ForAll a ∈ Último(S) do a •> $ . (.Precedencia de Operador: Calcular la Tabla de Precedencia Definiciones: „ Análisis Sintáctico. a ∈ ΣT. a <• c ∀b ∈ Último(B). no es una gramática de precedencia Algoritmo ForAll (A::= α·B·a·C·β) ∈ P do Calcular Cabecera(C) Calcular Último(B) Calcular las precedencias usando las reglas 1. α. β ∈ Σ*. Id} Último(E)={+. a ∈ ΣT. α. a. b ∈ ΣT. β ∈ Σ* ∀c ∈ Cabecera(C). b •> a ∀ (A::= α·a·β·b·γ) ∈ P.

f(a) > g(b) Para encontrar la relación de precedencia entre a y b se realiza una comparación entre f(a) y g(b) No todas las relaciones de precedencia tienen funciones de precedencia . ). (. Id •> + *. Id Precedencias(R2) +. Procesadores de Lenguaje I Cabecera y Último ΣN E T F Cabecera +.Ejemplo Calculo de Tabla de Precedencia Gramática E::=E·+·T | T T::=T·*·F | F F::=(·E·) | Id Análisis Sintáctico. (. f(a) < g(b) si a = b. Procesadores de Lenguaje I La tabla de precedencia se puede simplificar. mediante dos funciones f y g Transforman los símbolos terminales en enteros Tienen que cumplir que ∀a.b ∈ΣT „ „ „ si a <• b. (. Id (. *. Id *. Id *. ). Id * <• (. f(a) = g(b) si a •> b. ). *. *. Id ). Id Precedencias (R1) + <• *. con el objetivo de ahorrar memoria y aumentar la velocidad de proceso. ). Id Tabla Regla E::=E+T T::=T*F Precedencia de Operador: Funciones de Precedencia Análisis Sintáctico. Id •> * Último +.

Análisis Sintáctico. los arcos se etiquetan: Š Š si a<•b.Precedencia de Operador: Funciones de Precedencia 1. Procesadores de Lenguaje I Construcción de las Funciones de Precedencia Crear los símbolos fa y ga ∀ a∈ΣT ∪ {$} Se dividen los fa y ga en tantos grupos como sea posible: Š 3. fa → gb Respuesta SI. Ciclos en el grafo: Š Š Precedencia de Operador: Funciones de Precedencia Ejemplo Id Id + * $ gId g* Análisis Sintáctico. Procesadores de Lenguaje I <• <• <• + •> •> •> <• g+ * •> <• •> <• g$ $ •> •> •> Cada símbolo está solo en un grupo fId f* f+ f$ . entonces f(a) y g(a) son los caminos más largos que comienzan en fa y ga 4. Si a=b entonces fa y gb están en el mismo grupo Crear un grafo dirigido cuyos nodos son los grupos encontrados en el paso 2. 2. entonces no existen funciones de precedencia Respuesta NO. gb → fa si a•>b.

Precedencia de Operador: Funciones de Precedencia Análisis Sintáctico. como el signo menos (unario y binario) No se puede tener la seguridad de que el analizador acepta exactamente el lenguaje deseado Sólo una pequeña clase de gramáticas puede analizarse Sencillez Se pueden establecer relaciones de precedencia (* precede a +) Ventajas „ „ Se aplican con otros analizadores para la parte que no son de operador . entonces g(+)=1 El camino más largo desde gId a f* a g* a f+ a f$ por tanto g(id)=5 f g Id 4 5 + 2 1 * 4 3 $ 0 0 Análisis Sintáctico Ascendente: Precedencia de Operador Inconvenientes „ Análisis Sintáctico. Como las funciones de $ no tienen arcos entonces f($)=g($)=0 El camino más largo desde g+ tiene longitud 1. entonces existen las funciones de precedencia. Procesadores de Lenguaje I „ „ Es difícil de manejar componentes léxicos con dos precedencias distintas. Procesadores de Lenguaje I No hay ciclos.

rightmost derivation. hay algunas gramáticas que los otros métodos pueden analizar y este no puede Es muy costoso de implementar El más potente Intermedio entre los dos métodos anteriores LR canónico „ „ LALR (LR con símbolo de preanálisis) „ . Procesadores de Lenguaje I Análisis Ascendente LR LR(k): Left-to-right. k símbolos de entrada son necesarios para tomar las decisiones de análisis sintáctico „ Ventajas Š Es el método de análisis por desplazamiento y reducción sin retroceso más general. a pesar de esto es igual de eficiente Š La clase de gramáticas que pueden analizarse es un supraconjunto de la clase de gramáticas que pueden analizarse con analizadores sintácticos predictivos Š Detectan los errores sintácticos tan pronto como es posible en un examen de izquierda a derecha de la entrada Š Se pueden reconocer prácticamente todas las construcciones de los lenguajes de programación descritos por una gramática G2 „ Inconvenientes Š La construcción “a mano” requiere mucho trabajo Análisis Sintáctico.Análisis Sintáctico. Procesadores de Lenguaje I Tipos de Análizadores LR LR simple (SLR) „ „ Fácil de implementar Menos poderoso.

el análisis sintáctico finaliza introduce en la pila el símbolo ai y el estado sm extrae símbolos de la pila. a1 .Análisis Sintáctico. Procesadores de Lenguaje I Modelo de un Analizador LR ENTRADA Pila a1 . s0 Programa de Análisis Sintáctico LR SALIDA Acción Ir_a Tabla de Análisis Sintáctico LR Análisis Sintáctico.... an $ sm Xm sm-1 Xm-1 . ai]= Š Š Š Š Error: Aceptar: Desplazar: Reducción: error de sintaxis acepta la entrada. Xi]= sk . Procesadores de Lenguaje I Modelo de Analizador LR El programa es el mismo para todos los analizadores LR Xi es un símbolo gramatical y cada si es un símbolo llamado estado Se utiliza el símbolo de estado y el símbolo de la entrada para indexar la tabla y determinar la acción siguiente La tabla de análisis sintácticos tiene dos partes: „ Acción[sm. ejecuta la acción semántica correspondiente a una producción „ Ir_a[sm....

.. Xm sm ai s. an$) (s0 X1 s1 X2 s2 . a] Desplazar s’ push a push s’ leer en la entrada Reducir A → β pop 2*|β| símbolos s’ símbolo en la cima de la pila s= Ir_a[s’... Procesadores de Lenguaje I Modelo de Analizador LR Configuración de un analizador sintáctico LR „ Tupla con el contenido de la pila y la entrada que resta por procesar (s0 X1 s1 X2 s2 .. ai] = reducir A → β (s0 X1 s1 X2 s2 .. Procesadores de Lenguaje I Algoritmo de Análisis LR apuntar ae al primer símbolo de w$ (s está en la cima y ae apunta al símbolo a) repetir case Acción[s.Análisis Sintáctico. Xm sm. Xm-r sm-r A s. A] y r=|β| (se extraen r símbolos no terminales y r símbolos de estados de la pila) Análisis Sintáctico. A] push A push s Aceptar Error fincaso hasta Aceptar o Error . an$) Acción[sm.. ai ai+1 .. ai ai+1 . an$) donde s=Ir_a[sm-r.. ai+1 .... ai] = desplazar s Acción[sm.

Análisis Sintáctico. E::= E·+·T E::= T T::= T·*·F T::= F F::= (·E·) F::= Id Tabla de análisis sintáctico Estado 0 1 2 3 4 5 6 7 8 9 10 11 Acción Id + d5 d6 r2 r4 d5 r6 d5 d5 d6 r1 r3 r5 * ( d4 ) $ ACP r2 r4 8 r6 d4 d4 d7 r3 r5 d11 r1 r1 r3 r3 r5 r5 r6 9 3 10 2 3 Ir_a E T 1 2 F 3 d7 r4 d4 r6 r2 r4 Análisis Sintáctico. 2. 4. 5. 3. 6. Procesadores de Lenguaje I Ejemplo de Análisis LR Gramática 1. Procesadores de Lenguaje I Ejemplo de Análisis LR Pila 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Id 5 F3 T2 T2*7 T 2 * 7 Id 5 T 2 * 7 F 10 T2 E1 E1+6 E 1 + 6 Id 5 E1+6F3 E1+6T9 E1 Entrada Id·*·Id·+·Id·$ *·Id·+·Id·$ *·Id·+·Id·$ *·Id·+·Id·$ Id·+·Id·$ +·Id·$ +·Id·$ +·Id·$ +·Id·$ Id·$ $ $ $ $ Acción d5 r6 r4 d7 d5 r6 r3 r2 d6 d5 r6 r4 r1 ACP .

β2∈Σ*.Construcción de Tabla de Análisis SLR Definiciones: „ Análisis Sintáctico. α.β1. (¡La minimización del AF!) . Procesadores de Lenguaje I Elemento del análisis sintáctico LR(0) de una gramática G (elemento. w∈Σ*T) rm rm „ Estado Š Conjunto de ítems Š Dan lugar a los estados del analizador sintáctico SLR Š El conjunto de estados: colección canónica LR(0) Los ítems son los estados de un AF que reconoce los prefijos viables Los estados son las agrupaciones de estados. Procesadores de Lenguaje I Prefijo viable Item válido para prefijo viable: A→β1•β2 es item válido de αβ1 sii: S →* αAw→*αβ1β2w (A∈ΣN. ítem) Š Producción de G con un “punto” en alguna posición del lado derecho Š El punto indica hasta donde se ha visto la producción en un momento del análisis Ejemplo: La producción A→XYZ tiene cuatro elementos: A→•XYZ A→X•YZ A→XY•Z A→XYZ• Pregunta: ¿Qué elemento genera la producción A→λ? Construcción de Tabla de Análisis SLR Definiciones: „ „ Análisis Sintáctico..

X∈(ΣT ∪ ΣN) Conjunto canónico LR(0) Añadir S’. begin Análisis Sintáctico. ΣN= (ΣN ∪ S’ ’) | S’ es el axioma Añadir S’→ S. repeat do J := J ∪ (B → • γ) . Procesadores de Lenguaje I J:=I. I≡ítem+ Función goto(I.Algoritmo: crear conjunto canónico LR(0) Entrada: „ „ „ Análisis Sintáctico. X) (ir_a). ∀ p (B → γ) ∈ P | (B → • γ) ∉ J • Ejemplo: A→ B B → id | C num | ( D ) C→+D D → id | num ¿ cierre(A→ • B) ? A→ • B B → • id | • C num | •( D ) C→•+D . until no pueden añadirse ítems a J . Procesadores de Lenguaje I Gramática ampliada G’ Función cierre(I) (clausura o cerradura). return J end for ∀ Ji (A → α•Bβ) ∈ J . P= (P ∪ S’→ S) Salida „ Gramática ampliada G’ de G „ „ Construir el conjunto canónico LR(0) Función cierre(I) function cierre(I).

X) „ Análisis Sintáctico. return J function goto(I. X) ∉ C do C := C ∪ goto(I. B→ • ( D )} ¿ goto {I. goto(I. J := J ∪ cierre(B → α X • β) . X) son los items válidos de γX J:=∅. begin end • Ejemplo: A→ B B → id | C num | ( D ) C→+D D → id | num I = {B→ • id. until no pueden añadirse más conjuntos de ítems a C. Procesadores de Lenguaje I Si I son items válidos de γ. Procesadores de Lenguaje I La función elementos proporciona la colección canónica de conjuntos de elementos de LR(0) function elementos(G’). goto(I. begin C:=cierre(S’ → • S). repeat for ∀ I ∈ C . ∀ Ii | (B → α•X β) ∈ I. X). X). X) ≠ ∅. return C end . ∀ X | goto(I.Construir el conjunto canónico LR(0) Función goto(I. ( }? B → (•D ) D → • id D → • num Algoritmo: crear conjunto canónico LR(0) Análisis Sintáctico.

Procesadores de Lenguaje I • 1.Construir el conjunto canónico LR(0) Ejemplo: Análisis Sintáctico. 2. 1. 4. 3. Procesadores de Lenguaje I El conjunto canónico define un AFD que reconoce los prefijos viables de G. 3. 5. 2. con I0 estado inicial e Ij ∀j ≠ 0 estados finales I0 I1 I2 I3 B begin tipo A id I5 I6 I7 end I8 I9 I10 C código id I4 Para cada prefijo alcanzado. G S → A B end A → tipo A → id A B → begin C C → código items LR(0): I0: S’ → •S S → •A B end A → •tipo A → •id A I4: I5: I6: I7: I8: I9: I10: A → id•A A → •tipo A → •id A S → A B•end B → begin•C C → •código A → id A• S → A B end• B → begin C• C → código• • I1: I2: I3: S’ → S• S → A•B end B → •begin C A → tipo• G’ S’ → S S → A B end A → tipo A → id A B → begin C C → código Construir el conjunto canónico LR(0) S A tipo Análisis Sintáctico. 6. 4. Ii define sus prefijos viables! . 5.

$] = aceptar „ Ir_a Š Si goto(Ii. 4.. acción[i. I1. funciones de acción e ir_a Algoritmo 1. Procesadores de Lenguaje I Construir la tabla SLR (por fin) Entrada: „ Gramática aumentada G’ Salida „ Tabla SLR. a ∈ ΣT. 2.Análisis Sintáctico.. poner las operaciones adecuadas del analizador sintáctico Las entradas no definidas son ERROR El estado inicial es el del conjunto con [S’→•S] Análisis Sintáctico. A ∈ ΣN ⇒ ir_a[i.. Procesadores de Lenguaje I Construir la tabla SLR Operaciones asociadas a los ítems „ Desplazar Š Si [A→α•aβ] ∈ Ii . a] = desplazar j „ Reducir Š Si [A→α•] ∈ Ii . goto(Ii. . A) = Ij. Construir C={I0. a) = Ij ⇒ acción[i. a] = reducir A→α „ Aceptar Š Si [S’→S•] ∈ Ii ⇒ acción[i. A] = j . In} LR(0) de G’ El estado i se construye a partir de Ii. A ≠ S’ ⇒ ∀ a ∈ SIGUIENTE(A). 3.

$]=r(S → A B end) acción[7.B]=5 acción[2.id]=d4 acción[3.begin]=r(A → id) ir_a[6.begin]=r(A → tipo) ir_a[2.id]=d4 I5: S → A B•end I6: B → begin•C C → •código I7: A → id A• I8: S → A B end• I9: B → begin C• I10: C → código• ΣN S A B C acción[9.end]=r(B → begin C) acción[10.S]=1 ir_a[0.tipo]=d3 acción[0.begin]=d6 acción[1.código]=d10 acción[5.$]=aceptar ir_a[0.A]=7 acción[4.end]=r(C → código) acción[8.A]=2 acción[0.Análisis Sintáctico.tipo]=d3 acción[4.end]=d8 Siguiente $ begin end end Análisis Sintáctico.C]=9 acción[6. Procesadores de Lenguaje I Tabla SLR Resultante acción tipo 0 1 2 3 4 5 6 7 8 9 10 d3 ir_a código $ end S 1 ACP id d4 begin A 2 B C d6 r(A → tipo) d3 d4 d8 d10 r(A → id) r(S →AB end) r(B →begin C) r(C →código) 7 5 9 . Procesadores de Lenguaje I Construir la tabla SLR ccLR(0) I0: S’ → •S S → •A B end A → •tipo A → •id A I1: S’ → S• I2: S → A•B end B → •begin C I3: A → tipo• I4: A → id•A A → •tipo A → •id A ir_a[4.

Procesadores de Lenguaje I Analizador canónico LR Motivación „ „ Tabla SLR tiene info insuficiente y pueden aparecer conflictos desplazamiento/reducción Si el estado Ii contiene [A->β•] No es adecuada siempre la reducción A->a para todos los terminales en Siguiente(A) Š Dado prefijo viable αβ con items válidos en Ii puede ser que no existan formas sentenciales αAa.Análisis Sintáctico. Procesadores de Lenguaje I Resumen El análisis sintáctico LR „ „ „ „ El análisis ascendente sin retroceso más general Utiliza una pila y una tabla de análisis Desplazamiento/Reducción La tabla SLR se obtiene haciendo el conjunto canónico LR(0) Análisis Sintáctico. con a∈Siguiente(A) Ejemplo: S → L=R S→R L → *R L → id R→L .

4. G S → L=R S→R L → *R L → id R→L items LR(0): I0: S’→ •S S → • L=R S → •R R → •L L → •*R L → •id I4: L→*•R R → •L L → •*R L → •id I5: I6: L → id • S → L = •R R → •L L → •*R L → •id • 1. 5. 2. 2. 6. 3. 4. 5. Procesadores de Lenguaje I Conjunto LR(0) Ejemplo: • 1. 3. G’ S → L=R S→R L → *R L → id R→L S’ → S I1: I2: I3: S’ → S• S → L • =R R→L• S → R• I7: I8: I9: L→*R• R → L• S → L = R• Análisis Sintáctico.Análisis Sintáctico. Procesadores de Lenguaje I Tabla de análisis LR(0) I0 S L R I1 I2 I3 = I6 I7 L R I9 * * R I4 id id I8 I5 .

= $. Procesadores de Lenguaje I Items en LR(1) Ítems: estados de AF que reconoce los Elementos con más información: [A→β1•β2.. acción acción[2. a es $) „ Estado: Š Conjunto de estados: colección canónica LR(1) Š Se aumentan los estados LR(0) .. a∈ΣT prefijos viables junto a símbolos posibles tras pivote „ „ Definición: rm rm [A→β1•β2.=]=d6 acción[2.Análisis Sintáctico.=]=r5 $ está en Siguiente(R) pero no hay ninguna derivación donde reducir L por R seguido de $ Esta información de contexto no se usa en el analizador SLR ΣN S L R Siguiente $ $.S →* αAw→αβ1β2w a es el primer símbolo de w (o si w es λ. a] con A→β1•β2∈P. = Análisis Sintáctico. a] es item válido de γ=αβ1 sii: ... I2: S → L • =R R→L• . Procesadores de Lenguaje I Conflicto en la tabla SLR! ccLR(0) ..

Análisis Sintáctico.$])? [S’→ •S. b] ∉ J do J := J ∪ [B → • γ. Procesadores de Lenguaje I J:=I. ∀b|b∈Primero(βa) rm [B→ • η. repeat for ∀ Ji [A → α•Bβ. return J end Ejemplo: S’→ S S → CC C → cC | d ¿ cierre([S’→ •S.c/d] Primero $ C$ $ c. until no pueden añadirse ítems a J .a] ∈ J . d .c/d] [C→ •d. Procesadores de Lenguaje I Items en LR(1) Construcción: varía la función cierre(I) „ [A→α•Bβ. a]∈I rm [A→α•Bβ.$] [S→ •CC. a] es item válido de γ=δα: S →* δAax→δαΒβax=γΒβax „ Para cada item B→η: S →* γηby. b] ∈ cierre(I) Construir el conjunto canónico LR(1) Función cierre(I) function cierre(I). begin Análisis Sintáctico. ∀ b∈Primero(βa) | [B → • γ. b] .$] [C→ •cC. ∀ p (B → γ) ∈ P .

Procesadores de Lenguaje I La función elementos proporciona la colección canónica de conjuntos de elementos de LR(1) function elementos(G’).c/d] Primero (λ) c (λ) d c d Algoritmo: crear conjunto canónico LR(1) Análisis Sintáctico.c/d] [C→ •d. repeat for ∀ I ∈ C . goto(I. a]) . begin C:=cierre([S’ → • S. until no pueden añadirse más conjuntos de ítems a C. J := J ∪ cierre([B → α X • β. begin end Ejemplo: S’→ S S → CC C → cC | d ¿ goto([C→ •cC.Construir el conjunto canónico LR(1) Función goto(I. X) son los items válidos de γX J:=∅. return C end . return J function goto(I. X).c)? [C→ c•C.c/d] [C→ •cC. Procesadores de Lenguaje I Si I son items válidos de γ. a] ∈ I. goto(I.c/d]. X). X) ≠ ∅. $]). ∀ Ii | [B → α•X β. ∀ X | goto(I. X) ∉ C do C := C ∪ goto(I. X) „ Análisis Sintáctico.

$] [R → L•. 5. Procesadores de Lenguaje I Estados de analizador canónico LR(1) I0 S L R I1 I2 I3 = R I9 I6 I7 * L id L id R * I10 L I11 I12 R * I4 id I8 I13 I5 .$] [L → •*R.$] [L →•id.=|$] [L → •id.=|$] [R → L•. Procesadores de Lenguaje I Conj.$] [L → •*R.=|$] [S → L = R•. $] [L → •id. LR(1) I : [S’ → S•.=|$] [S →L=•R. $] • 1.$] [L →•*R.$] [L → id•.$] [S →•R.Análisis Sintáctico.$] 1 I7: I8: I9: I10: I11: I12: [L → *R•.$] [L → * • R. 6.=|$] [R → •L.=|$] [R →•L.$] [R → •L.$] I5: I6: [L → id•.$] [S → R•. 3. 4.$] [R →•L. 2.$] [R → L•.=|$] [L → •*R. $] I13: [L → *R•.$] Análisis Sintáctico. =|$] items LR(1): I0: [S’→•S.=|$] [L → •id.$] [S →•L=R.$] [L → * • R. G’ S → L=R S→R L → *R L → id R→L S’ → S I2: I3: I4: [S → L• =R.

$] I12: [L → * • R. Procesadores de Lenguaje I Construir la tabla canónica LR Entrada: „ Gramática aumentada G’ Salida „ Tabla LR. poner las operaciones adecuadas del analizador sintáctico Las entradas no definidas son ERROR El estado inicial es el del conjunto con [S’→•S.$] [L →•*R.=] [L → •id.R)=9 ir_a(6.*)=d4 acc(4.$] I3: [S → R•. funciones de acción e ir_a Algoritmo 1.$)=r(R→L) acc(3. R)=7 ir_a(4. $] Análisis Sintáctico.$] [L → •*R. $] [L → •id.L)=10 acc(12. I1.$] [L →•id. $] I13: [L → *R•..$)=r(L →*R) .Análisis Sintáctico.$)=r(L→id) ir_a(12.$] ir_a(6.=] I8: [R → L•.S)=1 ir_a(0.$] I2: [S → L• =R. =] I5: [L → id•. Construir C={I0.$] [S →•L=R. .=)=r(L →*R) acc(8.=)=r(R →L) acc(9.=] I9: [S → L = R•.$)=r(R→L) acc(11.L)=10 acc(6.$] [S →•R.=] [R → •L.=)=d6 acc(2. Procesadores de Lenguaje I Construir la tabla canónica LR accLR(1) I0: [S’→•S.. 4.$] I1: [S’ → S•.*)=d12 acc(12.*) =d4 acc(0.$] I4: [L → * • R.id)=d5 acc(5.$] [R → •L.id)=d11 acc(13.$)=ACP acc(2. In} LR(1) de G’ El estado i se construye a partir de Ii.$] [L → •*R.$] I10: [R →L •.$] [R →•L. 2. L)=8 acc(4. 3.id)=d11 acc(7.R)=3 acc(0.=)=r(L→id) I6: [S →L=•R.$] I11: [L → id•.$)=r(S→R) ir_a(4.=] [L → •*R.L)=2 ir_a(0.*)= d12 acc(6. $] I7: [L →*R•.=] ir_a(0.$] [R → L•.id)=d5 acc(1.=] [R →•L.R)=13 ir_a(12..$)=r(S→L=R) acc(10.=] [L → •id.

a/b] „ Pueden inducirse conflictos reducción/reducción pero nunca desplazamiento/reducción Algunos errores se manifiestan más tarde Análisis Sintáctico. (s1. estado Ij contiene [A->α • β. Procesadores de Lenguaje I Analizador LALR Dos principios del analizador LALR(1) „ „ El núcleo de cualquier estado del AFD LR(1) es un estado del AFD LR(0) Si dos estados de LR(1).| goto(x2. „ Si estado Ii contiene [A->α • β. Procesadores de Lenguaje I Analizador LALR Motivación „ Utilizado en la práctica al reducir el número de estados del analizador canónico LR (mismo número que SLR) Forma estados a partir de la unión de estados de LR(1) con el mismo núcleo „ Las gramáticas LALR(1) son un subconjunto de LR(1). X)=t1 ⇒ ∃ t2.Análisis Sintáctico.X)=t2 y (t1. α].t2) mismo núcleo Corolario: el número de estados del AFD del analizador LALR(1) coincide con el AFD LR(0) . s2) tienen el mismo núcleo Š Si goto(x1. b] forma estado unión Iij con [A->α • β.

..$] [L → •*R. Hacer transiciones. . Si hay conflictos.$] [S →•L=R.$] [L →•*R. 2. la gramática no es LALR(1) La tabla ir_a se forma sobre los conjuntos resultantes de efectuar las uniones de elementos LR(1) con el mismo núcleo Análisis Sintáctico. Procesadores de Lenguaje I Construir la tabla LALR Algoritmo 1.10 5.13 I7_13: [L → *R•.=/$] I9: [S → L = R•.12 8..$] [S → R•.=/$] [L → •id.. Jm} pasan a ser los nuevos estados.$] [R →•L. Construir C={I0.=] [R →•L.$] I5_11: [L → id•. In} LR(1) de G’ Para cada núcleo en el conjunto de items LR(1).=/$] [R → •L.=/$] [L → •*R.=/$] estados LALR(1): [S’→•S. I1. =/$] I8_10: [R → L•.$] [R → L•..=] [L → •id...$] I6: [S →L=•R.Análisis Sintáctico.=/$] .$] [L →•id.$] [S → L• =R. Las acciones se generan igual que en el analizador LR. 3.$] I4_12: [L → * • R. 4.11 7. $] 4. Procesadores de Lenguaje I Ejemplo Unir estados: ¾ ¾ ¾ ¾ I0: I1: I2: I3: [S’ → S•. J1.$] [S →•R. buscar todos los conjuntos con ese núcleo y reemplazarlos por su estado unión C’={J0.

Procesadores de Lenguaje I Construir la tabla LALR accLR(1) I0: [S’→•S.$] I2: [S → L• =R.*)= d12 acc(6.$)=r(L→id) I6: [S →L=•R.$)=r(S→R) ir_a(4.*) =d4 acc(0.Análisis Sintáctico.=)=r(L →R) acc(7.=/$] [L → •*R.$] [R →•L.=/$] ir_a(0.=)=d6 acc(2.$)=r(S→L=R) .$)=r(L →R) acc(8.S)=1 ir_a(0.$] [L →•*R.=)=r(L→id) acc(5.$)=r(R→L) acc(9.id)=d11 acc(7.=/$] I9: [S → L = R•.=/$] [R → •L.$] [S →•R.$)=ACP acc(2.L)=2 ir_a(0.=] [R →•L. $] I7: [L →*R•.=)=r(R →L) acc(8.id)=d5 acc(5.R)=3 acc(0.$)=r(R→L) acc(3.$] ir_a(6. R)=7 ir_a(4.$] [S →•L=R. L)=8 acc(4.L)=10 acc(6.=/$] I8: [R → L•.$] [L →•id.R)=9 ir_a(6.$] I1: [S’ → S•.*)=d4 acc(4.$] [L → •*R.=/$] [L → •id.$] [R → L•. Procesadores de Lenguaje I Estados de analizador LALR(1) I0 S L R I1 I2 I3 = R I9 I6 I7 * L id L id R * a I5 a I4 a I8 * I4 id I8 I5 10 estados.$] I3: [S → R•.$] I4: [L → * • R.=] [L → •id. igual que SLR(1) Análisis Sintáctico. =/$] I5: [L → id•.id)=d5 acc(1.

Análisis Sintáctico. Procesadores de Lenguaje I Uso de gramáticas ambiguas Una gramática ambigua nunca puede ser LR A veces es útil emplear una gramática ambigua: „ „ Construcciones más naturales y concisas Aislar casos particulares que puede ser útil tenerlos separados Una gramática ambigua puede generar lenguaje con reglas para “deshacer la ambigüedad” „ „ Idea similar a las reglas de prioridad en gramáticas de operador Las gramáticas ambiguas sólo deben usarse de forma escasa y controlada. para asegurar qué lenguaje se reconoce Análisis Sintáctico. Versión no Ambigua: „ „ „ „ „ S→ S_emparejada | S_no_emparejada S_emparejada→ if E then S_emparejada else S_emparejada S_emparejada→ other S_no_emparejada→ if E then S S_no_emparejada→ if E then S_emparejada else S_no_emparejada . Procesadores de Lenguaje I Ejemplo 1ª gramática ambigua Sintaxis de condicional: „ „ „ S→ if E then S else S S→ if E then S S→ other Gramática ambigua.

e acc(2. 3.$)=r3 acc(3. Procesadores de Lenguaje I Conj.e)=d5 acc(4.a)=d3 acc(1.i)=d2 acc(0.$)=ACP I4: [S → iS•eS] [S → i S•] acc(4.i)=d2 acc(2. LR(0) • 1.Análisis Sintáctico. 4.e)=r3 I6: [S → iSeS •] I3: [S → a •] .e)=r2 acc(4.$)=r2 I1: I2: [S’ → S•] [S → i •SeS] [S → i •S] [S → •iSeS] [S → •iS] [S → •a] I5: [S → iSe•S] [S → •iSeS] [S → •iS] [S → •a] acc(5.i)=d3 acc(6. G’ S → iSeS S → iS S→a S’ → S items LR(0): I0: [S’ → •S] [S → •iSeS] [S → •iS] [S → •a] I4: I5: [S → iS•eS] [S → i S•] [S → iSe•S] [S → •iSeS] [S → •iS] [S → •a] I1: I2: [S’ → S•] [S → i •SeS] [S → i •S] [S → •iSeS] [S → •iS] [S → •a] I6: [S → iSeS •] I3: [S → a •] Análisis Sintáctico. 2.a)=d3 acc(3.e)=r1 acc(6.i)=d2 acc(5. Procesadores de Lenguaje I Acciones analizador SLR(1) Items LR(0)-acciones SLR (1): I0: [S’ → •S] [S → •iSeS] [S → •iS] [S → •a] acc(0.$)=r1 ΣN S Siguiente $.

Procesadores de Lenguaje I Ejemplo 2ª gramática ambigua Gramática de expresiones con sumas y productos: E::=E·+·T | T T::=T·*·F | F F::=(·E·) | Id Versión ambigua: E:=E·+·E | E·*·E | (·E·) | Id Dos ventajas: „ „ Más intuitiva Analizador más rápido al evitar reducciones F→Id. desplazamiento sobre “else” (prioridad para if más anidado) acción i 0 1 2 3 4 5 6 d2 ir_a $ S 1 ACP e a d3 G: 1. T→F Deshacer la ambigüedad con LR equivale aquí a fijar externamente la tabla de precedencia con analizador de precedencia . Procesadores de Lenguaje I Tabla SLR sin conflictos Resolución conflicto: en estado 4.Análisis Sintáctico. 2. S → iSeS S → iS S→a d2 r3 d5 d2 r1 d3 r3 r2 d3 r1 4 6 Análisis Sintáctico. 3.

2.+)=r1 acc(7.*)=d5 acc(8.$)=r2 acc(8.+.*)=r1 acc(7.Análisis Sintáctico.*)=r2 acc(8. 4.) I7: [E→E+E•] acc(7. Procesadores de Lenguaje I [E→(•E)] Conj. 5. G’ E→ E+E E→E * E E→(E) E →Id E’→E Siguiente $. 5.))=r2 acc(8.*)=d5 [E→E•+ E] [E→E• * E] ΣN S I8: [E→E*E•] [E→E•+ E] [E→E• * E] .*.+)=r2 acc(8. G’ E→ E+E E→E * E E→(E) E →Id E’→E [E→•E * E] [E→• (E)] [E →•Id] I6: I7: I8: I9: [E→(E •)] [E→E•+ E] [E→E• * E] [E→E+E•] [E→E•+ E] [E→E• * E] [E→E *E •] [E→E•+ E] [E→E•* E] [E→(E) •] I3: I4: [E→Id•] [E→E+•E] [E→•E+ E] [E→•E * E] [E→•(E)] [E→•Id] I0: [E’→•E] [E→•E+ E] [E→•E * E] [E→• (E)] [E →•Id] [E’→E•] [E→E•+ E] [E→E•* E] I5: [E→E *•E] [E→•E+ E] [E→•E * E] [E→•(E)] [E→•Id] I1: Análisis Sintáctico.+)=d4 acc(7. Procesadores de Lenguaje I Conflictos en analizador SLR • 1.$)=r1 acc(7.))=r1 acc(7. 3. 4.+)=d4 acc(8. 3. LR(0) I : [E →•E+ E] 2 • 1. 2.

*)=d5 (“*” mayor prioridad que “+”) • estado I8: • acc(8. 4.+)=r1 (“+” es asociativo por izda) • acc(7. E→ E+E E→E * E E→(E) E →Id . Procesadores de Lenguaje I Tabla SLR sin conflictos acción id 0 1 2 3 4 5 6 7 8 9 d3 d4 d3 r4 d3 d3 d4 r1 r2 r3 d5 d5 r2 r3 r4 d2 d2 d9 r1 r2 r3 r1 r2 r3 d5 d2 r4 r4 7 8 ir_a * ( d2 ACP 6 + ) $ E 1 G: 1.*)=r2 (“*” es asociativo por izda) Análisis Sintáctico. 2.* {+. 3.+)=r2 (“*” mayor prioridad que “+”) • acc(8. Procesadores de Lenguaje I Tabla SLR sin conflictos Resolución conflictos (desplaz/reducción) sobre +.Análisis Sintáctico.*} asociativos por la izquierda “*” más prioridad que “+” • estado I7: • acc(7.

Análisis Sintáctico. en lugar de Eab . Procesadores de Lenguaje I Ejemplo 3ª gramática ambigua Gramática de EQN. editor gráfico de ecuaciones: E::=E·sub·E ·sup·E E::=E·sub·E E::=E·sup·E E::={·E ·} E::=c Gramática intencionadamente ambigua por doble motivo: „ “sub” y “sup” tendrán conflictos desp/reducción: se resuelve con asociatividad (a derecha) Š Justificado por simplicidad en la gramática y eficiencia en el análisis „ La primera producción entra en conflicto desp/reducción con la segunda Š Justificación de producción “extra” porque tiene sentido semántico: b E sub a sup b representa E a .

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->