Compilador Diseño - Analizador descendente


Anuncios

Hemos aprendido en el último capítulo de la parte superior de el análisis técnica analiza la entrada, y se inicia construcción de un árbol de análisis sintáctico el nodo raíz gradualmente moviéndose hacia abajo a los nodos hoja. Los tipos de arriba abajo se describe a continuación el análisis:

De análisis de arriba hacia abajo

Análisis ascendencia recursiva

Ascendencia recursiva es una de las principales técnicas de análisis que construye el árbol de análisis sintáctico y la parte superior se lee la entrada de izquierda a derecha. Utiliza procedimientos para cada terminal y no terminal entidad. Este análisis técnica recursiva analiza la entrada para realizar un análisis, un árbol que puede requerir o no retroceder. Pero la gramática asociada a ella (si no cuenta) no puede evitar retrocesos. Una forma de análisis recursivo de ascendencia que no requiere ningún rastreo se conoce como análisis predictivo.

Este análisis se considera técnica recursiva ya que utiliza libres de contexto gramática que es de naturaleza recursiva.

Rastreo

Desde arriba los analizadores inicio desde el nodo raíz (símbolo de inicio) y coincide con la cadena de entrada contra las normas de producción para sustituir (si corresponde). Para entender esto, tomar el siguiente ejemplo de CFG:

S → rXd | rZd
X → oa | ea
Z → ai

Para una cadena de entrada: leer, un analizador de arriba a abajo, se comportará como esta:

Se iniciará con la de las normas de producción y coincidirá con su rendimiento en la izquierda de la carta de la entrada, es decir, 'r'. La producción de S (S → rXd) coincide con ella. Por lo tanto, el top-down analizador avanza a la siguiente carta de entrada (es decir 'E' ). El analizador intenta expandir no terminal 'X' y comprueba su producción desde la izquierda (X → oa). Que no se corresponde con el siguiente símbolo de entrada. Por lo tanto, el de arriba a abajo retroceso analizador para obtener la siguiente regla de producción X, (X → ea).

Ahora, el analizador de entrada coincide con todas las letras de forma ordenada. La cadena es aceptada.

Seguimiento Volver Seguimiento Volver Seguimiento Volver Seguimiento Volver

Analizador Predictivo

Analizador sintáctico Predictivo recursivo es un analizador ascendencia, que tiene la capacidad de predecir que la producción se debe usar para sustituir la cadena de entrada. El analizador predictivo no sufren de retroceso.

Para cumplir sus cometidos, el analizador predictivo utiliza un puntero hacia delante, que apunta a la siguiente entrada los símbolos. Para que el analizador de libres, el analizador predictivo pone algunas limitaciones a la gramática y acepta sólo una clase de gramática conocida como LL(k) gramática.

Analizador predictivo

Análisis predictivo utiliza una pila y un análisis a fin de analizar el cuadro de entrada y generar un análisis árbol. Tanto la pila y la entrada contiene un símbolo de final $ para indicar que la pila está vacía y la entrada es consumida. El analizador se refiere al análisis tabla para tomar cualquier decisión sobre la entrada de pila y combinaciones de elementos.

Top-Down Analizador Construcción

Ascendencia recursiva en el análisis, el analizador puede tener más de una producción entre los que elegir para una sola instancia de entrada, mientras que analizador de predicción, cada paso ha de una producción más para elegir. Es posible que haya casos en que no hay producción de la cadena de entrada, con lo que el procedimiento de análisis.

LL Analizador

Acepta un analizador LL LL gramática. LL gramática es un subconjunto libre de contexto gramática pero con algunas limitaciones para obtener la versión simplificada, con el fin de lograr una fácil implementación. LL gramática se puede aplicar a través de ambos algoritmos recursivos, de ascendencia o tabla.

LL analizador se denota como LL(k). La primera L en LL(k) es el análisis de la entrada de izquierda a derecha, la segunda L en LL(k) representa más a la izquierda de derivación y k representa el número de lecturas. Por lo general k = 1, de modo que LL(k) también puede ser escrito como LL(1).

LL Analizador

Algoritmo LL Análisis

Nos puede adherirse a determinista LL(1) para analizador explicación, ya que el tamaño de la tabla crece de forma exponencial con el valor de k. En segundo lugar, si en la gramática no es LL(1), a continuación, por lo general, no es LL(k), para cualquier k.

A continuación se muestra un algoritmo para LL(1) El análisis:

Input: 
   string ω 
   parsing table M for grammar G

Output:
   If ω is in L(G) then left-most derivation of ω,
   error otherwise.

Initial State : $S on stack (with S being start symbol)
   ω$ in the input buffer

SET ip to point the first symbol of ω$.

repeat
   let X be the top stack symbol and a the symbol pointed by ip.

   if X∈ Vt or $
      if X = a
         POP X and advance ip.
      else
         error()
      endif
      
   else	/* X is non-terminal */
      if M[X,a] = X → Y1, Y2,... Yk    
         POP X
         PUSH Yk, Yk-1,... Y1 /* Y1 on top */
         Output the production X → Y1, Y2,... Yk 
      else
         error()
      endif
   endif
until X = $	/* empty stack */

Una gramática G es LL(1) si A → α | β se distinguen dos producciones de G:

  • Para terminal, α y β derivar cadenas comienzan con un.

  • En la mayoría de α y β pueden derivar cadena vacía.

  • Si β → t, a continuación, α no se deriva ninguna cadena que empieza con un terminal en SIGA(A).

Advertisements