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 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. 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 Procedure B() { if (car= i) { scan(). else error(). } else error() } Análisis Sintáctico. Š 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 == i) then scan else error. if (car == asig) {scan(). B(). S(). false]) scan(). if (car in [igual. } .} else error(). B(). else error().} else error(). noigual]) scan(). } else if (car==write) {scan().Análisis Sintáctico Predictivo: Descendente Recursivo Análisis Sintáctico. } else 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(). } elseif (car in [true. if (car== then) {scan(). Procesadores de Lenguaje I Se ejecuta un conjunto de procedimientos recursivos para procesar la entrada A cada NO Terminal de una gramática se le asocia un procedimiento „ Decide la producción que utilizará analizando el símbolo de preanálisis. B().

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

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

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. 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. 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 .Análisis Sintáctico Predictivo: Condiciones Pregunta: „ Análisis Sintáctico. solo pueden tener una producción N→*λ „ No puede haber conflictos PRIMERO/SIGUIENTE Š ∀N∈ΣN. con una alternativa nula. 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(β) = ∅. Procesadores de Lenguaje I No puede haber conflictos PRIMERO/PRIMERO Š ∀N∈ΣN.

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

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

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

B. a mano. de operadores E→E+E | E-E | E*E | E/E | (E) | -E | id . Reducir una cadena de entrada w al símbolo inicial de la gramática (axioma) En cada paso de reducción se sustituye una subcadena que concuerde con el lado derecho de una producción por el símbolo del lado izquierdo. 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.Análisis Sintáctico. 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.C ∈ΣN Ejemplo No es G. 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→+ | .| * | / Si es G.

Procesadores de Lenguaje I Se definen tres relaciones de precedencia disjuntas a<•b si a tiene menos precedencia que b a=b si a tiene igual precedencia que b a•>b si a tiene más precedencia que b Algoritmo Sustituir todos los símbolos no terminales por un único símbolo Insertar $ al principio y al final de la cadena de entrada Insertar las relaciones de precedencia en la cadena de entrada Mientras entrada≠$S$ hacer Recorrer entrada desde la izquierda hasta encontrar •> Buscar a la izquierda. 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. a partir de ese punto. ignorando los no terminales Precedencia de Operador: Ejemplo Análisis Sintáctico.

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

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

)•>$ . Idd$ .+. Idd$ .+.Análisis Sintáctico Ascendente: Precedencia de Operador Entrada: Id*(Id+Id)+Id Entrada Ida.+. $<•Id.+. Idd$ .*.*.+. Idd$ Idb·+·Idc). θ<•Id. Idd$ ). Idd$ .+.+. (<•θ. Idd$ ).+. entonces hacer: „ „ Análisis Sintáctico.+·Idc).(Idb·+·Idc). Idd$ . Idd$ Idc). $<• (. θ•>$. Idd$ (Idb·+·Idc).+. Procesadores de Lenguaje I θ1 •>θ2 y θ2 •> θ1 si son asociativos por la izquierda θ1 <•θ2 y θ2 <• θ1 si son asociativos por la derecha θ<•(. θ•>) )•>) Resto: (<•Id.(Idb·+·Idc). Id•>).+. Id•>$.+. Id•>θ $<• θ. (=). (<• (. Idd$ Idd$ $ $ Análisis Sintáctico. )•>θ. 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).

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

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

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

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

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 . 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.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. Procesadores de Lenguaje I „ „ Es difícil de manejar componentes léxicos con dos precedencias distintas. entonces existen las funciones de precedencia.

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

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

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

Análisis Sintáctico. 2. 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 . 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. 4. 6. Procesadores de Lenguaje I Ejemplo de Análisis LR Gramática 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. Procesadores de Lenguaje I Prefijo viable Item válido para prefijo viable: A→β1•β2 es item válido de αβ1 sii: S →* αAw→*αβ1β2w (A∈ΣN. ítem) Š Producción de G con un “punto” en alguna posición del lado derecho Š El punto indica hasta donde se ha visto la producción en un momento del análisis Ejemplo: La producción A→XYZ tiene cuatro elementos: A→•XYZ A→X•YZ A→XY•Z A→XYZ• Pregunta: ¿Qué elemento genera la producción A→λ? Construcción de Tabla de Análisis SLR Definiciones: „ „ Análisis Sintáctico. α. (¡La minimización del AF!) ..β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.β1.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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