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

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

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

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

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

a]=UVW. se llama a la rutina de recuperación de error .a]= error. el analizador se detiene y anuncia el éxito del análisis X=a≠$. el programa consulta la entrada M[X. se sustituye la X de la pila por WVU (U queda como cima de la pila) Š Si M[X. LL(1) Análisis Sintáctico.a] Š Si M[X. 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. 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.Análisis Sintáctico Predictivo No Recursivo. 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]=X→Y1Y2. else error(). a:= GetToken..Yk-1.Análisis Sintáctico.. Push Yk. Repeat X=$ then If X ∈ΣT or If X=a then Pop.. Push S. Procesadores de Lenguaje I Análisis Sintáctico LL(1) Algoritmo: pila =$. a:= GetToken. until X=$ If X=$ and a=$ then Aceptar. meter$ al final de la entrada. Else error..Y1 Emitir la producción X else error().. Análisis Sintáctico. 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’ . Else If M[X.Yk then Pop.

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

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

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

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

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

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

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

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. 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 Precedencias(R2) +. (. Id *. Procesadores de Lenguaje I La tabla de precedencia se puede simplificar. Id •> + *. f(a) < g(b) si a = b. (. *. ). Id Precedencias (R1) + <• *. ). Id *. Id ). mediante dos funciones f y g Transforman los símbolos terminales en enteros Tienen que cumplir que ∀a. ). Id * <• (. Procesadores de Lenguaje I Cabecera y Último ΣN E T F Cabecera +. Id •> * Último +. con el objetivo de ahorrar memoria y aumentar la velocidad de proceso.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 .

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

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

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) „ . 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. Procesadores de Lenguaje I Tipos de Análizadores LR LR simple (SLR) „ „ Fácil de implementar Menos poderoso. 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.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.. s0 Programa de Análisis Sintáctico LR SALIDA Acción Ir_a Tabla de Análisis Sintáctico LR Análisis Sintáctico. ai]= Š Š Š Š Error: Aceptar: Desplazar: Reducción: error de sintaxis acepta la entrada.... Procesadores de Lenguaje I Modelo de un Analizador LR ENTRADA Pila a1 .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.. ejecuta la acción semántica correspondiente a una producción „ Ir_a[sm. Xi]= sk . an $ sm Xm sm-1 Xm-1 .

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

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

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

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

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

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

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

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

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

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

a] con A→β1•β2∈P. = $. a∈ΣT prefijos viables junto a símbolos posibles tras pivote „ „ Definición: rm rm [A→β1•β2.. a] es item válido de γ=αβ1 sii: . Procesadores de Lenguaje I Conflicto en la tabla SLR! ccLR(0) . = Análisis Sintáctico. a es $) „ Estado: Š Conjunto de estados: colección canónica LR(1) Š Se aumentan los estados LR(0) .=]=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 $ $.=]=d6 acción[2..Análisis Sintáctico..S →* αAw→αβ1β2w a es el primer símbolo de w (o si w es λ.. acción acción[2. I2: S → L • =R R→L• . 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 item válido de γ=δα: S →* δAax→δαΒβax=γΒβax „ Para cada item B→η: S →* γηby.a] ∈ J . until no pueden añadirse ítems a J . return J end Ejemplo: S’→ S S → CC C → cC | d ¿ cierre([S’→ •S. a]∈I rm [A→α•Bβ. b] .c/d] Primero $ C$ $ c. d . Procesadores de Lenguaje I J:=I.Análisis Sintáctico. repeat for ∀ Ji [A → α•Bβ.c/d] [C→ •d.$] [C→ •cC. ∀ b∈Primero(βa) | [B → • γ. begin Análisis Sintáctico. Procesadores de Lenguaje I Items en LR(1) Construcción: varía la función cierre(I) „ [A→α•Bβ. ∀b|b∈Primero(βa) rm [B→ • η. ∀ p (B → γ) ∈ P .$] [S→ •CC. b] ∉ J do J := J ∪ [B → • γ. b] ∈ cierre(I) Construir el conjunto canónico LR(1) Función cierre(I) function cierre(I).$])? [S’→ •S.

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

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

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

b] forma estado unión Iij con [A->α • β. 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.Análisis Sintáctico. α]. „ 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) .X)=t2 y (t1. 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). estado Ij contiene [A->α • β. 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). s2) tienen el mismo núcleo Š Si goto(x1.| goto(x2.

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

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

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

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

2.Análisis Sintáctico. 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. 3. Procesadores de Lenguaje I Tabla SLR sin conflictos Resolución conflicto: en estado 4. S → iSeS S → iS S→a d2 r3 d5 d2 r1 d3 r3 r2 d3 r1 4 6 Análisis Sintáctico. T→F Deshacer la ambigüedad con LR equivale aquí a fijar externamente la tabla de precedencia con analizador de precedencia . 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.

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

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

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 . Procesadores de Lenguaje I Ejemplo 3ª gramática ambigua Gramática de EQN.Análisis Sintáctico. en lugar de Eab .

Sign up to vote on this title
UsefulNot useful