diff options
| author | Juan Marín Noguera <juan.marinn@um.es> | 2020-07-18 17:16:42 +0200 |
|---|---|---|
| committer | Juan Marín Noguera <juan.marinn@um.es> | 2020-07-18 17:16:42 +0200 |
| commit | 3c74a2a5da72f6d80cc20ed0d5fbb41cf0c3b827 (patch) | |
| tree | 3226e1ff6799e24fe3557e6ea50c351a14dd6464 | |
| parent | 258b3b63e4e68cfda6a5b8e086910cc384f10d47 (diff) | |
Compiladores
| -rw-r--r-- | cc/n.lyx | 17 | ||||
| -rw-r--r-- | cc/n1.lyx | 206 | ||||
| -rw-r--r-- | cc/n3.lyx | 5364 |
3 files changed, 5580 insertions, 7 deletions
@@ -9,6 +9,9 @@ \input{spec} \end_preamble \use_default_options true +\begin_modules +algorithm2e +\end_modules \maintain_unincluded_children false \language spanish \language_package default @@ -167,5 +170,19 @@ filename "n2.lyx" \end_layout +\begin_layout Chapter +Análisis sintáctico +\end_layout + +\begin_layout Standard +\begin_inset CommandInset include +LatexCommand input +filename "n3.lyx" + +\end_inset + + +\end_layout + \end_body \end_document @@ -744,12 +744,204 @@ cargador Jerarquía de lenguajes de Chomsky \end_layout +\begin_layout Standard +Una +\series bold +gramática +\series default + es una tupla +\begin_inset Formula $G:=(V_{N},V_{T},P,S)$ +\end_inset + + donde +\begin_inset Formula $V_{N}$ +\end_inset + + es un alfabeto de símbolos +\series bold +no terminales +\series default +, +\begin_inset Formula $V_{T}$ +\end_inset + + es un alfabeto de +\series bold +símbolos terminales +\series default + disjunto de +\begin_inset Formula $V_{N}$ +\end_inset + +, +\begin_inset Formula $P$ +\end_inset + + es un conjunto finito de +\series bold +reglas de producción +\series default + de la forma +\begin_inset Formula $\alpha\to\beta$ +\end_inset + + con +\begin_inset Formula $\alpha,\beta\in(V_{N}\cup V_{T})^{*}$ +\end_inset + + y +\begin_inset Formula $S\in V_{N}$ +\end_inset + + es el +\series bold +símbolo inicial +\series default +. + +\end_layout + +\begin_layout Standard +Para +\begin_inset Formula $\alpha,\beta\in(V_{N}\cup V_{T})^{*}$ +\end_inset + +, +\begin_inset Formula $\alpha$ +\end_inset + + +\series bold +deriva directamente +\series default + en +\begin_inset Formula $\beta$ +\end_inset + +, +\begin_inset Formula $\alpha\Rightarrow\beta$ +\end_inset + +, si existen +\begin_inset Formula $\delta,\gamma,\mu,\sigma\in(V_{N}\cup V_{T})^{*}$ +\end_inset + + tales que +\begin_inset Formula $\alpha=\delta\gamma\mu$ +\end_inset + +, +\begin_inset Formula $\beta=\delta\sigma\mu$ +\end_inset + + y +\begin_inset Formula $\gamma\to\sigma\in P$ +\end_inset + +. + Si +\begin_inset Formula $\alpha=:\gamma_{0}\Rightarrow\dots\Rightarrow\gamma_{n}:=\beta$ +\end_inset + +, +\begin_inset Formula $(\gamma_{0},\dots,\gamma_{n})$ +\end_inset + + es una +\series bold +derivación +\series default + de +\series bold +longitud +\series default + +\begin_inset Formula $n$ +\end_inset + + de +\begin_inset Formula $\alpha$ +\end_inset + + a +\begin_inset Formula $\beta$ +\end_inset + +, y en particular +\begin_inset Formula $(\alpha)$ +\end_inset + + es una derivación de longitud 0 de +\begin_inset Formula $\alpha$ +\end_inset + + a +\begin_inset Formula $\alpha$ +\end_inset + +. + Decimos que +\begin_inset Formula $\alpha$ +\end_inset + + deriva en +\begin_inset Formula $\beta$ +\end_inset + +, +\begin_inset Formula $\alpha\Rightarrow^{*}\beta$ +\end_inset + +, si existe una derivación de +\begin_inset Formula $\alpha$ +\end_inset + + a +\begin_inset Formula $\beta$ +\end_inset + +, y que +\begin_inset Formula $\alpha\Rightarrow^{+}\beta$ +\end_inset + + si dicha derivación se puede tomar de longitud positiva. + +\end_layout + +\begin_layout Standard +Una +\series bold +forma sentencial +\series default + es un elemento de +\begin_inset Formula $D(G):=\{\alpha\in(V_{N}\cup V_{T})^{*}:S\Rightarrow^{*}\alpha\}$ +\end_inset + +, y una +\series bold +sentencia +\series default + es un elemento de +\begin_inset Formula ${\cal L}(G):=D(G)\cap V_{T}^{*}$ +\end_inset + +, el +\series bold +lenguaje definido +\series default + por la gramática. +\end_layout + +\begin_layout Standard +Tipos de lenguajes: +\end_layout + \begin_layout Itemize \series bold Tipo 0 \series default -, gramáticas +, definidos por gramáticas \series bold sin restricciones \series default @@ -774,7 +966,7 @@ con estructura de frase \series bold Tipo 1 \series default -, gramáticas +, definidos por gramáticas \series bold dependientes del contexto \series default @@ -795,7 +987,7 @@ dependientes del contexto \series bold Tipo 2 \series default -, gramáticas +, definidos por gramáticas \series bold libres de contexto \series default @@ -816,7 +1008,7 @@ libres de contexto \series bold Tipo 3 \series default -, gramáticas +, definidos por gramáticas \series bold regulares \series default @@ -849,11 +1041,11 @@ regulares \end_layout \begin_layout Standard -Los lenguajes de un tipo también son de todos los tipos anteriores, aunque - muchos lenguajes no son de tipo 0. +Los lenguajes de un tipo también son de todos los anteriores, aunque muchos + lenguajes no son de tipo 0. La mayoría de lenguajes de programación son de tipo 1, aunque muchas de sus reglas gramaticales pueden reducirse al tipo 2 y, para los símbolos - básicos del lenguaje, al tipo 3. + básicos, al tipo 3. \end_layout \begin_layout Section diff --git a/cc/n3.lyx b/cc/n3.lyx new file mode 100644 index 0000000..bb04cfa --- /dev/null +++ b/cc/n3.lyx @@ -0,0 +1,5364 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass book +\begin_preamble +\usepackage{tikz} +\end_preamble +\use_default_options true +\begin_modules +algorithm2e +\end_modules +\maintain_unincluded_children false +\language spanish +\language_package default +\inputencoding auto +\fontencoding global +\font_roman "default" "default" +\font_sans "default" "default" +\font_typewriter "default" "default" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts false +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format default +\output_sync 0 +\bibtex_command default +\index_command default +\paperfontsize default +\spacing single +\use_hyperref false +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style french +\dynamic_quotes 0 +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Standard +Un +\series bold +analizador sintáctico +\series default + toma una cadena de componentes léxicos y, si esta verifica la gramática + libre de contexto del lenguaje fuente, genera un árbol sintáctico, y de + lo contrario genera un informe con la lista de errores detectados. + También puede hacer tareas de análisis semántico como completar la tabla + de símbolos, verificar los tipos y generar código intermedio. +\end_layout + +\begin_layout Section +Recuperación de errores +\end_layout + +\begin_layout Standard +El informe de errores debe ser claro y preciso, la recuperación debe ser + rápida para poder continuar con el procesamiento y el mecanismo de detección + no debe ralentizar programas correctos. +\end_layout + +\begin_layout Itemize + +\series bold +Recuperación en modo pánico +\series default +: Cuando se recibe un +\emph on +token +\emph default + que no concuerda con la especificación sintáctica del lenguaje, se empiezan + a desechar +\emph on +tokens +\emph default + hasta que se encuentra uno de un +\series bold +conjunto de sincronización +\series default +, normalmente con terminadores de estructuras sintácticas. + Esto desecha muchos +\emph on +tokens +\emph default +. +\end_layout + +\begin_layout Itemize + +\series bold +Recuperación a nivel de frase +\series default +: Cuando se descubre un error, se inserta una cadena que permita continuar + con el análisis. + Da problemas si el error se produjo antes del punto de detección. +\end_layout + +\begin_layout Itemize + +\series bold +Producciones de error +\series default +: Si se sabe en qué puntos están los errores más frecuentes, ampliar la + gramática con reglas de producción que simulen la producción de errores. +\end_layout + +\begin_layout Itemize + +\series bold +Corrección global +\series default +: Se calcula la distancia mínima de la cadena incorrecta a una correcta + y se sustituye. + Es muy costoso, y se usa para la evaluación de otras técnicas o de forma + local para encontrar cadenas de sustitución óptimas en una recuperación + a nivel de frase. +\end_layout + +\begin_layout Section +Fundamentos teóricos +\end_layout + +\begin_layout Standard +Dada una gramática libre de contexto (GLC) +\begin_inset Formula $G:=(V_{N},V_{T},P,S)$ +\end_inset + +, una derivación directa +\begin_inset Formula $\alpha A\mu\Rightarrow\alpha\gamma\mu$ +\end_inset + + con +\begin_inset Formula $A\to\gamma\in P$ +\end_inset + + es +\series bold +más a la izquierda +\series default +, +\begin_inset Formula $\alpha\Rightarrow_{\text{mi}}\beta$ +\end_inset + +, si +\begin_inset Formula $\alpha\in V_{T}^{*}$ +\end_inset + +, y es +\series bold +más a la derecha +\series default +, +\begin_inset Formula $\alpha\Rightarrow_{\text{md}}\beta$ +\end_inset + +, si +\begin_inset Formula $\mu\in V_{T}^{*}$ +\end_inset + +. +\end_layout + +\begin_layout Standard +Una +\series bold +derivación más a la izquierda +\series default + de +\begin_inset Formula $\alpha$ +\end_inset + + es una de la forma +\begin_inset Formula $S\Rightarrow_{\text{mi}}^{*}\alpha$ +\end_inset + +, y una +\series bold +derivación más a la derecha +\series default + es una de la forma +\begin_inset Formula $S\Rightarrow_{\text{md}}^{*}\alpha$ +\end_inset + +. + A una derivación más a la derecha +\begin_inset Formula +\[ +S\Rightarrow_{\text{md}}\gamma_{1}\Rightarrow_{\text{md}}\dots\Rightarrow_{\text{md}}\gamma_{n} +\] + +\end_inset + + con +\begin_inset Formula $n\geq0$ +\end_inset + + le corresponde una +\series bold +reducción por la izquierda +\series default + +\begin_inset Formula $\gamma_{n}\Rightarrow_{\text{mi}}^{R}\dots\Rightarrow_{\text{mi}}^{R}\gamma_{1}\Rightarrow_{\text{mi}}^{R}S$ +\end_inset + +, donde escribimos +\begin_inset Formula $\alpha\Rightarrow^{R}\beta$ +\end_inset + + si +\begin_inset Formula $\alpha\Rightarrow\beta$ +\end_inset + + en la gramática con reglas de producción +\begin_inset Formula $\{\gamma\to\delta\}_{\delta\to\gamma\in P}$ +\end_inset + +. +\end_layout + +\begin_layout Standard +Si +\begin_inset Formula $\gamma A\mu\Rightarrow\alpha:=\gamma\beta\mu$ +\end_inset + +, +\begin_inset Formula $\beta$ +\end_inset + + es una +\series bold +frase simple +\series default + de +\begin_inset Formula $\alpha$ +\end_inset + + respecto a +\begin_inset Formula $A$ +\end_inset + +. + Llamamos +\series bold +forma sentencial derecha +\series default + o +\series bold +más a la derecha +\series default + al resultado de una derivación más a la derecha, y llamamos +\series bold +pivote +\series default + de una forma sentencial derecha +\begin_inset Formula $\alpha$ +\end_inset + + a la frase simple asociada a la última derivación directa en una derivación + más a la derecha de +\begin_inset Formula $\alpha$ +\end_inset + +. +\end_layout + +\begin_layout Standard +Un +\series bold +árbol de derivación +\series default + para la GLC +\begin_inset Formula $G$ +\end_inset + + es un árbol ordenado y etiquetado con raíz +\begin_inset Formula $S$ +\end_inset + + tal que, para todo nodo con etiqueta +\begin_inset Formula $X$ +\end_inset + +, bien +\begin_inset Formula $X\in V_{T}$ +\end_inset + + y el nodo es hoja, o bien +\begin_inset Formula $X\in V_{N}$ +\end_inset + + y los hijos del nodo tienen etiquetas +\begin_inset Formula $X_{1},\dots,X_{k}$ +\end_inset + + con +\begin_inset Formula $X\to X_{1}\cdots X_{k}$ +\end_inset + +. +\end_layout + +\begin_layout Standard +Una sentencia de +\begin_inset Formula $G$ +\end_inset + + es +\series bold +ambigua +\series default + si existen dos árboles de derivación en +\begin_inset Formula $G$ +\end_inset + + distintos tales que la sentencia es la concatenación ordenada de las etiquetas + de todos los nodos hoja, si y sólo si admite dos derivaciones más a la + izquierda distintas, si y sólo si admite dos derivaciones más a la derecha + distintas. + Una gramática es ambigua si tiene alguna sentencia ambigua. +\end_layout + +\begin_layout Standard +La ambigüedad de una gramática es indecidible. + Un lenguaje de tipo 2 es +\series bold +inherentemente ambiguo +\series default + si toda gramática que lo genere es ambigua. +\end_layout + +\begin_layout Standard +Algunos casos de ambigüedad: +\end_layout + +\begin_layout Itemize +La debida a la precedencia y asociatividad de los operadores. + Una gramática ambigua como +\begin_inset Formula $E\to E+E\mid E*E\mid id$ +\end_inset + + es equivalente a una no ambigua +\begin_inset Formula $E\to E+T\mid T;T\to T*F\mid F;F\to id$ +\end_inset + +. +\end_layout + +\begin_layout Itemize +La debida a las sentencias +\family typewriter +if-then-else +\family default +. + Una gramática como +\begin_inset Formula $S\to iEtS\mid iEtSeS\mid s$ +\end_inset + +, donde +\begin_inset Formula $i$ +\end_inset + +, +\begin_inset Formula $t$ +\end_inset + + y +\begin_inset Formula $e$ +\end_inset + + son los +\emph on +tokens +\emph default + respectivos +\family typewriter +if +\family default +, +\family typewriter +then +\family default + y +\family typewriter +else +\family default +, es ambigua porque +\begin_inset Formula $iEtiEtSeS$ +\end_inset + + tiene dos árboles de derivación. + Esto se puede solucionar haciendo que las sentencias +\family typewriter +if-then +\family default + e +\family typewriter +if-then-else +\family default + terminen con un +\emph on +token +\emph default + +\family typewriter +endif +\family default + o usando la gramática equivalente +\begin_inset Formula +\[ +S\to S_{e}\mid S_{ne};S_{e}\to iEtS_{e}eS_{e}\mid s;S_{ne}\to iEtS\mid iEtS_{e}eS_{ne}, +\] + +\end_inset + +aunque esto no se suele hacer porque es más lento, y en su lugar se incluye + en el analizador sintáctico un caso especial. +\end_layout + +\begin_layout Standard +Un +\series bold +autómata de pila +\series default + es una tupla +\begin_inset Formula $M:=(Q,V,\Sigma,\delta,q_{0},z_{0},F)$ +\end_inset + + donde +\begin_inset Formula $Q$ +\end_inset + + es un conjunto finito de +\series bold +estados +\series default +, +\begin_inset Formula $V$ +\end_inset + + es el +\series bold +alfabeto de entrada +\series default +, +\begin_inset Formula $\Sigma$ +\end_inset + + es el +\series bold +alfabeto de la pila +\series default +, +\begin_inset Formula $q_{0}\in Q$ +\end_inset + + es el +\series bold +estado inicial +\series default +, +\begin_inset Formula $z_{0}\in\Sigma$ +\end_inset + + es el +\series bold +símbolo inicial +\series default + de la pila, +\begin_inset Formula $F\subseteq Q$ +\end_inset + + es el conjunto de +\series bold +estados finales +\series default + y +\begin_inset Formula $\delta:Q\times(V\cup\{\lambda\})\times\Sigma\to{\cal P}(Q\times\Sigma^{*})$ +\end_inset + + es la +\series bold +función de transición +\series default +. + +\end_layout + +\begin_layout Standard +Una +\series bold +configuración +\series default + de un autómata con pila es una tupla +\begin_inset Formula $(q,w,\alpha)\in Q\times V^{*}\times\Sigma^{*}$ +\end_inset + +. + Un +\series bold +movimiento +\series default + es una transición de una configuración a otra de la forma +\begin_inset Formula $(q,a\omega,z\alpha)\Rightarrow(q',\omega,\beta\alpha)$ +\end_inset + + con +\begin_inset Formula $(q',\beta)\in\delta(q,a,z)$ +\end_inset + + o de la forma +\begin_inset Formula $(q,\omega,z\alpha)\Rightarrow(q',\omega,\beta\alpha)$ +\end_inset + + con +\begin_inset Formula $(q',\beta)\in\delta(q,a,z)$ +\end_inset + +. + En general los autómatas de pila son +\series bold +no deterministas +\series default +, es decir, existen varios movimientos con la misma configuración inicial + (a la izquierda). +\end_layout + +\begin_layout Standard +Una cadena +\begin_inset Formula $\omega\in V^{*}$ +\end_inset + + es +\series bold +reconocida +\series default + por un autómata +\series bold +por estado final +\series default + si +\begin_inset Formula $(q_{0},\omega,z_{0})\Rightarrow^{*}(q_{f},\lambda,\gamma)$ +\end_inset + + para ciertos +\begin_inset Formula $q_{f}\in F$ +\end_inset + + y +\begin_inset Formula $\gamma\in\Sigma^{*}$ +\end_inset + + o +\series bold +por vaciado de pila +\series default + si +\begin_inset Formula $F=\emptyset$ +\end_inset + + y +\begin_inset Formula $(q_{0},w,z_{0})\Rightarrow^{*}(q,\lambda,\lambda)$ +\end_inset + + para cierto +\begin_inset Formula $q\in Q$ +\end_inset + +. + El +\series bold +lenguaje reconocido +\series default + por un autómata de pila es el conjunto de cadenas en +\begin_inset Formula $\Sigma^{*}$ +\end_inset + + que reconoce. + Un lenguaje es reconocido por algún autómata de pila si y sólo si es de + tipo 2. +\end_layout + +\begin_layout Standard +Algunas características de los lenguajes de programación son no libres de + contexto: +\end_layout + +\begin_layout Itemize +Declaración de identificadores. + +\begin_inset Formula $L_{1}:=\{wcw\mid w\in\{a,b\}^{*}\}$ +\end_inset + +, donde en +\begin_inset Formula $wcw$ +\end_inset + +, la primera +\begin_inset Formula $w$ +\end_inset + + representa una declaración de identificador, la +\begin_inset Formula $c$ +\end_inset + + un fragmento de programa cualquiera y la segunda +\begin_inset Formula $w$ +\end_inset + + un uso del identificador, +\begin_inset Formula $L_{1}$ +\end_inset + + no es de tipo 2. +\end_layout + +\begin_layout Itemize +Número de parámetros de las funciones. + Si +\begin_inset Formula $L_{2}:=\{a^{n}b^{m}c^{n}d^{m}\mid n,m\geq1\}$ +\end_inset + +, donde una +\begin_inset Formula $a$ +\end_inset + + es un parámetro de una primera función, una +\begin_inset Formula $b$ +\end_inset + + es un parámetro de una segunda función, una +\begin_inset Formula $c$ +\end_inset + + es el paso de un argumento a la primera y una +\begin_inset Formula $d$ +\end_inset + + es el paso de un argumento a la segunda, entonces +\begin_inset Formula $L_{2}$ +\end_inset + + no es de tipo 2. +\end_layout + +\begin_layout Standard +Para estas, se asigna el mismo +\emph on +token +\emph default + a todos los identificadores y se permite en la gramática enviar un número + arbitrario de argumentos a las funciones, y en el análisis semántico se + comprueba que los identificadores han sido declarados y el número de argumentos + es el correcto. +\end_layout + +\begin_layout Section +Métodos de análisis semántico +\end_layout + +\begin_layout Standard +Pueden ser: +\end_layout + +\begin_layout Enumerate + +\series bold +Descendentes +\series default +: Se construye el árbol de derivación de la raíz a las hojas usando derivaciones + izquierdas. +\end_layout + +\begin_layout Enumerate + +\series bold +Ascendentes +\series default +: Se construye el árbol de las hojas a la raíz usando reducciones izquierdas. +\end_layout + +\begin_layout Standard +Los métodos +\series bold +generales +\series default + pueden analizar cualquier GLC, pero son bastante ineficientes, por lo que + vemos métodos eficientes que admiten subconjuntos de las gramáticas libres + de contexto suficientemente expresivos. +\end_layout + +\begin_layout Standard +Dadas una GLC +\begin_inset Formula $(V_{N},V_{T},P,S)$ +\end_inset + +, definimos +\begin_inset Formula $\mathsf{PRIMERO}:(V_{N}\cup V_{T})^{*}\to{\cal P}(V_{T}\sqcup\{\lambda\})$ +\end_inset + + como +\begin_inset Formula +\[ +\mathsf{PRIMERO}(\alpha):=\{a\in V_{T}:\exists\beta:\alpha\Rightarrow^{*}a\beta\}\cup\{\lambda:\alpha\Rightarrow^{*}\lambda\}. +\] + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{Gramática $(V_N,V_T,P,S)$} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{Mapeo $ +\backslash +sigma:= +\backslash +mathsf{PRIMERO}|_{V_N +\backslash +cup V_T}$.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$X +\backslash +in V_T$}{$ +\backslash +sigma(X) +\backslash +gets +\backslash +{X +\backslash +}$} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$X +\backslash +in V_N$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +lSSi{$X +\backslash +Rightarrow^* +\backslash +lambda$}{$ +\backslash +sigma(X) +\backslash +gets +\backslash +{ +\backslash +lambda +\backslash +}$} +\end_layout + +\begin_layout Plain Layout + + +\backslash +lEnOtroCaso{$ +\backslash +sigma(X) +\backslash +gets +\backslash +emptyset$} +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Repetir{no se hayan añadido más elementos a los conjuntos}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$X +\backslash +to Y_1 +\backslash +cdots Y_k +\backslash +in P$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$i +\backslash +in{1, +\backslash +dots,k}:Y_1 +\backslash +cdots Y_{i-1} +\backslash +Rightarrow^* +\backslash +lambda$}{ +\end_layout + +\begin_layout Plain Layout + + Añadir todo $ +\backslash +sigma(Y_i) +\backslash +setminus +\backslash +{ +\backslash +lambda +\backslash +}$ a $ +\backslash +sigma(X)$ +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\backslash +lSSi{$Y_1 +\backslash +cdots Y_k +\backslash +Rightarrow^* +\backslash +lambda$}{Añadir $ +\backslash +lambda$ a $ +\backslash +sigma(X)$} +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:primero" + +\end_inset + +Cálculo de +\family sans +PRIMERO +\family default + para símbolos. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Para calcularlo, usamos el algoritmo +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:primero" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + para obtener +\begin_inset Formula $\sigma:V_{N}\cup V_{T}\to V_{T}^{*}$ +\end_inset + + y calculamos +\begin_inset Formula +\begin{multline*} +\mathsf{PRIMERO}(X_{1}\cdots X_{n})=\\ +=\bigcup_{i=1}^{\min(\{i:X_{1}\cdots X_{i}\nRightarrow^{*}\lambda\}\cup\{n\})}(\sigma(X_{i})\setminus\{\lambda\})\cup\{\lambda:X_{1}\cdots X_{n}\Rightarrow^{*}\lambda\}. +\end{multline*} + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{Gramática $(V_N,V_T,P,S)$.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{Mapeo $ +\backslash +sigma:= +\backslash +mathsf{SIGUIENTE}$} +\end_layout + +\begin_layout Plain Layout + +$ +\backslash +textsf{SIGUIENTE}(S) +\backslash +gets +\backslash +{ +\backslash +$ +\backslash +}$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +lPara{$A +\backslash +in V_N +\backslash +setminus +\backslash +{S +\backslash +}$}{$ +\backslash +textsf{SIGUIENTE}(A) +\backslash +gets +\backslash +emptyset$} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$A +\backslash +to X_1 +\backslash +cdots X_k +\backslash +in P$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$i +\backslash +gets 1$ +\backslash +KwA $k-1$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +SSi{$X_i +\backslash +in V_n$}{ +\end_layout + +\begin_layout Plain Layout + + Añadir todo $ +\backslash +mathsf{PRIMERO}(X_{i+1} +\backslash +cdots X_k) +\backslash +setminus +\backslash +{ +\backslash +lambda +\backslash +}$ a $ +\backslash +textsf{SIGUIENTE}(X_k)$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Repetir{no se hayan añadido más elementos a los conjuntos}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$A +\backslash +to X_1 +\backslash +cdots X_k:k +\backslash +geq1$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$i +\backslash +gets0$ +\backslash +KwA $k$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +SSi{$X_i +\backslash +in V_N +\backslash +land +\backslash +lambda +\backslash +in +\backslash +mathsf{PRIMERO}(X_{i+1} +\backslash +cdots X_k)$}{ +\end_layout + +\begin_layout Plain Layout + + Añadir todo $ +\backslash +mathsf{SIGUIENTE}(A)$ a $ +\backslash +mathsf{SIGUIENTE}(X_i)$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:siguiente" + +\end_inset + +Cálculo de +\family sans +SIGUIENTE +\family default +. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Definimos +\begin_inset Formula $\mathsf{SIGUIENTE}:V_{N}\to{\cal P}(V_{T}\sqcup\{\$\})$ +\end_inset + + como +\begin_inset Formula +\[ +\mathsf{SIGUIENTE}(A):=\{a\in V_{T}:\exists\alpha,\beta:S\Rightarrow^{+}\alpha Aa\beta\}\cup\{\$:\exists\alpha:S\Rightarrow^{*}\alpha A\}, +\] + +\end_inset + +lo que podemos calcular con el algoritmo +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:siguiente" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +. +\end_layout + +\begin_layout Section +Análisis ascendente +\end_layout + +\begin_layout Standard +Una GLC es +\begin_inset Formula $LR(k)$ +\end_inset + + para un +\begin_inset Formula $k\geq0$ +\end_inset + + si existe un algoritmo que, leyendo +\emph on +tokens +\emph default + de izquierda a derecha ( +\emph on +Left to right +\emph default +), construya una derivación más a la derecha ( +\emph on +Rightmost derivation +\emph default +) de la entrada, en el caso de que esta esté en la gramática, sin necesidad + de examinar más de +\begin_inset Formula $k$ +\end_inset + + +\emph on +tokens +\emph default + de anticipación. +\end_layout + +\begin_layout Standard +Un +\series bold +analizador LR +\series default + es una estructura formada por: +\end_layout + +\begin_layout Enumerate +Un alfabeto de +\series bold +símbolos terminales +\series default + +\begin_inset Formula $V_{T}$ +\end_inset + +. +\end_layout + +\begin_layout Enumerate +Un alfabeto de +\series bold +símbolos no terminales +\series default + +\begin_inset Formula $V_{N}$ +\end_inset + + disjunto de +\begin_inset Formula $V_{T}$ +\end_inset + +. +\end_layout + +\begin_layout Enumerate +Un conjunto finito de +\series bold +estados +\series default + +\begin_inset Formula $S$ +\end_inset + +. +\end_layout + +\begin_layout Enumerate +Un +\series bold +estado inicial +\series default + +\begin_inset Formula $s_{0}\in S$ +\end_inset + +. +\end_layout + +\begin_layout Enumerate +Una tabla +\begin_inset Formula $\mathsf{Acción}:S\times(V_{T}\sqcup\{\$\})\to X$ +\end_inset + +, donde +\begin_inset Formula $X$ +\end_inset + + puede ser +\emph on +Desplazar +\begin_inset Formula $s$ +\end_inset + + +\emph default + con +\begin_inset Formula $s\in S$ +\end_inset + +, +\emph on +Reducir +\begin_inset Formula $A\to\beta$ +\end_inset + + +\emph default + con +\begin_inset Formula $A\in V_{N}$ +\end_inset + + y +\begin_inset Formula $\beta\in(V_{N}\cup V_{T})^{*}$ +\end_inset + +, +\emph on +Aceptar +\emph default + o +\emph on +Error +\emph default +. +\end_layout + +\begin_layout Enumerate +Una tabla +\begin_inset Formula $\mathsf{IrA}:S\times V_{N}\to S$ +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{Un analizador LR y una entrada de +\backslash +emph{tokens} que termina con el s +\backslash +'imbolo +\backslash +$.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{Un árbol sintáctico.} +\end_layout + +\begin_layout Plain Layout + +Establecer la pila a $(s_0)$. + En esta versi +\backslash +'on del algoritmo, la pila no contiene s +\backslash +'imbolos de $V_T$ o $V_N$ sino +\backslash +'arboles completos. +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Mientras{haya entrada}{ +\end_layout + +\begin_layout Plain Layout + + Llamar $s$ al estado en la cima de la pila +\backslash +; +\end_layout + +\begin_layout Plain Layout + + Leer un +\backslash +emph{token} $a$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Seleccionar{$ +\backslash +mathsf{Acci +\backslash +acute on}(s,a)$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +uCaso{ +\backslash +emph{Desplazar $s'$}}{ +\end_layout + +\begin_layout Plain Layout + + Apilar $a$ y $s'$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\backslash +uCaso{ +\backslash +emph{Reducir $A +\backslash +to +\backslash +beta$}}{ +\end_layout + +\begin_layout Plain Layout + + $k:=| +\backslash +beta|$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + Desapilar $2k$ entradas, guardando los +\backslash +'arboles como $T_1, +\backslash +dots,T_k$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + Llamar $s'$ al estado en la cima de la pila +\backslash +; +\end_layout + +\begin_layout Plain Layout + + Apilar el árbol $A(T_1, +\backslash +dots,T_k)$ +\end_layout + +\begin_layout Plain Layout + +y el estado $ +\backslash +mathsf{IrA}(s',A)$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + Devolver $a$ a la entrada +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\backslash +uCaso{ +\backslash +emph{Aceptar}}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Devolver{el último árbol apilado} +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\backslash +uCaso{ +\backslash +emph{Error}}{ +\end_layout + +\begin_layout Plain Layout + + Informar del error e intentar continuar +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:lr-analysis" + +\end_inset + +Análisis sintáctico LR. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Una +\series bold +configuración +\series default + del analizador es un par +\begin_inset Formula $(s_{0}\,X_{1}\,s_{1}\,\dots\,X_{m}\,s_{m},a_{i}a_{i+1}\cdots a_{n}\$)$ +\end_inset + +, donde +\begin_inset Formula $s_{0},\dots,s_{m}\in S$ +\end_inset + + y +\begin_inset Formula $X_{1},\dots,X_{m}\in V_{N}\cup V_{T}$ +\end_inset + +, +\begin_inset Formula $a_{i},\dots,a_{n}\in V_{T}$ +\end_inset + +. + El primer elemento del par es el +\series bold +contenido de la pila +\series default + y el segundo elemento es la cadena de símbolos de entrada que queda por + reconocer. + Ejecutar el analizador sobre una entrada es aplicar el algoritmo +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:lr-analysis" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +, que recibe una entrada y devuelve un árbol de derivación de esta si cumple + una cierta gramática +\begin_inset Formula $LR(1)$ +\end_inset + +, o bien encuentra un error. + Un analizador LR se puede convertir en un autómata de pila. +\end_layout + +\begin_layout Subsection +Método SLR +\end_layout + +\begin_layout Standard +Dadas una gramática +\begin_inset Formula $G:=(V_{N},V_{T},P,S)$ +\end_inset + + y +\begin_inset Formula $\gamma\in(V_{N}\cup V_{T})^{*}$ +\end_inset + +, +\begin_inset Formula $\gamma$ +\end_inset + + es un +\series bold +prefijo viable +\series default + de +\begin_inset Formula $G$ +\end_inset + + si existen +\begin_inset Formula $\alpha,\beta,\omega\in(V_{N}\cup V_{T})^{*}$ +\end_inset + + y +\begin_inset Formula $A\in V_{N}$ +\end_inset + + tales que +\begin_inset Formula $S\Rightarrow_{\text{md}}^{*}\alpha A\omega\Rightarrow_{\text{md}}\alpha\beta\omega$ +\end_inset + + y +\begin_inset Formula $\gamma$ +\end_inset + + es prefijo de +\begin_inset Formula $\alpha\beta$ +\end_inset + +. +\end_layout + +\begin_layout Standard +Llamamos +\series bold +ítem +\series default + ( +\begin_inset Formula $LR(0)$ +\end_inset + +) de una gramática a una regla de producción de esta a la que se añade un + punto en alguna posición de la cadena a la derecha, que indica la porción + de la regla que ha sido reconocida en la entrada, de modo que cuando el + punto está a la derecha podemos aplicar una reducción. +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{GLC $(V_N,V_T,P,S)$ y conjunto de ítems $I$ de esta.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{Clausura $J$ de $I$} +\end_layout + +\begin_layout Plain Layout + +$J +\backslash +gets I$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Repetir{no se añadan más elementos}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$A +\backslash +to +\backslash +alpha +\backslash +cdot B +\backslash +beta +\backslash +in J$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +lPara{$B +\backslash +to +\backslash +gamma +\backslash +in P$}{Añadir $B +\backslash +to +\backslash +cdot +\backslash +gamma$ a $J$} +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:clausura" + +\end_inset + +Cálculo de la clausura de un conjunto de ítems +\begin_inset Formula $LR(0)$ +\end_inset + +. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{GLC $(V_N,V_T,P,S)$ extendida con un cierto $S'$} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{Colección $LR(0)$ $C$.} +\end_layout + +\begin_layout Plain Layout + +$C +\backslash +gets +\backslash +{ +\backslash +mathsf{Clausura}( +\backslash +{S' +\backslash +to +\backslash +cdot S +\backslash +}) +\backslash +}$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Repetir{no se añadan más elementos}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$I +\backslash +in C$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$X +\backslash +in V_N +\backslash +cup V_T +\backslash +cup +\backslash +{S' +\backslash +}$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +lSSi{$ +\backslash +mathsf{Goto}(I,X) +\backslash +neq +\backslash +emptyset$}{Añadir $ +\backslash +mathsf{Goto}(I,X)$ a $C$} +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:lr0-collection" + +\end_inset + +Cálculo de la colección +\begin_inset Formula $LR(0)$ +\end_inset + +. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Llamamos +\series bold +gramática aumentada +\series default + o +\series bold +extendida +\series default + de +\begin_inset Formula $G$ +\end_inset + + a +\begin_inset Formula $(V_{N}\cup\{S'\},V_{T},P\cup\{S'\to S\},S')$ +\end_inset + +, donde +\begin_inset Formula $S'\notin V_{N}\cup V_{T}$ +\end_inset + +. + Definimos la +\series bold +clausura +\series default + de un conjunto +\begin_inset Formula $I$ +\end_inset + + de ítems, +\begin_inset Formula $\mathsf{Clausura}(I)$ +\end_inset + +, según el algoritmo +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:clausura" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +, y dados un conjunto de ítems +\begin_inset Formula $I$ +\end_inset + + y +\begin_inset Formula $X\in V_{N}\cup V_{T}$ +\end_inset + +, definimos +\family sans + +\begin_inset Formula $\mathsf{Goto}(I,X):=\mathsf{Clausura}(\{A\to\alpha X\cdot\beta\}_{A\to\alpha\cdot X\beta\in I})$ +\end_inset + +. + +\family default +Con esto definimos la +\series bold +colección +\begin_inset Formula $LR(0)$ +\end_inset + + +\series default + según el algoritmo +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:lr0-collection" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +. +\end_layout + +\begin_layout Standard +Un ítem +\begin_inset Formula $LR(0)$ +\end_inset + + +\begin_inset Formula $A\to\beta\cdot\gamma$ +\end_inset + + es +\series bold +válido +\series default + para un prefijo viable +\begin_inset Formula $\alpha\beta_{1}$ +\end_inset + + si existe una derivación +\begin_inset Formula $S'\Rightarrow_{\text{md}}^{*}\alpha A\omega\Rightarrow_{\text{md}}\alpha\beta_{1}\beta_{2}\omega$ +\end_inset + + con +\begin_inset Formula $\omega\in V_{T}^{*}$ +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{GLC aumentada con $S'$.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{Tablas { +\backslash +sf Acci +\backslash +'on} e { +\backslash +sf IrA} del analizador, conjunto de estados $C$ y estado inicial $s$, o + conflicto.} +\end_layout + +\begin_layout Plain Layout + +Construir la colección $LR(0)$ $C$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$I +\backslash +in C$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +lPara{$a +\backslash +in V_T$}{$ +\backslash +mathsf{Acci +\backslash +acute on}(I,a) +\backslash +gets +\backslash +emph{Error}$} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$A +\backslash +to +\backslash +alpha +\backslash +cdot +\backslash +beta +\backslash +in I$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +uSSi{$| +\backslash +beta| +\backslash +geq1$}{ +\end_layout + +\begin_layout Plain Layout + + $a +\backslash +gets +\backslash +beta_0$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + $N +\backslash +gets +\backslash +emph{Desplazar } +\backslash +mathsf{Goto}(I,a)$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +lSSi{$ +\backslash +mathsf{Acci +\backslash +acute on}(I,a) +\backslash +neq +\backslash +emph{Error},N$}{Conflicto} +\end_layout + +\begin_layout Plain Layout + + $ +\backslash +mathsf{Acci +\backslash +acute on}(I,a) +\backslash +gets N$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\backslash +uEnOtroCasoSi{$A +\backslash +neq S'$}{ +\end_layout + +\begin_layout Plain Layout + + $N +\backslash +gets +\backslash +emph{Reducir }A +\backslash +to +\backslash +alpha$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$a +\backslash +in +\backslash +mathsf{SIGUIENTE}(A)$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +lSSi{$ +\backslash +mathsf{Acci +\backslash +acute on}(I,a) +\backslash +neq +\backslash +emph{Error},N$}{Conflicto} +\end_layout + +\begin_layout Plain Layout + + $ +\backslash +mathsf{Acci +\backslash +acute on}(I,a) +\backslash +gets N$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\backslash +EnOtroCaso{ +\end_layout + +\begin_layout Plain Layout + + $ +\backslash +mathsf{Acci +\backslash +acute on}(I, +\backslash +$) +\backslash +gets +\backslash +emph{Aceptar}$ +\end_layout + +\begin_layout Plain Layout + + +\backslash +tcp*{{ +\backslash +rm Caso $S' +\backslash +to S$}} +\end_layout + +\begin_layout Plain Layout + + $s +\backslash +gets I$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + + +\backslash +lPara{$I +\backslash +in C,A +\backslash +in V_N$}{$ +\backslash +mathsf{IrA}(I,A) +\backslash +gets +\backslash +mathsf{Goto}(I,A)$} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:slr" + +\end_inset + +Método SLR. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +El método SLR para generar un analizador ascendente es el algoritmo +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:slr" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +. + Una gramática es +\begin_inset Formula $SLR(1)$ +\end_inset + + si el método no genera conflictos. + Toda gramática ambigua genera conflictos, pero no toda gramática que genera + conflictos es ambigua. + Los conflictos pueden ser: +\end_layout + +\begin_layout Itemize +Desplaza-reduce ( +\emph on +shift-reduce +\emph default +): Se podría tanto desplazar el siguiente símbolo a la pila como reducir. +\end_layout + +\begin_layout Itemize +Reduce-reduce ( +\emph on +reduce-reduce +\emph default +): Hay al menos dos reglas de producción aplicables. +\end_layout + +\begin_layout Standard +En estos casos se puede especificar manualmente la acción a tomar o usar + un método más potente. +\end_layout + +\begin_layout Subsection +Método LR-canónico +\end_layout + +\begin_layout Standard +Un +\series bold +ítem +\begin_inset Formula $LR(1)$ +\end_inset + + +\series default + de una gramática aumentada es un par +\begin_inset Formula $[A\to\beta\cdot\gamma,a]$ +\end_inset + + formado por un ítem +\begin_inset Formula $LR(0)$ +\end_inset + + y un símbolo +\begin_inset Formula $a\in V_{T}\sqcup\{\$\}$ +\end_inset + +. + Este ítem es +\series bold +válido +\series default + para el prefijo viable +\begin_inset Formula $\alpha\beta$ +\end_inset + + si existe +\begin_inset Formula $\omega\in V_{T}^{*}$ +\end_inset + + tal que +\begin_inset Formula $S'\Rightarrow_{\text{md}}^{*}\alpha A\omega\Rightarrow_{\text{md}}\alpha\beta\gamma\omega$ +\end_inset + + y, bien +\begin_inset Formula $\omega\neq\lambda$ +\end_inset + + y +\begin_inset Formula $a=\omega_{0}$ +\end_inset + +, bien +\begin_inset Formula $\omega=\lambda$ +\end_inset + + y +\begin_inset Formula $a=\$$ +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{GLC $(V_N,V_T,P,S)$ y conjunto $I$ de ítems $LR(1)$ de esta.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{Clausura $J$ de $I$.} +\end_layout + +\begin_layout Plain Layout + +$J +\backslash +gets I$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Repetir{no se hayan añadido elementos}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$[A +\backslash +to +\backslash +alpha +\backslash +cdot B +\backslash +beta,a] +\backslash +in J$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$B +\backslash +to +\backslash +gamma +\backslash +in P$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$b +\backslash +in +\backslash +mathsf{PRIMERO}( +\backslash +beta a)$}{ +\end_layout + +\begin_layout Plain Layout + + Añadir $[B +\backslash +to +\backslash +cdot +\backslash +gamma,b]$ a $J$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:clausura-lr1" + +\end_inset + +Cálculo de la clausura de un conjunto de ítems +\begin_inset Formula $LR(1)$ +\end_inset + +. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Definimos la clausura de un conjunto de ítems +\begin_inset Formula $LR(1)$ +\end_inset + + según el algoritmo +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:clausura-lr1" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +, y para un conjunto de ítems +\begin_inset Formula $I$ +\end_inset + + y un +\begin_inset Formula $X\in V_{N}\cup V_{T}$ +\end_inset + +, llamamos +\begin_inset Formula $\mathsf{Goto}(I,X):=\mathsf{Clausura}(\{[A\to\alpha X\cdot\beta,a]\}_{[A\to\alpha\cdot X\beta,a]\in I})$ +\end_inset + +. + +\end_layout + +\begin_layout Standard +El algoritmo para obtener la colección +\begin_inset Formula $LR(1)$ +\end_inset + + de una GLC es el mismo que para obtener la colección +\begin_inset Formula $LR(0)$ +\end_inset + +, pero inicializando el conjunto a +\begin_inset Formula $\{\mathsf{Clausura}(\{[S'\to\cdot S,\$]\})\}$ +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{GLC aumentada con $S'$.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{Conjunto de estados $C$, estado inicial $s$ y tablas { +\backslash +sf Acción} e { +\backslash +sf IrA}, o conflicto.} +\end_layout + +\begin_layout Plain Layout + +Obtener la colección $LR(1)$ $C$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$I +\backslash +in C$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +lPara{$a +\backslash +in V_T$}{$ +\backslash +mathsf{Acci +\backslash +acute on}(I,a) +\backslash +gets +\backslash +emph{Error}$} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$[A +\backslash +to +\backslash +alpha +\backslash +cdot +\backslash +beta,b] +\backslash +in I$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +uSSi{$| +\backslash +beta| +\backslash +geq1$}{ +\end_layout + +\begin_layout Plain Layout + + $a +\backslash +gets +\backslash +beta_0$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +SSi{$a +\backslash +in V_T$}{ +\end_layout + +\begin_layout Plain Layout + + $N +\backslash +gets +\backslash +emph{Desplazar } +\backslash +mathsf{Goto}(I,a)$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +lSSi{$ +\backslash +mathsf{Acci +\backslash +acute on}(I,a) +\backslash +neq +\backslash +emph{Error},N$}{Conflicto} +\end_layout + +\begin_layout Plain Layout + + $ +\backslash +mathsf{Acci +\backslash +acute on}(I,a) +\backslash +gets N$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\backslash +uEnOtroCasoSi{$A +\backslash +neq S'$}{ +\end_layout + +\begin_layout Plain Layout + + $N +\backslash +gets +\backslash +emph{Reducir }A +\backslash +to +\backslash +alpha$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +lSSi{$ +\backslash +mathsf{Acci +\backslash +acute on}(I,b) +\backslash +neq +\backslash +emph{Error},N$}{Conflicto} +\end_layout + +\begin_layout Plain Layout + + $ +\backslash +mathsf{Acci +\backslash +acute on}(I,b) +\backslash +gets N$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\backslash +EnOtroCaso{ +\end_layout + +\begin_layout Plain Layout + + $ +\backslash +mathsf{Acci +\backslash +acute on}(I, +\backslash +$) +\backslash +gets +\backslash +emph{Aceptar}$ +\end_layout + +\begin_layout Plain Layout + + +\backslash +tcp*{{ +\backslash +rm Caso $[S' +\backslash +to S +\backslash +cdot, +\backslash +$]$}} +\end_layout + +\begin_layout Plain Layout + + $s +\backslash +gets I$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + + +\backslash +lPara{$I +\backslash +in C;A +\backslash +in V_N$}{$ +\backslash +mathsf{IrA}(I,A) +\backslash +gets +\backslash +mathsf{Goto}(I,A)$} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:lrc" + +\end_inset + +Método LR canónico. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +El método LR-canónico es el algoritmo +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:lrc" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + y funciona para toda gramática +\begin_inset Formula $LR(1)$ +\end_inset + +, pero genera muchos estados. +\end_layout + +\begin_layout Subsection +Método LALR +\end_layout + +\begin_layout Standard +Tiene una potencia intermedia entre el método LR-canónico y el SLR, y consigue + una tabla de análisis de igual tamaño que con SLR. + +\end_layout + +\begin_layout Standard +Pasos: +\end_layout + +\begin_layout Enumerate +Construir la colección +\begin_inset Formula $LR(1)$ +\end_inset + + +\begin_inset Formula $C$ +\end_inset + +. +\end_layout + +\begin_layout Enumerate +Si, para +\begin_inset Formula $I\in C$ +\end_inset + +, +\begin_inset Formula $\rho(I):=\{R:\exists a\in V_{T}:[R,a]\in I\}$ +\end_inset + +, para +\begin_inset Formula $I,J\in C$ +\end_inset + + tales que +\begin_inset Formula $\rho(I)=\rho(J)$ +\end_inset + +, sustituimos +\begin_inset Formula $I$ +\end_inset + + y +\begin_inset Formula $J$ +\end_inset + + en +\begin_inset Formula $C$ +\end_inset + + por su unión. +\end_layout + +\begin_layout Enumerate +Aplicamos el método LR-canónico a la colección resultante. +\end_layout + +\begin_layout Standard +Una gramática es +\begin_inset Formula $LALR(1)$ +\end_inset + + si en este último paso no se producen conflictos. + Si se aplica el método LALR a una gramática +\begin_inset Formula $LR(1)$ +\end_inset + +: +\end_layout + +\begin_layout Itemize +Pueden surgir conflictos +\emph on +reduce-reduce +\emph default +. +\end_layout + +\begin_deeper +\begin_layout Standard +La gramática +\begin_inset Formula $S\to XY;X\to Aa\mid Bb;Y\to Ac\mid Ba;A\to a;B\to a$ +\end_inset + + es +\begin_inset Formula $LR(1)$ +\end_inset + +, pero al fusionar los conjuntos +\begin_inset Formula $\{[A\to a\cdot,a],[B\to a\cdot,b]\}$ +\end_inset + + y +\begin_inset Formula $\{[A\to a\cdot,c],[B\to a\cdot,a]\}$ +\end_inset + + de su colección +\begin_inset Formula $LR(1)$ +\end_inset + + en un conjunto +\begin_inset Formula $K$ +\end_inset + +, obtenemos que +\begin_inset Formula $\mathsf{Acción}[I,a]$ +\end_inset + + puede ser +\emph on +Reduce +\begin_inset Formula $A\to a$ +\end_inset + + +\emph default + o +\emph on +Reduce +\begin_inset Formula $B\to a$ +\end_inset + + +\emph default +. +\end_layout + +\end_deeper +\begin_layout Itemize +No pueden surgir conflictos +\emph on +shift-reduce +\emph default +. +\end_layout + +\begin_deeper +\begin_layout Standard +Si lo hubiera, habría +\begin_inset Formula $\alpha,\beta,\gamma\in(V_{N}\cup V_{T})^{*}$ +\end_inset + +, +\begin_inset Formula $a,x\in V_{T}$ +\end_inset + + y +\begin_inset Formula $A,B\in V_{N}$ +\end_inset + + tales que existe un +\begin_inset Formula $J$ +\end_inset + + en la colección de conjuntos LALR de la gramática con +\begin_inset Formula $[A\to\alpha\cdot a\gamma,x],[B\to\beta\cdot,a]\in J$ +\end_inset + +. + Si +\begin_inset Formula $J=I_{1}\cup\dots\cup I_{n}$ +\end_inset + + con +\begin_inset Formula $I_{1},\dots,I_{n}$ +\end_inset + + conjuntos de la colección +\begin_inset Formula $LR(1)$ +\end_inset + +, existe +\begin_inset Formula $k$ +\end_inset + + con +\begin_inset Formula $[B\to\beta\cdot,a]\in I_{k}$ +\end_inset + + y existe +\begin_inset Formula $y\in V_{T}$ +\end_inset + + con +\begin_inset Formula $[A\to\alpha\cdot a\gamma,y]\in I_{k}$ +\end_inset + +, luego el conflicto ya existiría en el método LR-canónico. +\end_layout + +\end_deeper +\begin_layout Subsection +Conflictos +\family typewriter +if-then-else +\end_layout + +\begin_layout Standard +La gramática no ambigua que vimos para +\family typewriter +if-then-else +\family default + es +\begin_inset Formula $LR(1)$ +\end_inset + +, pero genera muchos estados. + En la gramática +\begin_inset Formula +\[ +S\to iSeS\mid iS\mid s, +\] + +\end_inset + +una versión simplificada de la gramática ambigua, ocurre un conflicto +\emph on +shift-reduce +\emph default +, pero podemos hacer que el +\family typewriter +else +\family default + colgante se asocie al +\family typewriter +if +\family default + más cercano en SLR priorizando el desplazamiento en el conflicto. + En efecto, la colección +\begin_inset Formula $LR(0)$ +\end_inset + + es +\begin_inset Formula +\begin{multline*} +\{\{S'\to\cdot S,S\to\cdot iSeS,S\to\cdot iS,S\to\cdot s\},\{S'\to S{}\cdot\},\\ +\{S\to i\cdot SeS,S\to i\cdot S,S\to\cdot iSeS,S\to\cdot iS,S\to\cdot s\},\\ +\{S\to iS\cdot eS,S\to iS{}\cdot\},\\ +\{S\to iSe\cdot S,S\to\cdot iSeS,S\to\cdot iS,S\to\cdot s\},\{S\to s{}\cdot\}\}, +\end{multline*} + +\end_inset + +y el único conflicto sucede en +\begin_inset Formula $\{S\to iS\cdot eS,S\to iS{}\cdot\}$ +\end_inset + +, luego si queremos que el +\family typewriter +else +\family default + que viene a continuación se asocie al +\family typewriter +if +\family default + más cercano debemos hacer un desplazamiento. +\end_layout + +\begin_layout Subsection +Recuperación de errores +\end_layout + +\begin_layout Standard +Un acceso a +\family sans +IrA +\family default + no produce errores, pues cuando se aplica una producción, sabemos que el + nuevo conjunto de símbolos de la pila forma un prefijo viable. + El método LR-canónico detecta los errores de la entrada inmediatamente, + mientras que los métodos LALR y SLR pueden hacer varias reducciones antes + de detectar el error, pero ninguno desplaza un símbolo de entrada erróneo + en la pila. +\end_layout + +\begin_layout Standard +Recuperación: +\end_layout + +\begin_layout Itemize +Tratamiento a nivel de frase: Para cada entrada en blanco de +\family sans +Acción +\family default +, se introduce una rutina de manejo que inserte o elimine símbolos de la + pila o de la entrada, o que altere o transponga símbolos de la entrada. + Debe evitarse extraer de la pila un símbolo no terminal, pues indica que + la estructura se había reconocido con éxito. +\end_layout + +\begin_layout Itemize +Modo pánico: Se extraen pares de elementos de la pila hasta encontrar un + estado +\begin_inset Formula $s$ +\end_inset + + para el que exista +\begin_inset Formula $A$ +\end_inset + + con +\begin_inset Formula $s':=\mathsf{IrA}(s,A)$ +\end_inset + + definido, se introducen +\begin_inset Formula $A$ +\end_inset + + y +\begin_inset Formula $s'$ +\end_inset + + en la pila para simular una reducción y se descartan elementos de la entrada + hasta encontrar un símbolo de +\begin_inset Formula $\mathsf{Siguiente}(A)$ +\end_inset + +. +\end_layout + +\begin_layout Section +Transformación de gramáticas +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{GLC $(V_N,V_T,P,S)$.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{GLC $ +\backslash +lambda$-libre equivalente $(V'_N,V_T,P',S')$} +\end_layout + +\begin_layout Plain Layout + +$N +\backslash +gets +\backslash +{A +\backslash +}_{A +\backslash +to +\backslash +lambda +\backslash +in P}$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + +$(V'_N,P',S') +\backslash +gets(V_N,P,S)$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Repetir{no se hayan añadido elementos}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +lPara{$A +\backslash +to X_1 +\backslash +cdots X_k +\backslash +in P:X_1, +\backslash +dots,X_k +\backslash +in N$}{Añadir $A$ a $N$} +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$A +\backslash +to X_1 +\backslash +cdots X_k$}{ +\end_layout + +\begin_layout Plain Layout + + $t +\backslash +gets| +\backslash +{i:X_i +\backslash +in N +\backslash +}|$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + Definir $ +\backslash +sigma: +\backslash +{1, +\backslash +dots,t +\backslash +} +\backslash +to +\backslash +{1, +\backslash +dots,k +\backslash +}$ inyectiva con +\end_layout + +\begin_layout Plain Layout + + $X_{ +\backslash +sigma(i)} +\backslash +in N$ para todo $i$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$j_1, +\backslash +dots,j_t +\backslash +gets0$ +\backslash +KwA 1}{ +\end_layout + +\begin_layout Plain Layout + + $ +\backslash +alpha +\backslash +gets +\backslash +lambda$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$i=1$ +\backslash +KwA $k$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +lSSi{$X_i +\backslash +notin N +\backslash +lor j_{ +\backslash +sigma^{-1}(i)}=1$}{$ +\backslash +alpha +\backslash +gets +\backslash +alpha X_i$} +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + Añadir $A +\backslash +to +\backslash +alpha$ a $P'$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +$P' +\backslash +gets +\backslash +{A +\backslash +to +\backslash +alpha +\backslash +in P': +\backslash +alpha +\backslash +neq +\backslash +lambda +\backslash +}$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +SSi{$S +\backslash +in N$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +uSSi{$S$ no aparece a la derecha de una regla}{Añadir $S +\backslash +to +\backslash +lambda$ a $P'$} +\end_layout + +\begin_layout Plain Layout + + +\backslash +EnOtroCaso{ +\end_layout + +\begin_layout Plain Layout + + Añadir un símbolo $S'$ a $V'_N$ que no esté en $V_N +\backslash +cup V_T$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + Añadir $S' +\backslash +to S$ y $S' +\backslash +to +\backslash +lambda$ a $P'$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:rm-lambda" + +\end_inset + +Eliminación de +\begin_inset Formula $\lambda$ +\end_inset + +-reglas. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Una GLC +\begin_inset Formula $(V_{N},V_{T},P,S)$ +\end_inset + + es +\series bold + +\begin_inset Formula $\lambda$ +\end_inset + +-libre +\series default + si no contiene producciones de la forma +\begin_inset Formula $A\to\lambda$ +\end_inset + +, salvo quizá +\begin_inset Formula $S\to\lambda$ +\end_inset + +, en cuyo caso +\begin_inset Formula $S$ +\end_inset + + no aparece a la derecha de ninguna regla de producción. + Toda GLC es equivalente a una +\begin_inset Formula $\lambda$ +\end_inset + +-libre por el algoritmo +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:rm-lambda" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{GLC $(V_N,V_T,P,S)$.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{GLC $(V_N,V_T,P',S)$ equivalente sin reglas unitarias.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +lPara{$A +\backslash +in V_N$}{$U(A):= +\backslash +{B +\backslash +in V_N +\backslash +setminus +\backslash +{A +\backslash +}:A +\backslash +Rightarrow^*B +\backslash +}$} +\end_layout + +\begin_layout Plain Layout + +$P' +\backslash +gets +\backslash +{A +\backslash +to +\backslash +alpha +\backslash +in P: +\backslash +nexists B +\backslash +in V_N: +\backslash +alpha=B +\backslash +}$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$A +\backslash +in V_N$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$B +\backslash +in U(A)$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +lPara{$B +\backslash +to +\backslash +beta +\backslash +in P'$}{Añadir $A +\backslash +to +\backslash +beta$ a $P'$} +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:rm-unitary" + +\end_inset + +Eliminación de reglas unitarias. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Una +\series bold +producción unitaria +\series default + es una regla de la forma +\begin_inset Formula $A\to B$ +\end_inset + + con +\begin_inset Formula $A,B\in V_{N}$ +\end_inset + +. + Toda GLC es equivalente a una que no contiene producciones unitarias por + el algoritmo +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:rm-unitary" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Formula $X\in V_{N}\cup V_{T}$ +\end_inset + + es una +\series bold +variable improductiva +\series default + si no existe +\begin_inset Formula $\omega\in V_{T}^{*}$ +\end_inset + + con +\begin_inset Formula $X\Rightarrow^{*}\omega$ +\end_inset + +, es un +\series bold +símbolo inaccesible +\series default + si no aparece en ninguna forma sentencial, es +\series bold +inútil +\series default + si es inaccesible o una variable improductiva y es +\series bold +útil +\series default + en caso contrario. +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{GLC $(V_N,V_T,P,S)$.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{GLC $(V'_N,V_T,P',S)$ equivalente sin variables improductivas.} +\end_layout + +\begin_layout Plain Layout + +$V'_N +\backslash +gets +\backslash +{A +\backslash +in V_N: +\backslash +exists +\backslash +omega +\backslash +in V_T^*:A +\backslash +to +\backslash +omega +\backslash +in P +\backslash +}$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Repetir{no se hayan añadido más elementos}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$A +\backslash +to X_1 +\backslash +cdots X_k +\backslash +in P$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +lSSi{$X_1, +\backslash +dots,X_k +\backslash +in M$}{Añadir $A$ a $V'_N$} +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +$P' +\backslash +gets +\backslash +{A +\backslash +to X_1 +\backslash +cdots X_k +\backslash +in P:X_1, +\backslash +dots,X_k +\backslash +in V'_N +\backslash +}$ +\backslash +; +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:rm-improductive" + +\end_inset + +Eliminación de variables improductivas. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{GLC $(V_N,V_T,P,S)$.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{GLC $(V'_N,V'_T,P',S)$ equivalente sin símbolos inaccesibles.} +\end_layout + +\begin_layout Plain Layout + +$R +\backslash +gets +\backslash +{S +\backslash +}$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Repetir{no se hayan añadido más elementos}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +lPara{$A +\backslash +to X_1, +\backslash +dots,X_k +\backslash +in P:A +\backslash +in R$}{Añadir $X_1, +\backslash +dots,X_k$ a $R$} +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + +$(V'_N,V'_T) +\backslash +gets(V_N +\backslash +cap R,V_T +\backslash +cap R)$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + +$P' +\backslash +gets +\backslash +{A +\backslash +to X_1, +\backslash +dots,X_k +\backslash +in P:A +\backslash +in R +\backslash +}$ +\backslash +; +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:rm-inaccessible" + +\end_inset + +Eliminación de símbolos inaccesibles. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Toda GLC admite una GLC equivalente sin símbolos inútiles, aplicando sucesivamen +te los algoritmos +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:rm-improductive" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + y +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:rm-inaccessible" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +. + En efecto, el algoritmo +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:rm-inaccessible" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + no resulta en variables improductivas si no las había de antes, pero el + algoritmo +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:rm-improductive" +plural "false" +caps "false" +noprefix "false" + +\end_inset + + sí que puede hacer a algunos símbolos inaccesibles. +\end_layout + +\begin_layout Standard +Una GLC es +\series bold +propia +\series default + si es +\begin_inset Formula $\lambda$ +\end_inset + +-libre y no tiene símbolos inútiles ni ciclos. + Toda GLC admite una GLC equivalente propia, que se puede obtener aplicando + sucesivamente y en orden los algoritmos +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:rm-lambda" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +– +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:rm-inaccessible" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Formula $A\in V_{N}$ +\end_inset + + es +\series bold +recursiva por la izquierda +\series default + si +\begin_inset Formula $\exists\alpha:A\Rightarrow^{+}A\alpha$ +\end_inset + +, +\series bold +recursiva por la derecha +\series default + si +\begin_inset Formula $\exists\alpha:A\Rightarrow^{+}\alpha A$ +\end_inset + + y +\series bold +recursiva +\series default + si +\begin_inset Formula $\exists\alpha,\beta:A\Rightarrow^{+}\alpha A\beta$ +\end_inset + +. + Una gramática es recursiva por la izquierda, por la derecha o recursiva + (a secas) si tiene alguna variable que lo sea. + Una regla de producción es recursiva por la izquierda si es de la forma + +\begin_inset Formula $A\to A\alpha$ +\end_inset + +, por la derecha si es de la forma +\begin_inset Formula $A\to\alpha A$ +\end_inset + + y recursiva si es de la forma +\begin_inset Formula $A\to\alpha A\beta$ +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{GLC $(V_N,V_T,P,S)$ propia.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{GLC equivalente $(V'_N,V_T,P',S)$ sin recursividad por la izquierda.} +\end_layout + +\begin_layout Plain Layout + +Llamar $ +\backslash +{A_1, +\backslash +dots,A_n +\backslash +}:=V_N$ con $A_1=S$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + +$(V'_N,P') +\backslash +gets(V_N,P)$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$i +\backslash +gets1$ +\backslash +KwA $n$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +SSi{$A_i$ tiene producciones recursivas por la izquierda}{ +\end_layout + +\begin_layout Plain Layout + + Llamar a las producciones de $A_i$ como $A_i +\backslash +to A_i +\backslash +alpha_1 +\backslash +mid +\backslash +dots +\backslash +mid A_i +\backslash +alpha_m +\backslash +mid +\backslash +beta_1 +\backslash +mid +\backslash +dots +\backslash +mid +\backslash +beta_n$, donde $ +\backslash +beta_{j0} +\backslash +neq A_i$ para ningún $i$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + Dado un $A' +\backslash +notin V'_N +\backslash +cup V_T$, $V'_N +\backslash +gets V_N +\backslash +cup +\backslash +{A' +\backslash +}$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + Sustituir las producciones de $A_i$ en $P'$ por +\backslash + +\backslash + +\end_layout + +\begin_layout Plain Layout + + $ +\backslash +{A_i +\backslash +to +\backslash +beta_1 +\backslash +mid +\backslash +dots +\backslash +mid +\backslash +beta_n +\backslash +mid +\backslash +beta_1A' +\backslash +mid +\backslash +dots +\backslash +mid +\backslash +beta_nA',$ +\backslash + +\backslash + +\end_layout + +\begin_layout Plain Layout + + $ +\backslash +hphantom{ +\backslash +{}A' +\backslash +to +\backslash +alpha_1 +\backslash +mid +\backslash +dots +\backslash +mid +\backslash +alpha_m +\backslash +mid +\backslash +alpha_1A' +\backslash +mid +\backslash +dots +\backslash +mid +\backslash +alpha_mA' +\backslash +}$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$j +\backslash +gets 1$ +\backslash +KwA $i-1$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$R:=(A_{i+1} +\backslash +to A_j +\backslash +alpha) +\backslash +in P'$}{ +\end_layout + +\begin_layout Plain Layout + + Si las producciones de $A_j$ son $A_j +\backslash +to +\backslash +gamma_1 +\backslash +mid +\backslash +dots +\backslash +mid +\backslash +gamma_p$, sustituir $R$ por $A_{i+1} +\backslash +to +\backslash +gamma_1 +\backslash +alpha +\backslash +mid +\backslash +dots +\backslash +mid +\backslash +gamma_p +\backslash +alpha$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:rm-left-recur" + +\end_inset + +Eliminación de la recursividad por la izquierda. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Toda GLC recursiva por la izquierda admite otra equivalente que no es recursiva + por la izquierda, por el algoritmo +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:rm-left-recur" +plural "false" +caps "false" +noprefix "false" + +\end_inset + +. +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{GLC $(V_N,V_T,P,S)$.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{GLC equivalente $(V'_N,V_T,P',S)$ sin factores comunes por la izquierda.} +\end_layout + +\begin_layout Plain Layout + +$(V'_N,P') +\backslash +gets(V_N,P)$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Para{$A +\backslash +in V_N$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +Repetir{$ +\backslash +alpha= +\backslash +lambda$}{ +\end_layout + +\begin_layout Plain Layout + + Encontrar el prefijo $ +\backslash +alpha$ más largo común a dos producciones de $A$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +SSi{$ +\backslash +alpha +\backslash +neq +\backslash +lambda$}{ +\end_layout + +\begin_layout Plain Layout + + Llamar a estas producciones $A +\backslash +to +\backslash +alpha +\backslash +beta_1 +\backslash +mid +\backslash +dots +\backslash +mid +\backslash +alpha +\backslash +beta_n +\backslash +mid +\backslash +gamma_1 +\backslash +mid +\backslash +dots +\backslash +mid +\backslash +gamma_k$, donde ningún $ +\backslash +gamma_i$ tiene prefijo $ +\backslash +alpha$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + Dado $A' +\backslash +notin V'_N +\backslash +cup V_T$, añadir $A'$ a $V'_N$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + Sustituir las producciones de $A$ por $A +\backslash +to +\backslash +alpha A' +\backslash +mid +\backslash +gamma_1 +\backslash +mid +\backslash +dots +\backslash +mid +\backslash +gamma_k$ y $A' +\backslash +to +\backslash +beta_1 +\backslash +mid +\backslash +dots +\backslash +mid +\backslash +beta_n$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:factor" + +\end_inset + +Factorización por la izquierda. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +Si existen reglas +\begin_inset Formula $A\to\alpha\beta,A\to\alpha\gamma\in P$ +\end_inset + + con +\begin_inset Formula $|\alpha|>0$ +\end_inset + +, +\begin_inset Formula $\alpha$ +\end_inset + + es un +\series bold +factor común por la izquierda +\series default +. + Toda GLC admite una equivalente sin factores comunes. +\end_layout + +\begin_layout Section +Análisis descendente +\end_layout + +\begin_layout Standard +Una GLC es +\begin_inset Formula $LL(k)$ +\end_inset + + si, leyendo una entrada de izquierda a derecha ( +\emph on +Left-to-right +\emph default +), se puede construir la derivación más a la izquierda correspondiente ( +\emph on +Leftmost derivation +\emph default +) sin más de +\begin_inset Formula $k$ +\end_inset + + +\emph on +tokens +\emph default + de anticipación. + Toda gramática +\begin_inset Formula $LL(k)$ +\end_inset + + es +\begin_inset Formula $LR(k)$ +\end_inset + +. +\end_layout + +\begin_layout Standard +Saber si un lenguaje es o no +\begin_inset Formula $LL(1)$ +\end_inset + + es indecidible, pero a veces podemos transformar una gramática para obtener + otra equivalente +\begin_inset Formula $LL(1)$ +\end_inset + +, por ejemplo, eliminando ambigüedad y recursividad por la izquierda o factoriza +ndo por la izquierda. +\end_layout + +\begin_layout Standard +Dada una GLC +\begin_inset Formula $(V_{N},V_{T},P,S)$ +\end_inset + +, definimos +\begin_inset Formula $\mathsf{Predict}:P\to{\cal P}(V_{T}\sqcup\{\$\})$ +\end_inset + + como +\begin_inset Formula +\[ +\mathsf{Predict}(A\to\alpha):=\begin{cases} +(\mathsf{PRIMERO}(\alpha)\setminus\{\lambda\})\cup\mathsf{SIGUIENTE}(A), & \lambda\in\mathsf{PRIMERO}(\alpha);\\ +\mathsf{PRIMERO}(\alpha), & \text{en otro caso}. +\end{cases} +\] + +\end_inset + + +\end_layout + +\begin_layout Standard +Una +\series bold +tabla de análisis +\series default + de un analizador descendente predictivo no recursivo es una función +\begin_inset Formula $M:V_{N}\times(V_{T}\cup\{\$\})\to{\cal P}(P)$ +\end_inset + + dada por +\begin_inset Formula $M(A,a):=\{A\to\alpha\in P:a\in\mathsf{Predict}(A\to\alpha)\}$ +\end_inset + +, que a cada no terminal a derivar y terminal siguiente en la entrada le + asocia un conjunto de reglas que pueden aplicarse para realizar la siguiente + derivación. + +\end_layout + +\begin_layout Standard +Con esto, una GLC es +\begin_inset Formula $LL(1)$ +\end_inset + + si ningún +\begin_inset Formula $M(A,a)$ +\end_inset + + tiene más de un elemento, si y sólo si para cualquier par de producciones + de un mismo no terminal +\begin_inset Formula $A\to\alpha$ +\end_inset + + y +\begin_inset Formula $A\to\beta$ +\end_inset + +, +\begin_inset Formula $\mathsf{Predict}(A\to\alpha)$ +\end_inset + + y +\begin_inset Formula $\mathsf{Predict}(A\to\beta)$ +\end_inset + + son disjuntos. +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +Entrada{La tabla de análisis $M$ para una gramática $(V_N,V_T,P,S)$ $LL(1)$ + y un flujo de +\backslash +emph{tokens} acabado en la marca de fin $ +\backslash +$$.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +Salida{Derivación más a la izquierda de la entrada, o error.} +\end_layout + +\begin_layout Plain Layout + +Inicializar la pila $P$ con $ +\backslash +$$ y $S$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +Repetir{$X= +\backslash +$$}{ +\end_layout + +\begin_layout Plain Layout + + Sacar un símbolo $X$ de la pila +\backslash +; +\end_layout + +\begin_layout Plain Layout + + Leer un +\backslash +emph{token} $a$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + +\backslash +SSi{$X +\backslash +neq a$}{ +\end_layout + +\begin_layout Plain Layout + + +\backslash +uSSi{$X +\backslash +in V_T +\backslash +lor M[X,a]= +\backslash +emptyset$}{Error.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +EnOtroCasoSi{$M[X,a]= +\backslash +{X +\backslash +to Y_1 +\backslash +cdots Y_k +\backslash +}$}{ +\end_layout + +\begin_layout Plain Layout + + Introducir $Y_k, +\backslash +dots,Y_1$ en orden en $P$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + Emitir la derivación por la izquierda dada por $X +\backslash +to Y_1 +\backslash +cdots Y_k$ +\backslash +; +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + + } +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:descent-nr" + +\end_inset + +Ejecución de un analizador descendente no recursivo. +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +La ejecución de un analizador descendente predictivo no recursivo se hace + con el algoritmo +\begin_inset Note Note +status open + +\begin_layout Plain Layout + +\end_layout + +\end_inset + +, en el que, si +\begin_inset Formula $\omega$ +\end_inset + + es la porción de entrada reconocida hasta ahora, la pila contiene una +\begin_inset Formula $\alpha\in(V_{N}\cup V_{T})^{*}$ +\end_inset + + seguida de +\begin_inset Formula $\$$ +\end_inset + + (al fondo) de forma que +\begin_inset Formula $S\Rightarrow_{\text{mi}}^{*}\omega\alpha$ +\end_inset + +. +\end_layout + +\begin_layout Standard +La gramática no ambigua que vimos para +\family typewriter +if-then-else +\family default + no es +\begin_inset Formula $LL(1)$ +\end_inset + +, pues +\begin_inset Formula $\mathsf{Predict}(S\to S_{e})=\{i,s\}$ +\end_inset + + y +\begin_inset Formula $\mathsf{Predict}(S\to S_{ne})=\{i\}$ +\end_inset + +, pero una solución común es partir de la gramática inicial ambigua, factorizarl +a si se puede y construir la tabla de análisis seleccionando la regla que + resuelve cada conflicto. +\end_layout + +\begin_layout Standard +En este caso, factorizando la gramática +\begin_inset Formula $S\to iEtS\mid iEtSeS\mid s;E\to x$ +\end_inset + + obtenemos +\begin_inset Formula $S\to iEtSS'\mid s;S'\to eS\mid\lambda;E\to x$ +\end_inset + +, que también es ambigua, y tenemos +\begin_inset Formula +\begin{align*} +\mathsf{Predict}(S\to iEtSS') & =\{i\}, & \mathsf{Predict}(S\to s) & =\{s\},\\ +\mathsf{Predict}(S'\to eS) & =\{e\}, & \mathsf{Predict}(S'\to\lambda) & =\{e,\$\}, & \mathsf{Predict}(E\to x) & =\{x\}. +\end{align*} + +\end_inset + +El único conflicto se da entre +\begin_inset Formula $S'\to eS$ +\end_inset + + y +\begin_inset Formula $S'\to\lambda$ +\end_inset + +, que tienen en común el símbolo +\begin_inset Formula $e$ +\end_inset + +, y para asociar el +\family typewriter +else +\family default + con el +\family typewriter +if +\family default + más próximo, se debe elegir +\begin_inset Formula $S'\to eS$ +\end_inset + + en la entrada +\begin_inset Formula $(S',e)$ +\end_inset + + de la tabla de análisis. +\end_layout + +\end_body +\end_document |
