Anda di halaman 1dari 8

Análisis sintáctico descendente y análisis sintáctico ascendente

NOMBRE:
BRAYAN JOEL ROSAS TELLO

CARRERA:
INGENIERÍA EN SISTEMAS COMPUTACIONALES.

ASIGNATURA:
LENGUAJES Y AUTÓMATAS II.

TEMA:
ENSAYO. ANÁLISIS SINTÁCTICO DESCENDENTE Y ANÁLISIS SINTÁCTICO
ASCENDENTE.

NOMBRE DEL INSTRUCTOR:


JUAN JOSÉ EVERARDO RIVERO CABALLERO.

STGO. PINOTEPA NACIONAL OAXACA 06 DE FEBRERO DE 2018


Análisis sintáctico descendente y análisis sintáctico ascendente

Índice

Introducción ................................................................................................................................................... 3
Capítulo 4. Análisis Sintáctico Descendente ............................................................................................... 4
4.1 Análisis sintáctico descendente mediante método descendente recursivo ...................................... 4
4.2 Análisis Sintáctico LL(1)..................................................................................................................... 4
4.3 Conjuntos Primero y Siguiente .......................................................................................................... 5
5.1 Perspectiva General Del Análisis Sintáctico Ascendente ................................................................. 5
5.2 Autómatas Finitos De Elementos LR(0) y Análisis Sintáctico LR(0).............................................. 6
5.2.1 Elementos LR(0). .......................................................................................................................... 6
5.3 Análisis sintáctico SLR(1) ................................................................................................................... 6
Conclusión ...................................................................................................................................................... 8
Bibliografía .................................................................................................................................................... 8
Análisis sintáctico descendente y análisis sintáctico ascendente

Introducción

En el siguiente ensayo se hablará acerca del capítulo IV y V llamados Análisis sintáctico


descendente y Análisis sintáctico ascendente respectivamente del libro Construcción de
compiladores, principios y práctica del autor Kenneth Louden. Dentro del capítulo IV del libro se
dará un tipo de análisis sintáctico de manera descendente que realizan los compiladores; se darán
definiciones, funcionamiento, y su algoritmo. En el capítulo V se verá otro caso de análisis
sintáctico, en este caso de manera ascendente; definiciones, funcionamiento, y su algoritmo.
El objetivo es conocer es conocer el funcionamiento interno del compilador en la fase de
análisis sintáctico para que nosotros podamos construir nuestro propio compilador u de esta
manera podamos entender a fondo las clases proporcionadas por el docente y podamos aplicar
dichos conocimientos en el desarrollo de autómatas para el uso cotidiano, para empresas o
situaciones que los requieran.
Se pretende que el ensayo sea lo más claro específico posible para el entendimiento de futuros
lectores y para el catedrático quién leerá dicho redactado.

3
Análisis sintáctico descendente y análisis sintáctico ascendente

Capítulo 4. Análisis Sintáctico Descendente

Un algoritmo de análisis sintáctico descendente analiza una cadena de tokens de entrada mediante
la búsqueda de los pasos en una derivación por la izquierda. Un algoritmo así se denomina
descendente debido a que el recorrido implicado del árbol de análisis gramatical es un recorrido de
preorden y, de este modo, se presenta desde la raíz hacia las hojas.
Un analizador sintáctico predictivo intenta predecir la siguiente construcción en la cadena
de entrada utilizando uno o más tokens de búsqueda por adelantado, mientras que un analizador
sintáctico inverso intentará las diferentes posibilidades para un análisis sintáctico de la entrada,
respaldando una cantidad arbitraria en la entrada si una posibilidad falla.
Las dos clases de algoritmos de análisis sintáctico descendente que se verán se les conoce
como análisis sintáctico descendente recursivo y análisis sintáctico LL(1).

4.1 Análisis sintáctico descendente mediante método descendente recursivo

La idea del análisis sintáctico descendente recursivo es muy simple. Observamos la regla
gramatical para un no terminal A como una definición para un procedimiento que reconocer una
A. El lado derecho de la regla gramatical para A especifica la estructura del código par este
procedimiento: la secuencia de terminales y no terminales en una selección corresponde a
concordancias de la entrada y llamadas a otros procedimientos, mientras que las selecciones
corresponden a las alternativas (sentencias case o if) dentro del código.

4.2 Análisis Sintáctico LL(1)

El método de análisis sintáctico LL(I) debe su nombre a lo siguiente. La primera "L" se


refiere al hecho de que se procesa la entrada de izquierda a derecha. del inglés "Left-right"
(algunos analizadores sintácticos antiguos empleaban para procesar la entrada de derecha a
izquierda, pero eso es poco habitual en la actualidad). La segunda "L" hace referencia al hecho de
que rastrea una derivación por la izquierda para la cadena de entrada. El número I entre paréntesis
significa que se utiliza sólo un símbolo de entrada para predecir la dirección del análisis sintáctico.
(También es posible tener análisis sintáctico LL(k), utilizando k símbolos de búsqueda hacia
delante).
El análisis sintáctico LL(1) utiliza una pila explícita en vez de llamadas recursivas para
efectuar un análisis sintáctico. Es útil representar esta pila de manera estándar, de manera que las
acciones de un analizador sintáctico LL(1) se puedan visualizar rápida y fácilmente. En este
análisis a manera de introducción usaremos la gramática simple que genera cadenas de paréntesis
balanceados:
S(S)S|𝜀

4
Análisis sintáctico descendente y análisis sintáctico ascendente

4.3 Conjuntos Primero y Siguiente

Si X es un símbolo de la gramática (un terminal o no terminal) o 𝜀, entonces el conjunto


Primero(X), compuesto de terminales, y posiblemente de 𝜀, se define de la manera siguiente:
1. Si X es un terminal o 𝜀, entonces Primero(X) = {X}.
2. Si X es no terminal entonces para cada selección de producción X  𝑋1 𝑋2 . . . 𝑋𝑛
Primero(X) contiene Primero(𝑋1) – { 𝜀 }. Si también para cualquier i<n, todos los
conjuntos Primero(𝑋1) …. Primero(𝑋𝑖 ) contienen 𝜀, entonces Primero(X) contiene
Primero(𝑋𝑖+1) – { 𝜀 }. Si todos los conjuntos Primero(𝑋1 ),…, Primero(𝑋𝑛 ) contienen 𝜀,
entones Primero(X) también contiene 𝜀.
Ahora definamos Primero(α), para cualquier cadena α=𝑋1 𝑋2…𝑋𝑛 (una cadena de terminales y
no terminales), de la mamera siguiente. Primero(α) contiene Primero(𝑋1) - { 𝜀 }. Para cada
i=2,…n, si Primero(𝑋𝑘 ) contiene 𝜀 para toda k=1,…,i-1, entonces Primero(α) contiene
Primero(𝑋𝑖 ) - { 𝜀 }. Finalmente, si para toda i=1,…, n, Primero(𝑋𝑖 ) contiene 𝜀, entonces
Primero(α) contiene 𝜀.

Capítulo 5. Análisis Sintáctico Ascendente

5.1 Perspectiva General Del Análisis Sintáctico Ascendente

Un analizador sintáctico ascendente utiliza una pila explícita para realizar un análisis
sintáctico, de manera semejante a como lo hace un analizador sintáctico descendente no recursivo.
La pila de análisis sintáctico contendrá tanto tokens como no terminales, y también alguna
información de estado adicional que analizaremos posteriormente. La pila está vacía al principio
de un análisis sintáctico ascendente y al final de un análisis sintáctico exitoso contendrá el símbolo
inicial.
Un analizador sintáctico ascendente tiene dos posibles acciones (aparte de "aceptar"):
1. Desplazar o transferir un terminal de la parte frontal de la entrada hasta la parte superior de
la pila.
2. Reducir una cadena α en la parte superior de la pila a un no terminal A, dada la selección
BNF A  α.
Por esta razón en ocasiones un analizador sintáctico ascendente se conoce como analizador
sintáctico de reducci6n por desplazamiento ("shift-reduce").

5
Análisis sintáctico descendente y análisis sintáctico ascendente

5.2 Autómatas Finitos De Elementos LR(0) y Análisis Sintáctico LR(0)

5.2.1 Elementos LR(0).

Un elementos LR(0) (o simplemente elemento para abreviar) de una gramática libre de


contexto es una regla de producción con una posición distinguida en su lado derecho. Indicaremos
esta posición distinguida mediante un punto (el cual, por supuesto, se convierte en un metasímbolo
para no confundirlo con un token real). De este modo, si A α es una regla de producción, y si β
y γ son dos cadenas cualesquiera de símbolos (incluyendo la cadena vacía 𝜀), tales como βγ = α,
entonces A  β, γ es un elemento LR(0). Éstos se conocen como elementos LR(0), porque no
contienen referencia explícita a la búsqueda hacia delante.
5.2.2 Autómatas finitos de elementos.
Los elementos LR(0) se pueden emplear como los estados de un autómata finito que
mantienen información cerca de la pila de análisis sintáctico y del progreso de un análisis de
reducción por desplazamiento. Esto comenzará como un autómata finito no determinístico.
5.3 Análisis sintáctico SLR(1)

5.3.1 El algoritmo de análisis sintáctico SLR(1).


El análisis sintáctico L.R(1) simple, o SLR(1) utiliza el DFA (le conjuntos de elementos
I:R(0) como se construyeron en la sección anterior. Sin embargo, incrementa de manera
importante la potencia del análisis sintáctico LR(0) al utilizar el token siguiente en la cadena de
entrada para dirigir sus acciones. Lo hace de dos maneras. La primera consulta el token entrada
antes de un desplazamiento para asegurarse de que existe una transición DFA apropiada. La
segunda utiliza el conjunto Siguiente de un no terminal.
El algoritmo de análisis sintáctico SLR(1). Sea s el estado actual (en la parte superior de pila de
análisis sintáctico). Entonces las acciones se definen como sigue
1. Si el estado s contiene cualquier elemento de la forma A  α.X β, donde X es un terminal,
y X es el siguiente token en la cadena de entrada, entonces la acción desplazar el token de
entrada actual a la pila, y el nuevo estado que se insertarán en la pila es el estado que
contiene el elemento A  α.X β.
2. Si el estado s contiene el elemento completo A γ. y el token siguiente en la cadena de
entrada está en una Siguiente(A), entonces la acción es reducir mediante la regla A γ.
Una reducción mediante la regla S’S, donde S es el estado inicial, es equivalente a la
aceptación; esto ocurrirá sólo si el siguiente token de entrada es $. En todos los otros casos,
el nuevo estado se calcula como sigue. Elimine la cadena α y todos sus estados

6
Análisis sintáctico descendente y análisis sintáctico ascendente

correspondientes de la pila de análisis sintáctico. De la misma manera, retroceda en el DFA


hacia el estado en el cual comenzó la construcción de α. Por construcción, este estado debe
contener un elemento de la forma B  γ.A β. Inserte A en la pila, e inserte el estado que
contiene el elemento B α,A.Β.
3. Si el siguiente token de entrada es de naturaleza tal que no se aplique ninguno de los dos
casos anteriores, se declara un error.
Decimos que una gramática es una gramática SLR(1) si la aplicación de las anteriores reglas
de análisis sintáctico SLR(1) no producen una ambigüedad. En particular, una gramática SLR(1) si
y sólo si, para cualquier estado s, se satisfacen las siguientes dos condiciones:
1. Para cualquier elemento A α,X β en s con un terminal X, no hay elemento completo B
γ, en s con X en Siguiente(B).
2. Para cualesquiera dos elementos completos A α, γ B β, en s,
Siguiente(A)∩Siguiente(B) es vacía.
Una violación de la primera de estas condiciones representa un conflicto de reducción por
desplazamiento. Una violación de la segunda de estas condiciones representa un conflicto de
reducción-reducción.

7
Análisis sintáctico descendente y análisis sintáctico ascendente

Conclusión

A lo largo del ensayo se vieron diferentes temas y estos dan a conocer el entendimiento del
cómo funcionan los compiladores en su fase de análisis sintáctico, y los conceptos que debemos
dominar para poder realizarlos.
Es necesario como futuros ingenieros en sistemas computacionales el entender el
procesamiento de la información de estos ya que en la actualidad son uno de los temas que más
destacan los que están relacionados con las ciencias de la computación

Bibliografía

Louden, K. (s.f.). En UNED Construcción de compiladores. Principios y práctica (págs. 143-245).