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

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

PRIMERO(Y2).+. 2... 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. 4. „ Conjunto PRIMERO(X) para todos los símbolos gramaticales X 1. (α.T. Id } PRIMERO(E’) = { +.T’ | λ F ::= (.F.Id) = { Id } PRIMERO(Id) = { Id } PRIMERO(T’) = { *.T’ T’ ::= *..E. Procesadores de Lenguaje I Si α es una cadena de símbolos gramaticales.*. Procesadores de Lenguaje I PRIMERO(E) = { (. DEFINICIONES: PRIMERO PRIMERO(α). PRIMERO(α)={x | (α →* xβ). Ejemplo: E ::= T. DEFINICIONES: PRIMERO Análisis Sintáctico.Análisis Sintáctico Predictivo.E’ E’ ::= +. (x ∈ ΣT ∪ {λ}).. 3. Id } PRIMERO(Id. Id } PRIMERO(F) = { (..YKY ⇒ a ∈ PRIMERO(X) si a ∈ PRIMERO(Yi) y λ ∈ PRIMERO(Y1). Id } PRIMERO(T) = { (.Id) = { (. λ } PRIMERO(T.E’ | λ T ::= F.) | Id „ „ „ „ Análisis Sintáctico.. PRIMERO(α) es el conjunto de terminales que inician las cadenas derivadas de α. λ } . β ∈Σ*)} 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. 3. Ejemplo: E ::= T. β→*λ (λ ∈PRIMERO(β)) ⇒ SIGUIENTE(B) = SIGUIENTE(A) ∪ SIGUIENTE(B) Repetir hasta que no cambie ningún conjunto SIGUIENTE Algoritmo 1.E’ E’ ::= +.Análisis Sintáctico Predictivo. DEFINICIONES: SIGUIENTE SIGUIENTE(A). *.) | Id ΣN E E’ F T T’ SIGUIENTE $.T’ T’ ::= *.T. (x∈PRIMERO(β)-{λ})} Conjunto de terminales que pueden aparecer inmediatamente a la derecha de A en alguna forma sentencial.E’ | λ T ::= F. 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β | β=λ. ) $. ) $. + $. (β∈Σ+). 2. (α∈Σ*). Análisis Sintáctico Predictivo.E. 4. ).T’ | λ F ::= (. DEFINICIONES: SIGUIENTE Conjunto SIGUIENTE(A) „ „ Análisis Sintáctico. +. +. Procesadores de Lenguaje I SIGUIENTE(A)={x|(S→*α·A·β). ) $. (A∈ΣN). Procesadores de Lenguaje I .F.

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

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

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

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

de operadores E→E+E | E-E | E*E | E/E | (E) | -E | id . 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→+ | .B. 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.Análisis Sintáctico. a mano. se traza una derivación por la derecha en sentido inverso Análisis Sintáctico Ascendente: Gramática de Operadores Análisis Sintáctico. 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.C ∈ΣN Ejemplo No es G.| * | / Si es G.

a partir de ese punto. 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 = ) •> $ . 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.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.

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

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

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

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

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

Id *. ). Id (. Id Precedencias (R1) + <• *. 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. 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 •> * Último +. Id Tabla Regla E::=E+T T::=T*F Precedencia de Operador: Funciones de Precedencia Análisis Sintáctico. f(a) = g(b) si a •> b. (. (. ). *.Ejemplo Calculo de Tabla de Precedencia Gramática E::=E·+·T | T T::=T·*·F | F F::=(·E·) | Id Análisis Sintáctico. con el objetivo de ahorrar memoria y aumentar la velocidad de proceso. ). ). Id •> + *. Procesadores de Lenguaje I Cabecera y Último ΣN E T F Cabecera +. Id * <• (. Id Precedencias(R2) +. Id *. f(a) < g(b) si a = b. Id ). (. *.

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

Precedencia de Operador: Funciones de Precedencia Análisis Sintáctico. 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. entonces existen las funciones de precedencia. 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 . Procesadores de Lenguaje I „ „ Es difícil de manejar componentes léxicos con dos precedencias distintas. Procesadores de Lenguaje I No hay ciclos. Como las funciones de $ no tienen arcos entonces f($)=g($)=0 El camino más largo desde g+ tiene longitud 1.

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

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 ...Análisis Sintáctico.. 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. 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. Procesadores de Lenguaje I Modelo de un Analizador LR ENTRADA Pila a1 .. ai]= Š Š Š Š Error: Aceptar: Desplazar: Reducción: error de sintaxis acepta la entrada. ejecuta la acción semántica correspondiente a una producción „ Ir_a[sm...

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

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 . 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. 3.Análisis Sintáctico. 6. 4. 2. 5.

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. α.β2∈Σ*.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. 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. (¡La minimización del AF!) .

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

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

Procesadores de Lenguaje I El conjunto canónico define un AFD que reconoce los prefijos viables de G. 2. 5. 2. Ii define sus prefijos viables! . 1. 5. 6. 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. 4. 3. 3.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. Procesadores de Lenguaje I • 1.

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

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

con a∈Siguiente(A) Ejemplo: S → L=R S→R L → *R L → id R→L . 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. 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.

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

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

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

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

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

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

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

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

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

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. para asegurar qué lenguaje se reconoce 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.

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

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.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. 2. 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 .

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

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

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

Sign up to vote on this title
UsefulNot useful