P. 1
Análisis sintáctico.pdf

Análisis sintáctico.pdf

|Views: 43|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/26/2013

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

Analizadores Sintácticos. Problemas Descendentes „ Análisis Sintáctico. 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 .

B().Análisis Sintáctico Predictivo: Descendente Recursivo Análisis Sintáctico. } else error() } Análisis Sintáctico. 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. Procesadores de Lenguaje I Procedure B() { if (car= i) { scan(). if (car == i) then scan else error.} else error(). } else if (car== i) { scan(). else error(). } else if (car==write) {scan(). } elseif (car in [true. if (car== then) {scan(). 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(). if (car == asig) {scan(). S(). noigual]) scan().} else error(). else error(). Š 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(). B(). if (car in [igual.

. „ Conjunto PRIMERO(X) para todos los símbolos gramaticales X 1.. Id } PRIMERO(T) = { (. 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 } PRIMERO(E’) = { +. Id } PRIMERO(Id.T’ T’ ::= *. (x ∈ ΣT ∪ {λ}). 2. 3. DEFINICIONES: PRIMERO PRIMERO(α).YKY ⇒ a ∈ PRIMERO(X) si a ∈ PRIMERO(Yi) y λ ∈ PRIMERO(Y1). λ } PRIMERO(T.E.T.E’ | λ T ::= F. DEFINICIONES: PRIMERO Análisis Sintáctico.F.) | Id „ „ „ „ Análisis Sintáctico.Análisis Sintáctico Predictivo. Procesadores de Lenguaje I PRIMERO(E) = { (. 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. Ejemplo: E ::= T.T’ | λ F ::= (.. Id } PRIMERO(F) = { (.E’ E’ ::= +.*. β ∈Σ*)} 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.Id) = { Id } PRIMERO(Id) = { Id } PRIMERO(T’) = { *.. PRIMERO(Y2). PRIMERO(α)={x | (α →* xβ).Id) = { (. λ } . 4. (α.+...

) $. Ejemplo: E ::= T. 2.T. (x∈PRIMERO(β)-{λ})} Conjunto de terminales que pueden aparecer inmediatamente a la derecha de A en alguna forma sentencial.E’ | λ T ::= F. ) $. +. 3. *. β→*λ (λ ∈PRIMERO(β)) ⇒ SIGUIENTE(B) = SIGUIENTE(A) ∪ SIGUIENTE(B) Repetir hasta que no cambie ningún conjunto SIGUIENTE Algoritmo 1. DEFINICIONES: SIGUIENTE SIGUIENTE(A).F. ) $. DEFINICIONES: SIGUIENTE Conjunto SIGUIENTE(A) „ „ Análisis Sintáctico.E’ E’ ::= +.Análisis Sintáctico Predictivo. 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β | β=λ. (A∈ΣN). + $.E. (β∈Σ+).T’ | λ F ::= (. ). (α∈Σ*). Procesadores de Lenguaje I . Procesadores de Lenguaje I SIGUIENTE(A)={x|(S→*α·A·β).) | Id ΣN E E’ F T T’ SIGUIENTE $. +. 4. Análisis Sintáctico Predictivo. ) Análisis Sintáctico.T’ T’ ::= *.

de forma descendente? Si A::= α | β ⇒ Š PRIMERO(α) ∩ PRIMERO(β) = ∅. con solo mirar el siguiente elemento de la entrada. 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. el conjunto PRIMERO de todas sus alternativas debe ser disjunto „ No puede haber múltiples alternativas nulas Š ∀N∈ΣN. para ningún terminal a tanto α y β derivan a la vez cadenas que comiencen con a Š No puede ocurrir que α →*λ y β →*λ Š Si β →*λ. Procesadores de Lenguaje I No puede haber conflictos PRIMERO/PRIMERO Š ∀N∈ΣN. solo pueden tener una producción N→*λ „ No puede haber conflictos PRIMERO/SIGUIENTE Š ∀N∈ΣN. con una alternativa nula. Procesadores de Lenguaje I ¿Que debe cumplir una gramática para que pueda ser reconocida sin retroceso.Análisis Sintáctico Predictivo: Condiciones Pregunta: „ Análisis Sintáctico. 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 .

E’ F.E’ | λ T ::= F.a)= α Si λ ∈ PRIMERO(α) Entonces ForAll b ∈ SIGUIENTE(A) do tabla(A. 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.) + +.T.b)= α ForAll A∈ΣN y c∈ΣT do If tabla(A.F. Procesadores de Lenguaje I Sea A→α con a∈ΣT | a∈PRIMERO(α).E’ F.T’ λ Id *.T’ (.c)= ∅ Then tabla(A.E’ E’ ::= +.T’ | λ F ::= (.E’ ) λ Análisis Sintáctico.T’ λ * ( T.E. Procesadores de Lenguaje I $ λ λ E E’ T T’ F .F.) | Id Id T.c)= error Análisis Sintáctico Predictivo: Tabla de Análisis Sintáctico Ejemplo E ::= T.E.T’ T’ ::= *.Análisis Sintáctico Predictivo: Tabla de Análisis Sintáctico Funcionamiento „ Análisis Sintáctico.T.

a] Š Si M[X. 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=$.Análisis Sintáctico Predictivo No Recursivo. el analizador se detiene y anuncia el éxito del análisis X=a≠$. se sustituye la X de la pila por WVU (U queda como cima de la pila) Š Si M[X.a]=UVW. se llama a la rutina de recuperación de error . el analizador saca X de la pila y mueve el apuntador de la entrada al siguiente símbolo de entrada X∈ΣN. LL(1) Análisis Sintáctico. LL(1) Análisis Sintáctico.a]= error. 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. el programa consulta la entrada M[X.

Análisis Sintáctico. meter$ al final de la entrada..Yk then Pop.Y1 Emitir la producción X else error().a]=X→Y1Y2.. else error(). Procesadores de Lenguaje I Análisis Sintáctico LL(1) Algoritmo: pila =$.. a:= GetToken.Análisis Sintáctico. Repeat X=$ then If X ∈ΣT or If X=a then Pop. until X=$ If X=$ and a=$ then Aceptar. Else error. Else If M[X. Push Yk. Push S.. 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’ .Yk-1.. a:= GetToken.

| * | / Si es G.B. 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.Análisis Sintáctico. Procesadores de Lenguaje I Para una pequeña clase de gramáticas se puede construir con facilidad. de operadores E→EAE | (E) | -E | id A→+ | . de operadores E→E+E | E-E | E*E | E/E | (E) | -E | id .C ∈ΣN Ejemplo No es G. a mano. 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. 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. se traza una derivación por la derecha en sentido inverso Análisis Sintáctico Ascendente: Gramática de Operadores Análisis Sintáctico.

a partir de ese punto. 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 = ) •> $ .Precedencia de Operador: Relaciones de Precedencia „ „ „ Análisis Sintáctico. el primer <• Reducir el pivote que se encuentra en el medio Reinsertar las relaciones de precedencia.

opAnterior) else Error until true . a) then PushOperador (a). a:=GetToken. a: =GetToken. else repeat opAnterior= PopOperador aplicar opAnterior a pilaOperandos until (cimaOperadores <. 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. hasta encontrar la relación de precedencia mayor. repeat if a=$ y cimaOperadores=$ then return if a es Operando then PushOperando (a). poner $ al final de la entrada. a) o (cimaOperandos =. Cada operador extraído se aplica a los operandos más arriba de la pila de operandos Análisis Sintáctico. a:= GetToken. else if (cimaOperandos <.Precedencia de Operador: Evaluador de Expresiones „ „ Análisis Sintáctico. entonces arranca la reducción del pivote. Procesadores de Lenguaje I Evaluación de Expresiones Algoritmo de evaluación de expresiones: pilaOperadores = $.

Idd Ida. Idb .Idd)$ $ (Idb·+·Idc . Idb . Idb 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. Idb+Idc*Idd Ida.*. Idc Ida. Idc Ida. Idb . Procesadores de Lenguaje I Pila Operandos ∅ Ida Ida Ida Ida.Idd)$ $*( Idc . Idc Ida . Idd)$ $ .*.Idd)$ $* Idb·+·Idc .*.*. Idc*Idd Ida. Idb. Idb . Idc. Idb Ida.*. Idb+Idc*Idd Ida*(Idb+Idc*Idd) .*.Idd)$ $*( ·+·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.*.(Idb·+·Idc .(Idb·+·Idc.Idd)$ $*(+ Idd)$ $*(+* )$ $*(+* )$ $*(+ )$ $*( $ $*() $ $ Análisis Sintáctico.*.Idd)$ $*(+ . Idb Ida.Análisis Sintáctico Ascendente: Precedencia de Operador Entrada: „ Análisis Sintáctico.

Idd$ . θ<•Id. $<• (. Idd$ ).+. Idd$ . (=). Idd$ . 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 θ<•(.+.+. (<• (.+. )•>θ.(Idb·+·Idc). Idd$ . Idd$ Idd$ $ $ Análisis Sintáctico. )•>$ . entonces hacer: „ „ Análisis Sintáctico.*. Idd$ ). Id•>$.+. Idd$ (Idb·+·Idc). Id•>θ $<• θ. θ•>) )•>) Resto: (<•Id.+·Idc).+. Idd$ .+.+.+. $<•Id.Análisis Sintáctico Ascendente: Precedencia de Operador Entrada: Id*(Id+Id)+Id Entrada Ida.+.*. θ•>$. Idd$ Idb·+·Idc).+. (<•θ. 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). Idd$ Idc).(Idb·+·Idc). Id•>).

.Precedencia de Operador: Operadores Unarios (¬) „ Análisis Sintáctico.xBy. B →+. B∈{N ∪ λ} 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. 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. Š Ejemplo: Es el menos unario si antes el componente léxico leído era un operador....xB..... recordando el componente léxico anterior debe distinguir uno de otro. un paréntesis izquierdo..... Procesadores de Lenguaje I sii existe: sii existe: A →. B →+ Cy...xC C∈{N ∪ λ} ..By.. C∈{N ∪ λ} x <• y „ „ x •> y „ „ sii existe: A →.

β ∈ Σ* Si existe más de una relación de precedencia entre dos símbolos terminales. 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. 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. α. a ∈ ΣT. b •> a ∀ (A::= α·a·β·b·γ) ∈ P. A. C ∈ ΣN. Procesadores de Lenguaje I (A::= α·B·a·C·β) ∈ P. a=b .Precedencia de Operador: Calcular la Tabla de Precedencia Definiciones: „ Análisis Sintáctico. b ∈ ΣT. B. B. β ∈ Σ*. 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)={+. A. *. 2. C ∈ ΣN. *. β ∈ Σ* ∀c ∈ Cabecera(C). a. Análisis Sintáctico. a <• c ∀b ∈ Último(B). ). (. 2 y 3 ForAll a ∈ Cabecera(S) do $ <• a ForAll a ∈ Último(S) do a •> $ . Id} Ejemplo: Propiedad: „ ∀(A::= α·B·a·C·β) ∈ P. a ∈ ΣT. Id} Último(E)={+. 3. α.

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

Procesadores de Lenguaje I <• <• <• + •> •> •> <• g+ * •> <• •> <• g$ $ •> •> •> Cada símbolo está solo en un grupo fId f* f+ f$ . Análisis Sintáctico. fa → gb Respuesta SI. 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. gb → fa si a•>b. entonces no existen funciones de precedencia Respuesta NO. Ciclos en el grafo: Š Š Precedencia de Operador: Funciones de Precedencia Ejemplo Id Id + * $ gId g* Análisis Sintáctico. los arcos se etiquetan: Š Š si a<•b.Precedencia de Operador: Funciones de Precedencia 1. entonces f(a) y g(a) son los caminos más largos que comienzan en fa y ga 4. 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.

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 .Precedencia de Operador: Funciones de Precedencia Análisis Sintáctico. Procesadores de Lenguaje I „ „ Es difícil de manejar componentes léxicos con dos precedencias distintas. 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. Procesadores de Lenguaje I No hay ciclos. entonces existen las funciones de precedencia.

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) „ . rightmost derivation. 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. 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. Procesadores de Lenguaje I Análisis Ascendente LR LR(k): Left-to-right. Procesadores de Lenguaje I Tipos de Análizadores LR LR simple (SLR) „ „ Fácil de implementar Menos poderoso.

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. a1 . el análisis sintáctico finaliza introduce en la pila el símbolo ai y el estado sm extrae símbolos de la pila.. an $ sm Xm sm-1 Xm-1 . Xi]= sk . ejecuta la acción semántica correspondiente a una producción „ Ir_a[sm.Análisis Sintáctico.. 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..... ai]= Š Š Š Š Error: Aceptar: Desplazar: Reducción: error de sintaxis acepta la entrada.

... an$) Acción[sm. A] y r=|β| (se extraen r símbolos no terminales y r símbolos de estados de la pila) Análisis Sintáctico. Xm sm.. an$) (s0 X1 s1 X2 s2 .... 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 ai+1 . Xm-r sm-r A s. 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. 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’.Análisis Sintáctico. Xm sm ai s. ai+1 . ai] = desplazar s Acción[sm.... ai ai+1 . ai] = reducir A → β (s0 X1 s1 X2 s2 . A] push A push s Aceptar Error fincaso hasta Aceptar o Error . an$) donde s=Ir_a[sm-r..

Análisis Sintáctico. 2. 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. Procesadores de Lenguaje I Ejemplo de Análisis LR Gramática 1. 6. 4. 5. 3. 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 .

Construcción de Tabla de Análisis SLR Definiciones: „ Análisis Sintáctico. Procesadores de Lenguaje I Elemento del análisis sintáctico LR(0) de una gramática G (elemento. í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.β1..β2∈Σ*. 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. (¡La minimización del AF!) .

Procesadores de Lenguaje I J:=I. begin Análisis Sintáctico. 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). Procesadores de Lenguaje I Gramática ampliada G’ Función cierre(I) (clausura o cerradura). until no pueden añadirse ítems a J . X) (ir_a). repeat do J := J ∪ (B → • γ) .Algoritmo: crear conjunto canónico LR(0) Entrada: „ „ „ Análisis Sintáctico. return J end for ∀ Ji (A → α•Bβ) ∈ J . ΣN= (ΣN ∪ S’ ’) | S’ es el axioma Añadir S’→ S. ∀ 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 . I≡ítem+ Función goto(I. X∈(ΣT ∪ ΣN) Conjunto canónico LR(0) Añadir S’.

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

5. Procesadores de Lenguaje I El conjunto canónico define un AFD que reconoce los prefijos viables de G. 3. 4. 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. Procesadores de Lenguaje I • 1. 1. 2. 5. 3. Ii define sus prefijos viables! . 6. 2. 4.Construir el conjunto canónico LR(0) Ejemplo: Análisis Sintáctico. 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.

4. Procesadores de Lenguaje I Construir la tabla SLR Operaciones asociadas a los ítems „ Desplazar Š Si [A→α•aβ] ∈ Ii . A] = j . a ∈ ΣT. a) = Ij ⇒ acción[i. Procesadores de Lenguaje I Construir la tabla SLR (por fin) Entrada: „ Gramática aumentada G’ Salida „ Tabla SLR.$] = aceptar „ Ir_a Š Si goto(Ii. a] = reducir A→α „ Aceptar Š Si [S’→S•] ∈ Ii ⇒ acción[i. Construir C={I0. . 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... In} LR(0) de G’ El estado i se construye a partir de Ii. A ∈ ΣN ⇒ ir_a[i.. funciones de acción e ir_a Algoritmo 1. A ≠ S’ ⇒ ∀ a ∈ SIGUIENTE(A).Análisis Sintáctico. A) = Ij. 3. acción[i. goto(Ii. a] = desplazar j „ Reducir Š Si [A→α•] ∈ Ii . I1. 2.

end]=d8 Siguiente $ begin end end Análisis Sintáctico.Análisis Sintáctico. 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.A]=2 acción[0.A]=7 acción[4.$]=aceptar ir_a[0.B]=5 acción[2.C]=9 acción[6.end]=r(B → begin C) acción[10.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(C → código) acción[8.id]=d4 acción[3. 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 .código]=d10 acción[5.$]=r(S → A B end) acción[7.begin]=d6 acción[1.tipo]=d3 acción[4.S]=1 ir_a[0.begin]=r(A → id) ir_a[6.begin]=r(A → tipo) ir_a[2.tipo]=d3 acción[0.

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 .

Análisis Sintáctico. 6. 4. 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. 3. Procesadores de Lenguaje I Conjunto LR(0) Ejemplo: • 1. 5. 2. 2. 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. 3. 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 . 5.

a] con A→β1•β2∈P. Procesadores de Lenguaje I Items en LR(1) Ítems: estados de AF que reconoce los Elementos con más información: [A→β1•β2. a es $) „ Estado: Š Conjunto de estados: colección canónica LR(1) Š Se aumentan los estados LR(0) .S →* αAw→αβ1β2w a es el primer símbolo de w (o si w es λ.=]=d6 acción[2. = $.=]=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 $ $.. acción acción[2. Procesadores de Lenguaje I Conflicto en la tabla SLR! ccLR(0) . = Análisis Sintáctico. a∈ΣT prefijos viables junto a símbolos posibles tras pivote „ „ Definición: rm rm [A→β1•β2.Análisis Sintáctico.... a] es item válido de γ=αβ1 sii: .. I2: S → L • =R R→L• .

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

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

$] 1 I7: I8: I9: I10: I11: I12: [L → *R•. 2. $] [L → •id. 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 . 6.$] [S →•R. =|$] items LR(1): I0: [S’→•S.$] [L →•*R.$] [L → •*R.$] I5: I6: [L → id•.$] [R → L•.=|$] [R →•L.$] [R →•L. LR(1) I : [S’ → S•.=|$] [L → •*R. Procesadores de Lenguaje I Conj.=|$] [S →L=•R. G’ S → L=R S→R L → *R L → id R→L S’ → S I2: I3: I4: [S → L• =R.$] [S →•L=R.$] [L → * • R. 4.Análisis Sintáctico.$] [L → id•.=|$] [R → L•.$] [R → L•. 3.=|$] [S → L = R•. $] • 1. 5.=|$] [L → •id.$] [S → R•.$] Análisis Sintáctico. $] I13: [L → *R•.$] [L → •*R.$] [R → •L.$] [L →•id.=|$] [L → •id.$] [L → * • R.=|$] [R → •L.

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

estado Ij contiene [A->α • β.t2) mismo núcleo Corolario: el número de estados del AFD del analizador LALR(1) coincide con el AFD LR(0) . „ Si estado Ii contiene [A->α • β.X)=t2 y (t1. s2) tienen el mismo núcleo Š Si goto(x1. 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. b] forma estado unión Iij con [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). (s1.| goto(x2.Análisis Sintáctico. X)=t1 ⇒ ∃ t2. 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). α].

Si hay conflictos.$] I5_11: [L → id•. Hacer transiciones. I1.Análisis Sintáctico.=] [R →•L.12 8..=/$] [R → •L..=] [L → •id.. 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.=/$] [L → •*R.$] I4_12: [L → * • R. Las acciones se generan igual que en el analizador LR.. Construir C={I0.=/$] .$] [R →•L. .$] [S → R•.=/$] [L → •id. buscar todos los conjuntos con ese núcleo y reemplazarlos por su estado unión C’={J0.$] [R → L•. 3. 4. . Procesadores de Lenguaje I Ejemplo Unir estados: ¾ ¾ ¾ ¾ I0: I1: I2: I3: [S’ → S•.=/$] estados LALR(1): [S’→•S.$] [L →•*R.10 5.. In} LR(1) de G’ Para cada núcleo en el conjunto de items LR(1).13 I7_13: [L → *R•. $] 4.$] [S → L• =R. Jm} pasan a ser los nuevos estados..$] [S →•R.$] [S →•L=R.=/$] I9: [S → L = R•.11 7. J1.$] I6: [S →L=•R. =/$] I8_10: [R → L•.$] [L →•id. 2.$] [L → •*R. Procesadores de Lenguaje I Construir la tabla LALR Algoritmo 1.

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

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.Análisis Sintáctico. 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. 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 .

3.i)=d2 acc(5. LR(0) • 1. 2.a)=d3 acc(3.i)=d2 acc(0.$)=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.$)=r1 ΣN S Siguiente $.a)=d3 acc(1.i)=d2 acc(2.$)=ACP I4: [S → iS•eS] [S → i S•] acc(4.e acc(2.e)=d5 acc(4. 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. Procesadores de Lenguaje I Conj. 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. 4.e)=r1 acc(6.e)=r3 I6: [S → iSeS •] I3: [S → a •] .e)=r2 acc(4.$)=r3 acc(3.i)=d3 acc(6.Análisis Sintáctico.

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. Procesadores de Lenguaje I Tabla SLR sin conflictos Resolución conflicto: en estado 4.Análisis Sintáctico. S → iSeS S → iS S→a d2 r3 d5 d2 r1 d3 r3 r2 d3 r1 4 6 Análisis Sintáctico. 3. 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 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. 2.

) I7: [E→E+E•] acc(7. 4. 5.+)=r1 acc(7.$)=r1 acc(7. 4. 2.))=r1 acc(7.*)=r2 acc(8. 3.*)=d5 acc(8.))=r2 acc(8. 3.Análisis Sintáctico.+)=d4 acc(8.+)=r2 acc(8. Procesadores de Lenguaje I [E→(•E)] Conj. LR(0) I : [E →•E+ E] 2 • 1.+)=d4 acc(7. 5.$)=r2 acc(8.*)=r1 acc(7. 2. Procesadores de Lenguaje I Conflictos en analizador SLR • 1.*)=d5 [E→E•+ E] [E→E• * E] ΣN S I8: [E→E*E•] [E→E•+ E] [E→E• * E] .*.+. G’ E→ E+E E→E * E E→(E) E →Id E’→E Siguiente $. 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.

Procesadores de Lenguaje I Tabla SLR sin conflictos Resolución conflictos (desplaz/reducción) sobre +.+)=r2 (“*” mayor prioridad que “+”) • acc(8.+)=r1 (“+” es asociativo por izda) • acc(7.*)=r2 (“*” es asociativo por izda) Análisis Sintáctico.* {+. 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.*} asociativos por la izquierda “*” más prioridad que “+” • estado I7: • acc(7. 4. E→ E+E E→E * E E→(E) E →Id . 2.Análisis Sintáctico.*)=d5 (“*” mayor prioridad que “+”) • estado I8: • acc(8. 3.

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 .Análisis Sintáctico. en lugar de Eab .

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)//-->