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:
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.