Las Gramticas tipo 0 y 1 muestran un buen nmero de propiedades indecidibles. En
las primeras, por ejemplo, puede suceder que no se pueda determinar algortmicamente si una cadena dada es producto de ella o no; es decir, no se podra saber si una Maquina de Turing diseada para reconocer esas cadenas se detendr o no durante el transcurso de esa computacin.
La Teora de la Computabilidad facilita descubrir propiedades de los Lenguajes y sus reconocedores, y ha permitido el diseo de los Lenguajes de programacin y de sus correspondientes Autmatas encargados de reconocerlos y traducirlos a expresiones ms simples: los analizadores de los compiladores.
La Gramtica que describe la sintaxis de los Lenguajes de programacin es Libre de Contexto. As mismo, el analizador lexicogrfico de un compilador es un Autmata Finito, porque la Gramtica que se emplea en la definicin lxica de un Lenguaje como C, C#, Java, o Fortran es Regular. Se puede disear una Gramtica de ese tipo que mostrara como se pueden obtener los nombres de los componentes lxicos para alguno de esos Lenguajes, con excepcin de las palabras reservadas.
TOKEN O COMPONENTE LEXICO: Cualquiera de los smbolos terminales que se manejan en la construccin de sentencias de un programa en un Lenguaje de alto nivel. Se define como un par ordenado:
Token = (Tipo, Valor ).
CASO DE ESTUDIO
Anlisis de la lnea de cdigo que forma parte de un programa, expresada como tiempo =minutos +segundos / 60,
ANALIZADOR LEXICO Funcin: Comprobar la correcta construccin de cada uno de los tokens. A ciertos componentes lxicos, como los identificadores, se les introduce en la tabla de smbolos. Errores tpicos: Identificadores mal estructurados: 4AC, aga@quantum, yo.tu, posicin, etc. Constantes mal estructuradas: +-4.6789, 6900-, 90+25, etc. Operadores mal estructurados: := , =>, <>, etc. // todos ellos en C Palabras reservadas mal estructuradas: PRINTF, print, suitch, etc.
ANALIZADOR SINTACTICO Funcin: Comprobar el correcto acomodo de los tokens dentro del cdigo. En esta etapa se genera el rbol sintctico de la expresin. Errores tpicos: Parntesis mal anidados: ( ( ) ( ( ) , ( ) ) ( ( ) ), ( ) ( ( ) ) ) ( ( ), etc. Expresiones incorrectas, tales como: a + b = c, a + b * - c , etc.
ANALIZADOR SEMANTICO Funcin: Evala el programa fuente para tratar de encontrar errores en los tipos de datos que se emplean y rene informacin sobre los mismos. Si fuera necesario, hace un ajuste, siempre que no afecte al algoritmo en sus resultados. Errores tpicos: Los indicados con el mensaje Type mismatch. Cuando se usa una variable real como argumento de un for, o como subndice de una matriz. Si se suman matrices bidimensionales con vectores que son unidimensionales. Si en la instruccin alternativa mltiple (como switch) un mismo valor de la constante corresponde a dos rangos diferentes.
GENERADOR DE CODIGO INTERMEDIO Funcin: Algunos compiladores producen una representacin intermedia explicita del programa fuente que se puede considerar como un programa para una maquina abstracta. Se propone como Lenguaje el llamado cdigo de tres direcciones, en el que cada instruccin tiene como mximo tres operandos (considerando inclusive la asignacin). temp1 := enteroareal(60) temp2 := id3 / temp1 temp3 := id2 + temp2 id1 := temp3
OPTIMIZADOR DE CODIGO Funcin: Sirve para mejorar el cdigo intermedio, para obtener un cdigo de maquina ms rpido de ejecutar. Por la variacin en la magnitud de la optimizacin en distintos compiladores, algunas optimizaciones resultan triviales. En el siguiente ejemplo se compara como se tienen dos lneas de cdigo, antes y despus de la optimizacin. En el segundo se ahorra una operacin de multiplicacin:
GENERADOR DE CODIGO Funcin: Produce el cdigo objeto, que consiste en cdigo relocalizable o ensamblador. Las posiciones de memoria se seleccionan para cada una de las variables usadas por el programa; despus, cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de mquina que ejecuta la misma tarea.