Академический Документы
Профессиональный Документы
Культура Документы
Autor
Junior German
Hernandez García
Matricula
14-EISN-6-014
Asignatura
Compiladores e interpretes
Maestro
Benito Vinicio Rubio
Tema II. Un compilador sencillo de una pasada
Definición de la sintaxis
La sintaxis es la parte que estudia las reglas y principios que gobiernan la combinatoria
de constituyentes sintácticos y la formación de unidades superiores a estos. La sintaxis
estudia las formas en que se combinan las palabras, así como las
Traducción dirigida por la sintaxis
Una definición dirigida por sintaxis es un formalismo para especificar las traducciones
para las construcciones en función de atributos asociados con sus componentes
sintácticos. Utiliza una gramática independiente de contexto para especificar la estructura
sintáctica de la entrada, la idea es asociar con cada símbolo de la gramática un conjunto
de atributos (que luego veremos que pueden ser sintetizados o heredados) y además a
cada producción un conjunto de reglas semánticas para calcular los valores de los
atributos asociados con los símbolos que aparecen en esa producción. La definición
dirigida por sintaxis consiste en sí entonces de la gramática y el conjunto de reglas
semánticas. En una definición dirigida por sintaxis, para cada producción gramatical
AÆα se asocia un conjunto de reglas semánticas de la forma b:=f(c1,c2,…,ck) donde f es
una función y b es un atributo sintetizado de A o un atributo heredado de uno de los
símbolos gramaticales de la parte derecha de la producción y c1,c2,…,ck son atributos que
pertenecen a los símbolos gramaticales de la producción. Se dice que b depende de
c1,c2,…,ck.
Análisis sintáctico
Es la fase del analizador que se encarga de chequear el texto de entrada en base a una
gramática dada. Y en caso de que el programa de entrada sea válido, suministra el árbol
sintáctico que lo reconoce. En teoría, se supone que la salida del analizador sintáctico es
alguna representación del árbol sintáctico que reconoce la secuencia de tokens
suministrada por el analizador léxico.
En la práctica, el analizador sintáctico también hace:
• Acceder a la tabla de símbolos (para hacer parte del trabajo del analizador semántico).
• Chequeo de tipos ( del analizador semántico).
• Generar código intermedio.
• Generar errores cuando se producen.
En definitiva, realiza casi todas las operaciones de la compilación. Este método de trabajo
da lugar a los métodos de compilación dirigidos por sintaxis.
Traductores de expresiones simples
Sintaxis abstracta y concreta: un punto de partida útil para considerar la traducción de
una cadena de entrada es un árbol de sintaxis abstracta, donde cada nodo representa un
operador, y los hijos de ese nodo, los operando. Por contraste, un árbol de análisis
sintáctico se denomina árbol de sintaxis concreta, y la gramática subyacente, sintaxis
concreta del lenguaje. Los arboles de sintaxis abstracta, o simplemente arboles sintácticos
difieren de los árboles de análisis sintáctico en que las distinciones superficiales de forma,
sin importancia en la traducción, no aparecen en los arboles sintácticos.
Análisis léxico
Eliminación de e espacios en blanco y comentarios: el traductor de expresiones reconoce
todos los caracteres de la entrada, de modo que los caracteres extraños, como los espacios
en blanco, harán que falle. Muchos lenguajes permiten que aparezcan “espacios en
blanco” (caracteres en blanco, caracteres TAB y de nueva línea) entre los componentes
léxicos. Los comentarios también pueden no ser considerados por el analizador sintáctico
y el traductor, por tanto, también se pueden tratar como espacios en blanco.
Si el analizador léxico elimina los espacios en blanco, el analizador sintáctico nunca
tendrá que considerarlos.
Constantes: en cualquier momento que aparece un dígito solo en una expresión, parece
razonable poner una constante entera arbitraria en su lugar. Como una constante entera
es una secuencia de dígitos, pueden admitirse constantes enteras añadiendo
producciones a la gramática de las expresiones o creando un componente léxico para tales
constantes.
Reconocimiento de palabras claves e identificadores: los lenguajes utilizan
identificadores como nombres de variables, matrices, funciones y similares. A menudo,
una gramática para un lenguaje trata a un identificador como un componente léxico.
Un analizador léxico: cuando entre el analizador sintáctico y la cadena de entrada se
inserta un analizador léxico, este interactúa con los dos. Lee los caracteres de la entrada,
los agrupa en lexemas y pasa los componentes léxicos formados por los lexemas, junto
con los valores de sus atributos, a las etapas posteriores del compilador.
Incorporación de una tabla de símbolos
En informática, una tabla de símbolos es una estructura de datos que usa el proceso de
traducción de un lenguaje de programación, por un compilador o un intérprete, donde
cada símbolo en el código fuente de un programa está asociado con información tal como
la ubicación, el tipo de datos y el ámbito de cada variable, constante o procedimiento.
Una implementación común de una tabla de símbolos puede ser una tabla hash, la cual
será mantenida a lo largo de todas las fases del proceso de compilación de ticses.
Puede tratarse como una estructura transitoria o volátil, que sea utilizada únicamente en
el proceso de traducción de un lenguaje de programación, para luego ser descartada, o
integrada en la salida del proceso de compilación para una explotación posterior, como
puede ser por ejemplo, durante una sesión de depuración, o como recurso para obtener
un informe de diagnóstico durante o después la ejecución de un programa.
Los símbolos en la tabla de símbolos pueden referirse a constantes, a funciones o a tipos
de datos en el código fuente de un programa.
La tabla de símbolos forma parte de cada fichero que contiene el código objeto durante el
enlazado o linking de los diferentes ficheros; recae en la responsabilidad del linker o
enlazador resolver cualquier referencia no resuelta.
En general en la Tabla de símbolos (TS a partir de ahora) se realizan dos operaciones: la
inserción y la búsqueda.
En C la operación de inserción se realiza cuando se procesa una declaración.
Hay dos posibilidades: que la TS esté ordenada (o sea, nombres de variables por orden
alfabético) o que no esté ordenada.
En la búsqueda, se detectan los identificadores que no hayan sido declarados
previamente, emitiendo un mensaje de error.
ejemplo en lenguaje C: Undefined símbolo 'x', si es una variable que desea usarse
pero no se declaró.
En la inserción, se detectan identififcadores que ya han sido declarados previamente,
emitiendo un mensaje de error
ejemplo en C: multiple declaration for 'x' si x ya estaba en TS.
Máquinas de pilas abstractas
Una máquina de pila es un modelo computacional en el cual la memoria de la
computadora toma la forma de una o más pilas. El término también se refiere a un
computador real implementando o simulando una máquina de pila idealizada.
Adicionalmente, una máquina de pila también puede referirse a una máquina verdadera
o simulada con un conjunto de instrucciones de "0 operandos". En tal máquina, la
mayoría de las instrucciones implícitamente operan en valores en el tope de la pila y
reemplazan esos valores por el resultado. Típicamente tales máquinas también tienen una
instrucción "load" y una instrucción "store" que leen y escriben a posiciones arbitrarias
de la RAM. La ventaja de las máquinas de pila ("conjunto de instrucciones de 0
operandos") sobre las máquinas de acumulador ("conjunto de instrucciones de 1
operando") y las máquinas de registro ("conjunto de instrucciones de 2 operandos" o un
"conjunto de instrucciones de 3 operandos") es que los programas escritos para un
conjunto de instrucciones de "0 operandos" generalmente tienen una densidad de código
más alta que los programas equivalentes escritos para otros conjuntos de instrucciones.
Tema III. Analisis léxico
Función del analizador léxico
La función del analizador léxico es leer los caracteres de entrada y elaborar como salida
una secuencia de componentes léxicos que utiliza el analizador sintáctico para hacer el
análisis.
Autómata finito
Un autómata finito (AF) o máquina de estado finito es un modelo computacional que
realiza cómputos en forma automática sobre una entrada para producir una salida.
Este modelo está conformado por un alfabeto, un conjunto de estados finito, una función
de transición, un estado inicial y un conjunto de estados finales. Su funcionamiento se
basa en una función de transición, que recibe a partir de un estado inicial una cadena de
caracteres pertenecientes al alfabeto (la entrada), y que va leyendo dicha cadena a medida
que el autómata se desplaza de un estado a otro, para finalmente detenerse en un estado
final o de aceptación, que representa la salida.
La finalidad de los autómatas finitos es la de reconocer lenguajes regulares, que
corresponden a los lenguajes formales más simples según la Jerarquía de Chomsky.