Análisis de Programa Fuente - norman-ipn/Errores GitHub Wiki

Análisis léxico

También llamado análisis lineal o de exploración, es cuando las cadenas de caracteres que constituye el programa fuente se lee de izquierda a derecha y se agrupa en componentes léxicos que son secuencias de caracteres que tienen un significado colectivo. Por ejemplo en el análisis léxico los caracteres de la proposición de asignación:

posición := inicial + velocidad * 60

Se agruparían en los componentes léxicos siguientes:

identificador		 	  posición
símbolo de asignación     :=
identificador			  inicial
signo				      +
identificador			  velocidad
signo				      *
numero			          60

Análisis Sintáctico

También denominado análisis jerárquico, en el que los caracteres o los componentes léxicos se agrupan jerárquicamente en frases gramaticales que se utilizaran para sintetizar la salida. Por lo general, las frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico como el que se muestra a continuación:

analisissintactico

En la expresión inicial + velocidad * 60 la frase velocidad * 60 es una unidad lógica, por las convenciones usuales de las expresiones aritméticas indican que la multiplicación se hace antes que la suma. Puesto que la expresión inicial + velocidad va seguida de un *, no se agrupa en una sola frase independiente.

La estructura jerarquica de un programa normalmente se expresa ultilizando reglas recursivas. Por ejemplo, se puede dar las siguientes reglas como parte de la definición de expresiones:

1) Cualquier identificador es una expresión
2) Cualquier número es una expresión
3) Si expresion1 y expresión 2 son expresiones entonces también lo son:
               expresion1 + expresion2

Las reglas (1) y (2) son reglas básicas (no recursivas), en tanto que la regla (3) define expresiones en función de operadores aplicados a otras expresiones. Así, por la regla (1) inicial y velocidad son expresiones. Por la regla (2), 60 es una expresión, mientras que por la regla (3), primero podemos inferir que velocidad * 60 es una expresión y finalmente que *inicial + velocidad 60 también es una expresión.

De manera similar, muchos lenguajes definen recursivamente las proposiciones mediante reglas como:

1) Si identificador1 es un identificador y expresión2 es una expresión, entonces:
                  identificador1 := expresión2
   es una proposición.

2) Si expresion1 es una expresión y proposicion2 es una proposición, entonces:
                  while ( expresion1 ) do proposicion2
                  if( expresion1) then proposicion2
   son proposiciones.

Análisis Semántico

Revisa el programa fuente para tratar de encontrar errores semánticos y reúne la información sobre los tipos para la fase posterior de generación de código. En ella se utilizan las estructuras jerárquica determinada por la fase de análisis sintáctico para identificar los operadores y operandos de expresiones y preposiciones.

Un componente importante del análisis semántico es la verificación de tipos. Aquí es donde se verifica si cada operador tiene operandos permitidos por la especificación del lenguaje fuente.

Por ejemplo, las definiciones de muchos lenguajes de programación requieren que el compilador indique un error cada vez que se use un número real como índice de una matriz. Sin embargo, las especificaciones del lenguaje pueden permitir ciertas coerciones a los operandos, por ejemplo cuando un operador aritmético binario se aplica a un número entero y a un número real. En este caso el compilador puede necesitar convertir el número entero a real.

Análisis en formadores de textos

Es útil considerar que la entrada de un formador de textos especifica una jerarquía de cajas: regiones rectangulares que se van a llenar con algún patrón de bits, representando pixeles claros y oscuros para ser impresos por el dispositivo de salida.

Bibliografía

Aho, Sethi, Ullman, Compiladores, Principios, Tecnicas Y Herramientas ,Stanford University, 1990, 803 p.