Compilador Diseo - Sintaxis Anlisis



Sintaxis anlisis o anlisis es la segunda fase de un compilador. En este captulo, vamos a aprender los conceptos bsicos utilizados en la construccin de un analizador.

Hemos visto que un analizador lxico puede identificar los tokens con la ayuda de expresiones regulares y reglas de patrones. Pero un analizador lxico no puede comprobar la sintaxis de una frase debido a las limitaciones de las expresiones regulares. Las expresiones regulares no puede comprobar equilibrio fichas, como entre parntesis. Por lo tanto, esta fase utiliza gramtica libre de contexto (CFG), que est reconocida por empuje de autmatas.

CFG, por otro lado, es un superconjunto de Gramtica Regular, como se ilustra a continuacin:

Relacin de la CFG y gramtica regular

Esto implica que cada Gramtica Regular es tambin libres de contexto, pero hay algunos problemas, que estn ms all del alcance de Gramtica Regular. CFG es una herramienta til para describir la sintaxis de los lenguajes de programacin.

Gramtica Context-Free

En esta seccin, vamos a ver en primer lugar la definicin de gramtica libre de contexto e introducir trminos utilizados en el anlisis.

UNA gramtica libre de contexto tiene cuatro componentes:

  • Un conjunto de no-terminales (V). No terminales son variables sintcticas que denotan conjuntos de cadenas. La no-terminales definir conjuntos de cadenas que ayudan a definir el lenguaje generado por la gramtica.

  • Un conjunto de smbolos, conocido como smbolos terminales (Σ). Los terminales son los smbolos bsicos de las cadenas que se forman.

  • Un conjunto de producciones (P). Las producciones de una gramtica especifica la forma en la que los terminales y no terminales se pueden combinar para formar cadenas. Cada produccin consiste en un no-terminal llamado el lado izquierdo de la produccin, una flecha, y una secuencia de las fichas y/o en los terminales, llamado el lado derecho de la produccin.

  • Uno de los terminales es designado como el smbolo de arranque (S); desde donde comienza la produccin.

Las cadenas se deriva del smbolo de arranque varias veces por sustitucin de un no-terminal (en un principio, el smbolo de arranque) por el lado derecho de una produccin, para que no sean de terminal server.

Ejemplo

Tenemos el problema de palindromo idioma, que no se puede describir por medio de expresiones regulares. Es decir, L = { w | w = wR } no es un idioma habitual. Pero no se puede describir por medio de CFG, tal como se ilustra a continuacin:

G = ( V, Σ, P, S )

Donde:

V = { Q, Z, N }
Σ = { 0, 1 }
P = { Q → Z | Q → N | Q → ℇ | Z → 0Q0 | N → 1Q1 }
S = { Q }

Esta gramtica describe palindromo idioma, tales como: 1001, 11100111, 1010101, 00100, 11111, etc.

Analizadores Sintaxis

Un analizador de sintaxis tiene la entrada de un analizador lxico en forma de token arroyos. El analizador analiza el cdigo fuente (token) contra las normas de produccin para detectar los errores en el cdigo. El resultado de esta fase es analizar un rbol.

Sintaxis Analizador

Esta manera, el analizador realiza dos tareas, es decir, analizar el cdigo y busca los errores y generar un anlisis rbol como la salida de la etapa.

Los analizadores se espera para analizar todo el cdigo aunque algunos errores en el programa. Error en la recuperacin los Analizadores utilizan estrategias que vamos a aprender ms adelante en este captulo.

Derivacin

Una derivacin es bsicamente una secuencia de reglas de produccin, con el fin de obtener la cadena de entrada. Durante el anlisis, tomamos dos decisiones para algunos el oracional formulario de entrada:

  • Decidir el no terminal que se va a sustituir.
  • Decidir sobre la produccin, por lo cual, el no-terminal ser reemplazado.

Para decidir que no terminal que se va a reemplazar por produccin, no puede tener dos opciones.

Ms a la izquierda de derivacin

Si el formulario el oracional de una entrada es capturado y se cambia de izquierda a derecha, se llama ms a la izquierda de derivacin. El oracional La forma derivada por el de la izquierda se llama derivacin de la izquierda forma el oracional.

Ms a la derecha de derivacin

Si podemos explorar y cambiar la entrada con las normas de produccin, de derecha a izquierda, es lo que se conoce como derivacin ms a la derecha. El oracional La forma derivada de la derivacin ms a la derecha se denomina derecho-el oracional.

Ejemplo

Normas de produccin:

E → E + E
E → E * E
E → id 

Cadena de entrada: id + id * id.

Ms a la izquierda es derivacin:

E → E * E
E → E + E * E
E → id + E * E
E → id + id * E
E → id + id * id

Tenga en cuenta que el lado izquierdo de la no-terminal siempre se procesa primero.

El derecho de la derivacin es:

E → E + E
E → E + E * E
E → E + E * id
E → E + id * id
E → id + id * id

Parse Tree

Un anlisis rbol es una representacin grfica de una derivacin. Es conveniente para ver cmo las cadenas se deriva del smbolo de inicio. El smbolo de arranque de la derivacin se convierte en la raz de la parse tree. Veamos esto con un ejemplo de este tema.

Seguimos a la izquierda de la derivacin de a + b * c

Ms a la izquierda es derivacin:

E → E * E
E → E + E * E
E → id + E * E
E → id + id * E
E → id + id * id

Paso 1:

E → E * E Construccin Parse rbol

Paso 2:

E → E + E * E Construccin Parse rbol

Paso 3:

E → id + E * E Construccin Parse rbol

Paso 4:

E → id + id * E Construccin Parse rbol

Paso 5:

E → id + id * id. Construccin Parse rbol

En un anlisis rbol:

  • Todos los nodos hoja son terminales.
  • Todos los interiores son los nodos no terminales.
  • En fin travesa da original cadena de entrada.

rbol representa un anlisis asociatividad y precedencia de los operadores. El ms profundo sub-rbol es atravesado en primer lugar, por lo tanto el operador en ese sub-rbol obtiene prioridad sobre el operador que se encuentra en los nodos principales.

Ambigedad

Una gramtica G se dice que es ambigua si tiene ms de un rbol analizar (a la izquierda o a la derecha) por lo menos una cadena.

Ejemplo

E → E + E
E → E – E
E → id

Para la cadena id + id - id, la gramtica genera dos analizar los rboles:

Construccin Parse rbol

El lenguaje generado por una gramtica es ambigua dice que es inherentemente ambiguo. Ambigedad de gramtica no es bueno para un compilador construccin. Ningn mtodo puede detectar y eliminar la ambigedad automticamente, pero se puede extraer por cualquier re-escritura toda la gramtica sin ambigedad, o por establecer y asociatividad y restricciones de precedencia.

Asociatividad

Si un operando tiene operadores de ambos lados, el lado en el que el operador aprovecha esta operando es decidido por la asociatividad de los operadores. Si la operacin es asociativos por la izquierda, a continuacin, el operando se tomarn por la izquierda operador, o si la operacin es asociativa, el operando derecho tendr el operando.

Ejemplo

Las operaciones tales como la adicin, sustraccin, multiplicacin, divisin y asociativo. Si la expresin contiene:

id op id op id

sta ser evaluada como:

(id op id) op id

Por ejemplo, (id + id) + id

Operaciones de exponenciacin como son derecho asociativo, es decir, el orden de evaluacin en la misma expresin ser:

id op (id op id)

Por ejemplo, id ^ (id ^ id)

Prioridad

Si dos operadores diferentes comparten un operando, la precedencia de los operadores decide que tendr el operando. Es decir, 2+3*4 puede tener dos anlisis diferentes rboles, uno correspondiente a (2+3) * 4 y otro correspondiente a 2+(3 * 4). De preferencia entre los operadores, este problema se puede retirar fcilmente. Como en el ejemplo anterior, desde el punto de vista matemtico * (multiplicacin) tiene precedencia sobre + (suma), de forma que la expresin 2+3 * 4 siempre ser interpretada en el sentido de:

2 + (3 * 4)

Estos mtodos disminuyen el riesgo de ambigedad en el lenguaje o su gramtica.

Recursin izquierda

Una gramtica se convierte izquierda-recursive si tiene cualquier no terminal 'A' cuya derivacin contiene 'A' s mismo como el smbolo de la izquierda. De izquierda gramtica recursiva es considerada una situacin problemtica para los analizadores. De arriba a abajo los analizadores iniciar el anlisis desde el principio, y que en s mismo no es terminal. Por lo tanto, cuando el analizador encuentra el mismo no-terminal en su derivacin, se vuelve difcil de juzgar cuando para detener el anlisis de la izquierda no terminales y que entra en un bucle infinito.

Ejemplo:

(1) A => Aα | β
(2) S => Aα | β 
    A => Sd 

(1) es un ejemplo de recursividad inmediatamente a la izquierda, donde A es un smbolo no terminal y α representa una cadena de terminales.

(2) es un ejemplo de recursividad indirecta a la izquierda.

izquierda recursividad

Un analizador de arriba abajo, en primer lugar analizar el A, que a su vez producir una cadena compuesta por el mismo y el analizador puede entrar en un bucle indefinidamente.

Extraccin de recursin izquierda

Una forma de eliminar la recursividad izquierda para usar el siguiente mtodo:

La produccin

A => Aα | β

Se convierte en producciones

A => βA’
A => αA’ | ε

Esto no tiene impacto en el las cadenas derivadas de la gramtica, sino que elimina inmediatamente a la izquierda recursividad.

Segundo mtodo consiste en utilizar el siguiente algoritmo, que deben eliminar todas directas e indirectas recursividad izquierda.

START
Arrange non-terminals in some order like A1, A2, A3,…, An
   for each i from 1 to n
      {
      for each j from 1 to i-1
         {
         replace each production of form Ai⟹Aj𝜸
         with Ai ⟹ δ1𝜸  | δ2𝜸 | δ3𝜸 |…| 𝜸 
         where Aj ⟹ δ1 | δ2|…| δn  are current Aj productions
         }
      }
   eliminate immediate left-recursion
END

Ejemplo

La produccin

S => Aα | β 
A => Sd

Despus de aplicar el algoritmo antes descrito, debe convertirse en

S => Aα | β 
A => Aαd | βd

Y, a continuacin, retirar inmediatamente a la izquierda recursividad con la primera tcnica.

A => βdA’
A => αdA’ | ε

Ahora bien, ninguna de la produccin directa o indirecta izquierda recursividad.

Factoring izquierda

Si hay ms de una gramtica normas de produccin tiene un prefijo comn cadena, entonces el top-down analizador no puede hacer una eleccin de de la produccin debe tener para analizar la cadena de la mano.

Ejemplo

Si un top-down analizador encuentra una produccin como

A ⟹ αβ | α𝜸 | …

A continuacin, no puede determinar qu produccin a seguir para analizar la cadena de ambas producciones estn empezando desde el mismo terminal (o no-terminal). Para eliminar esta confusin, se utiliza una tcnica llamada izquierda factoring.

Factoring Izquierda transforma la gramtica para que sea til para los analizadores de arriba a abajo. En esta tcnica, se hace una produccin para cada uno de los prefijos y el resto de la derivacin de nuevas producciones.

Ejemplo

Las producciones se puede escribir como

A => αA’
A’=> β | 𝜸 | … 

Ahora el analizador slo tiene una produccin por prefijo, lo que facilita a la hora de tomar las decisiones.

En primer lugar y el seguimiento conjuntos

Una parte importante del analizador construccin tabla es para crear la primera y el seguimiento. Estos juegos pueden proporcionar la posicin real de cualquier terminal de la derivacin. Esto se hace para crear el anlisis tabla donde la decisin de reemplazar T[A, t] = α con parte de la produccin.

Primer Juego

Este juego es creado para saber qu smbolo terminal se deriva de la primera posicin por un no-terminal. Por ejemplo,

α → t β

Se deriva que es α t (terminal) en la primera posicin. Por lo tanto, t ∈ PRIMERO(α).

Algoritmo para calcular primero

Fjese en la definicin de PRIMERA(α) establecido:

  • Si α es una terminal, luego en la primera(α) = { α }.
  • Si α es un no-terminal y α → ℇ es una produccin, entonces PRIMERO(α) = { ℇ }.
  • Si α es un no-terminal y α → 𝜸1 𝜸2 𝜸3 … 𝜸n cualquier PRIMERA(𝜸)contiene a su vez, t. t es de primera(α).

En primer lugar se puede considerar como:

Primera Frmula

Sigue

Del mismo modo, podemos calcular qu smbolo terminal sigue inmediatamente un no-terminal α en normas de produccin. No tenemos en cuenta lo que el no-terminal puede producir pero en lugar de eso, vemos lo que sera el siguiente smbolo terminal que sigue la produccin de un no-terminal.

Algoritmo para calcular sigue:

  • Si α es un smbolo de inicio y, a continuacin, siga() = $

  • Si α es un no-terminal y tiene una produccin α → AB, luego la primera(B) es en el seguimiento(A), salvo ℇ.

  • Si α es un no-terminal y tiene una produccin α → AB, donde B ℇ, a continuacin, siga(A) est en el seguimiento(α).

Seguimiento conjunto puede considerarse como: SEGUIMIENTO(α) = { t | S *αt*}

Analizadores de Sintaxis Limitaciones

Analizadores Sintaxis recibir sus aportes, en forma de fichas, de analizadores lxicos. Analizadores lxicos son responsables de la validez de un token suministrado por el analizador sintaxis. Sintaxis analizadores tienen los siguientes inconvenientes:

  • No se puede determinar si una seal es vlida,
  • No puede determinar si un token es declarado antes de que se utilice,
  • No puede determinar si un token se inicia antes de que se utilice,
  • No se puede determinar si una operacin realizada en un tipo de token es vlida o no.

Estas tareas son realizadas por el analizador semntico, que estudiaremos en anlisis semntico.

Advertisements