UNIDAD I.- ANALISIS SEMANTICO 1.1.- Arboles de expresiones. 1.2.- Acciones semnticas de un analizador sintctico. 1.3.- Comprobaciones de tipos en expresiones . 1.4.- Pila semntica en un analizador sintctico. 1.5.- Esquema de traduccin. 1.6.- Generacin de la tabla de smbolo y de direcciones. 1.7.- Manejo de errores semnticos.
Introduccin
El lenguaje es un vehculo por el cual se transmiten instrucciones a un procesador para que las ejecute y produzca ciertos resultados. Es tarea del compilador extraer el contenido semntico incluido en las sentencias del programa. Ciertos aspectos relativos a la correccin de un programa no se pueden expresar claramente mediante el lenguaje de programacin. Es necesario dotar al compilador de rutinas auxiliares para captar todo lo que no se ha expresado mediante la sintaxis del lenguaje.
INTRODUCCIN
Introduccin
Semntica: conjunto de reglas que espe significado de cualquier sentencia sintcticamente correcta y escrita en un determinado lenguaje. El anlisis semntico, a diferencia de otras no se realiza claramente diferenciado del resto de las tareas del compilador.
Fase en la que se obtiene informacin necesaria para la compilacin, tras conocer la estructura sintctica del programa. Completa las fases de anlisis lxico y sintctico incorporando comprobaciones que no pueden asimilarse al mero reconocimiento de una cadena dentro de un lenguaje
Anlisis Sintctico
Detecta entradas con rboles mal formados.
Anlisis Semntico
Detecta todos los errores restantes
19/09/2013
10
El analizador sintctico no puede detectar todos los errores. Algunos constructores del lenguaje no son libres de contexto
Ejemplo: declaracin de identificadores y su uso. No puedes utilizar una GLC para describir que alguna palabra particulares aparezca dos veces en una cadena separada por un texto en medio. Una versin abstracta del problema es: {wcw | w (a | b)* }
declaracin uso
Se asocia informacin a las construcciones del lenguaje de programacin proporcionando atributos a los smbolos de la gramtica. Ejemplo: el valor de una expresin, el tipo de una variable, su mbito, un trozo de cdigo, el nmero de argumentos de una funcin, etc. Los valores de los atributos se calculan mediante reglas semnticas asociadas a las producciones gramaticales.
11
La construccin de la Tabla de Smbolos para llevar un seguimiento del significado de los identificadores en el programa:
variables, funciones, tipos, parmetros y mtodos de paso de parmetros en funciones, Etc.
12
19/09/2013
1.1.-ARBOL DE EXPRESIONES
14
13
Las expresiones regulares que se pueden representar a travs de los smbolos contenidos en un alfabeto, tambin se pueden representar a travs de rboles, que se denominan rboles de expresiones. La informacin contenida en los rboles de expresio-nes tienen las siguientes caractersticas. Se almacena en forma de estructura jerrquica, porque los componentes estn en diferentes niveles.
La informacin se almacena en forma Dinmica porque su forma, tamao y contenido pueden variar durante la ejecucin. Los datos son almacenados de forma Organizada porque importa la forma en que est dispuesto el contenido. La consulta de los datos se hace de manera rpida y eficiente obteniendo mejores resultados.
15
Propiedades de los rboles Los rboles de expresiones estn compuestos por los siguientes elementos: Token.- es una Unidad mnima de informacin entendible por un compilador. Puede ser un ope-rando o un operador. Operandos.- Los operandos pueden ser las hojas de los nodos. Raz.- La raz de un rbol puede ser cuaquier operador aritmtico.
16
Reglas para un rbol La reglas para representar una expresin mediante un rbol son las siguientes:
17
rboles de expresin
Representan un orden de ejecucin
18
+
1.- Cada hoja est etiquetada con un operando y solo consta de ese operando. 2.- Cada nodo interior n est etiquetado con un solo operador. 3.- Las hojas estn representadas por los operandos y los nodos por la raz de cada rbol.
(A* B) + C * D + E
A
*
B C
*
D
19/09/2013
Otro ejemplo de rbol sintctico para una expresin Aritmtica: (7 + 12) * (-9) -171
19
20
*
+ -
12
21
Ejemplo: x=(x+y)*(a-b)
22
23
24
19/09/2013
25
26
27
28
29
30
19/09/2013
31
32
http://www.esdebian.org/wiki/interpretprete-funciones-mediante-arbol-binario-expresiones
33
34
35
36
19/09/2013
37
38
40
39
Sentencias de Declaracin: Se utilizan para completar la seccin de tipos de la Tabla de Smbolos. Sentencias ejecutables: Se utilizan para realizar comprobaciones de tipos entre los operandos implicados.
Algunas de estas comprobaciones son: comprobacin de tipos en sentencias de asignacin comprobacin de tipos en operaciones aritmtico-lgicas comprobacin de tipos en las sentencias condicionales comprobacin de la declaracin de las variables antes de su uso comprobacin de unicidad de identificadores comprobacin del indexado de vectores
Continuacin
41
Funciones y procedimientos: Se utilizan para comprobar el nmero, orden y tipo de los parmetros actuales en cada llamada a una funcin o procedimiento. Identificacin de variables: Se utilizan para comprobar si un identificador ha sido declarado antes de utilizarlo. Etiquetas: comprobar si hay etiquetas repetidas y validacin.
42
19/09/2013
Continuacin Constantes: comprobar que no se utilicen en la parte izquierda de una asignacin. Conversiones y equivalencias de tipo: realizan la verificacin de las constantes para que stas sean de un mismo tipo. Sobrecarga de operadores y funciones: en las funciones y los procedimientos, se utilizan para detectar y solventar la autenticidad de los datos.
43
mbitos
Consiste en empatar las declaraciones de identificadores con su uso El mbito de un identificador es la porcin del programa en la cual el identificador es accesible. El mismo identificador se puede referir a diferentes cosas en diferentes partes del programa. mbitos diferentes para el mismo nombre no se sobreponen. Un identificador puede tener mbitos restringidos. Es decir solo es visible en reas particulares del programa
44
45
46
mbito en lenguajes OO
No todas las clases de identificadores siguen la regla del anidamiento ms cercano Por ejemplo las definiciones de clases
Todas son visibles globalmente
47
Ms sobre mbito
Los nombres de mtodos y atributos tienen reglas complejas. Los nombres de campos son globales dentro de cualquier clase. Pero los mtodos y campos no necesitan estar definidos en la clase en la cual se estn utilizando, pero si en una clase padre (herencia) Los mtodos se pueden redefinir (sobreescritura)
48
19/09/2013
49
50
En cualquier porcin del rbol (contexto en el programa), necesitamos saber que identificadores estn definidos.
1.3.-Comprobacin de tipos en Expresiones La comprobacin de tipos es una forma de asegurar que los identificadores relacionados sean de tipos compatibles. Dos identificadores son compatibles de acuerdo a lo siguiente:
Cuando forman el lado izquierdo y el lado derecho de un operador. Cuando forman el lado izquierdo y el lado derecho de una proposicin de asignacin. Cuando sean parmetros reales y formales.
51
Las comprobaciones de consistencia que se efectan antes de la ejecucin del programa fuente, se denominan comprobaciones estticas. Las comprobaciones que se realizan durante la ejecucin del programa objeto se denominan comprobaciones dinmicas. La revisin de la sintaxis de un programa fuente es un ejemplo de comprobacin esttica, mientras que la comprobacin de tipos, es un ejemplo de comprobacin que con frecuencia puede efectuarse en forma esttica y que en ocasiones debe realizarse dinmicamente.
52
Tipos
Qu es un tipo?
La nocin vara de lenguaje a lenguaje.
53
Tipos y operaciones
Ciertas Operaciones son legales para cada tipo
No tiene sentido sumar un apuntador a funcin y un entero en C Tiene sentido sumar dos enteros Pero ambos tienen la misma implementacin en lenguaje ensamblador!
54
Consenso
Un conjunto de valores Un conjunto de operadores sobre los valores
19/09/2013
Sistema de tipos
Un sistema de tipos de un lenguaje especifica las operaciones que son vlidas para cada tipo. La meta de la verificacin de tipos es asegurar que las operaciones se utilizan con los tipos correctos.
Hace cumplir la interpretacin de los valores. Algunas veces puede realizar conversiones automticas cuando el lenguaje permite modos mezclados y promocin de tipos.
55
56
El sistema de tipos provee una formalizacin concisa de las reglas de verificacin semntica.
Verificacin de tipos 57
Existen aspectos a considerar en la verificacin de tipos de un compilador Procesar las declaraciones y mantener una tabla de smbolos. Almacenar el tipo de cada identificador en la tabla de smbolos. Realizar la verificacin de tipos y hacer cumplir las reglas semnticas en expresiones y otros elementos del lenguaje (e.g. Lista de argumentos, etc.) Buscar el tipo de los identificadores usados. Inferir los tipos de constantes Calcular el tipo de los nodos que denotan expresiones.
58
Esto requiere que la traslacin se realice durante un recorrido del rbol en profundidad.
La forma en que el analizador sintctico se mueve a travs del rbol
59
Ejemplo de verificacin de tipos (un ejemplo similar esta en la Sec. 6.4.4 de Kenneth)
60
Assert (Visual Studio 2012 ) Prueba una asercin de software en tiempo de compilacin. Si la expresin constante especificada es false, el compilador muestra el mensaje especificado y la compilacin emite un error; si no, la declaracin no tiene ningn efecto.
10
19/09/2013
61
62
Expresiones de Tipos El tipo de una construccin de un lenguaje se denotar mediante una Expresin de tipo. Una expresin de tipo es, o bien un tipo bsico o se forma aplicando un operador llamado constructor de tipos a otras expresiones de tipos. Los conjuntos de tipos y construcciones dependen del lenguaje que deba comprobarse. bsicas
63
Se utilizar la siguiente definicin de expresiones de tipos: 1. Un tipo bsico es una expresin de tipo. Entre los tipos bsicos se encuentran bolean, char, integer y real. Un tipo bsico especial, la funcin error_tipo(), sealar un error durante la com-probacin de tipos. 2- Como se puede dar nombre a las expresiones de tipos, el nombre de un tipo es una expresin de tipo.
64
3.-Un constructor de tipos aplicado a expresiones de tipos es una expresin de tipo. Los constructores incluyen:
Matrices, Productos, Registros, apuntadores y funciones).
65
b) Productos. Si T1 y T2 son expresiones de tipo, entonces su producto cartesiano T1 x T2 es una expresin de tipo. Se supone que x es asociativa por la izquierda. c) Registros. La diferencia entre un registro y un producto es que los campos de un registro tienen nombres. El constructor de tipos record se aplicar a un conjunto ordenado formado con nombres de campos y tipos de campos. Por ejemplo, el fragmento de programa en Pascal: Type fila = record Direccin: integer; Lexema: array [1..15] of char end; var tabla: array [1..10] of fila;
66
a) Matrices. Si T es una expresin de tipo, entonces array (I, T) es una expresin de tipo que indica el tipo de una matriz con elementos de tipo T y conjunto de ndices I, I con frecuencia es un rango de enteros. Por ejemplo, la declaracin en Pascal Var A: array[1..10] of integer; Asocia la expresin de tipo array(1..10, integer) con A.
11
19/09/2013
Declara que el nombre de tipo fila representa la expresin de tipo. Record (direccin x integer ) x (lexema x array (1..15, char)) Y que la variable tabla es una matriz de registro de este tipo. d) Apuntadores.- Si T es una funcin de tipo, entonces pointer (T) es una expresin de tipo que indica el tipo apuntador a un objeto de T. Por ejemplo, en Pascal, la declaracin Var pila: fila Declara que la variable pila tiene tipo pointer (fila)
67
e) Funciones.- matemticamente una funcin transforma los elementos de un conjunto, el dominio, a elementos de otro conjunto, el rango. Se pueden considerar las funciones dentro de los lenguajes de programacin como transformaciones de un dominio de tipo D a un rango tipo R. La expresin tipo D R indica el tipo de dicha funcin. Por ejemplo, la funcin predefinida mod de Pascal tiene un dominio de tipo int x int, es decir, un par de enteros, y rango de tipo int. De esta forma, se dice que mod tiene el tipo1. int x int int
68
Con frecuencia existen, por razones de implantacin, limitaciones que en cuanto al tipo que una funcin puede devolver; por ejemplo, matrices o funciones. Sin embargo existen lenguajes que permiten que las funciones devuelvan objetos de tipos arbitrarios, as que se puede definir una funcin g de tipo (integer integer); (integer integer)
69
4.- Las expresiones de tipo pueden contener variables cuyos valores son expresiones de tipos. Una manera conveniente de representar expresiones de tipo es utilizando un grafo. Con el enfoque de la traduccin dirigida por la sintaxis se puede construir un rbol o un GDA para una expresin de tipo, con nodos interiores para los constructores de tipos y hojas para los tipos bsicos, nombres de tipos, y variables de tipos.
70
Es decir, g toma como argumento una funcin que transforma un entero en un entero y g produce como resultado otra funcin del mismo tipo.
Por ejemplo, consideremos la siguiente declaracin: Str : array [0..80] of char; I : integer; Estticamente puede que no se cumpla la condicin: 0 <= i <= 80 al utilizar str [i]; es decir, esta comprobacin debe efectuarse en forma dinmica. Sin embargo, es posible, por ejemplo, comprobar estticamente si la asignacin: str [i] := ch; est permitida, o sea, si ambos lados de la proposicin de asignacin son de tipos compatibles. Para ello es necesario consultar la tabla de smbolos.
71
A continuacin se presenta un breve ejemplo de cmo introducir las reglas que permiten la comprobacin de tipos de expresiones aritmticas. TipoE, TipoT y TipoF, representan el tipo de una expresin, trminos, etc.; se emplean subndices para distinguir entre varias ocurrencias de un mismo smbolo no Terminal. Se usar el siguiente subconjunto de la gramtica G0 con las reglas correspondientes:
72
12
19/09/2013
E E1
T E2 + T
(* TipoE := TipoT; *) (* TipoE1 := ifTipoE2 = integer end TipoT = integer then integer else error_tipo; *) (* TipoT := TipoF *) (* TipoT1 := ifTipoT2 = integer end TipoF = integer then integer else error_tipo; *) (* TipoF := buscar_Tipo(x); *) (* TipoF := buscar_Tipo(y); *) (* TipoF := TipoE; *)
73
El procedimiento buscar Tipo(...) se utiliza para determinar el tipo de un identificador por medio de la revisin de la tabla de smbolos. Por ejemplo, el tipo de una expresin formada donde se aplica el operador + a una subexpresin y un trmino, es entero, si el tipo de la subexpresin y el trmino es entero; en caso contrario ser un error de tipo. La formulacin de reglas para semnticas (tipo Pascal), que establecen, por ejemplo, que Entero * Real genera un resultado de tipo Real, es obvia y puede verse cmo se propagar un tipo.
74
T T1
F T2 * F
F F F
x y (E
De esta forma, durante el proceso de anlisis semntico, se puede determinar donde se requieren cambios forzados de tipo y qu operadores deben relacionarse (por ejemplo, multiplicacin entera o de punto flotante). Se debe sealar que no todos los lenguajes de programacin permiten una comprobacin esttica de tipos como la que se acaba de exponer, para ello se tiene que implementar en su diseo, para que pueda ser considerada.
75
76
13
19/09/2013
Cmo se agrega la semntica al analizador sintctico? Declaracin TIPO {tipo=obtengo(yytext());} listavar PYC listavar var {inserta(smbolo);} | var {inserta(simbolo);} var ID {simbolo=yytext; smbolo.tipo=tipo; simbolo.amb=ambito;}
Tabla de Smbolos
Exprlog PI exprlog{A=A;} PD | NOT exprlog {A=A;} | exprlog {A1=A;} OPLOG exprlog { A2=A if(A1==INT && A2==INT) A=INT; else A=ERROR_TIPO; }
Tabla de Smbolos 83
Una tabla de smbolos es una estructura de datos empleada para registrar las declaraciones de identificadores. Los identificadores se almacenan cuando se declaran
Con atributos
Nombres de clases, mtodos, variables, etc
Operaciones
add_symbol(x) inserta x y la informacin asociada, tal como el tipo, en la pila. find_symbol(x) busca en la pila, comenzando del tope de la pila.Regresa el primer x encontrado o NULL si no se encontro. remove_symbol() saca elemento de la pila
Y sub-atributos
public, private, integer, float, static, array, etc Su localizacin en la pila si es variable local
14
19/09/2013
85
Los nombres de clases se pueden usar antes de que sean definidos. Usualmente no se puede verificar esto para los nombres de clases.
Usando una tabla de smbolos (compilacin separada?) O en una pasada (a menos que se requieran prototipos)
86
Definicin de clase
Solucin usual
Fase 1: Junta todos los nombres de clases (+ otras cosas) Fase 2: Realiza la verificacin
87
88
Anlisis semntico esttico: se realiza en tiempo de compilation, no de execution. 1. Cmo vamos a especificar (describir) la estructura semntica de un lenguaje?
Mediante gramticas de atributos.
89
1.5.- Esquemas de Traduccin Los programas de aplicacin, los videojuegos y otras herramientas que se ejecutan en las computadoras, generalmente se realizan en lenguajes de alto nivel. Estos programas escritos en lenguajes de alto nivel necesitan ser traducidos a un lenguaje que sea entendible por la computadora, este lenguaje es el lenguaje de bajo nivel.
90
15
19/09/2013
91
Sistemas de Tipos. El diseo de un comprobador de tipos para un lenguaje se basa en informacin acerca de las construcciones sintcticas del lenguaje, la nocin de tipos y las reglas para asignar tipos a las construcciones de lenguajes. Los siguientes extractos de Pascal y del manual de referencia de C, respectivamente, son ejemplos de la informacin con la que el diseador de un compilador podra verse obligado a comenzar.
92
Si ambos operandos de los operadores aritmticos de suma, sustraccin y multiplicacin son de tipo entero, entonces el resultado es de tipo entero. El resultado del operando unario & es un apuntador hacia el objeto al que se refiere el operando. Si el tipo del operando es Un Arreglo, o el tipo del resultado es apuntador a . En los anteriores extractos se encuentra implcita la idea de que cada expresin tiene asociado un tipo.
93
En los lenguajes Pascal y C, los tipos de datos son bsicos o construidos. Los tipos bsicos son los tipos atmicos sin estructura interna por lo que concierne al programador. En Pascal, los tipos bsicos son bolean, carcter, integer y real. Los tipos de subrango, como 1..10, y los tipos enumerados, como: (Violeta, azul, verde, amarillo, naranja, rojo) Se pueden considerar como tipos bsicos.
94
El lenguaje Pascal admite que un programador construya tipos a partir de tipos bsicos y otros tipos construidos, como por ejemplo, las matrices o arreglos (array), los registros (record) y los conjuntos (set). Adems, los apuntadores y las funciones tambin pueden considerarse como tipos construidos. Estos son algunos ejemplos de tipos de datos construidos que se pueden realizar con los lenguajes de alto nivel.
95
Todos los programas escritos en lenguajes de alto nivel deben ser traducidos a lenguaje de mquina mediante un traductor. La funcin de un traductor de un lenguaje de programacin, es traducir programas escritos en un lenguaje de alto nivel a programas equivalentes, expresados en lenguaje mquina. Despus del proceso de traduccin, los programas pueden ejecutarse en cualquier computadora a travs de un intrprete microprogramado
96
16
19/09/2013
La siguiente figura muestra el funcionamiento de un traductor mediante un compilador de cuatro pasos con las dems actividades que intervienen durante la compilacin de un programa hasta llegar a convertir el programa escrito en lenguaje de alto nivel a un programa escrito en lenguaje ensamblador o lenguaje binario, para que posteriormente se convierta en programa objeto:
97
98
99
Compilados.- Los lenguajes por lo general como el C, Pascal, java, son lenguajes que se compilan. Esto significa que los programas en estos lenguajes se traducen ordinariamente al lenguaje mquina de la computadora real que s esta usando antes que inicie la ejecucin, y la simulacin est confinada a un con-junto de rutinas de apoyo en tiempos de ejecucin que simulan operaciones primitivas en el lenguaje fuente para las cuales no existe un anlogo cercano en el lenguaje mquina.
100
Interpretados.- Este tipo de traduccin lee y ejecu-ta instruccin por instruccin. LIPS, Prolog, Basic y Smalltalk, se suelen implementar a travs del uso de un interprete . En esta clase de lenguajes, el traductor no procede cdigo de mquina para la computadora que s esta utilizando. En su lugar, el traductor produce alguna forma inter-media del programa cuya ejecucin es ms fcil que la forma del programa original, pero que es distinta del cdigo mquina.
Existe otro tipo de traduccin que se realiza directa-mente por el procesador, esta traduccin se describe a continuacin: Ensamblador.-Es un traductor cuyo lenguaje objeto es tambin alguna variedad de lenguaje mquina para una computadora real pero cuyo lenguaje fuente, un lenguaje ensamblador constituye en gran medida una representacin simblica del cdigo de mquina objeto. Casi todas las instrucciones en el lenguaje fuente se traducen una por una a cada instruccin del lenguaje objeto.
101
Cargador.- es un traductor cuyo lenguaje objeto es un cdigo de mquina real y cuyo lenguaje fuente es casi idntico; y est compuesto por lo general de programas en lenguaje mquina en forma reubicable junto con tablas de datos que especifican puntos donde el cdigo reubicable se debe codificar para volverlo automticamente ejecutable. Preprocesador o Macroprocesador.- es un tra-ductor cuyo lenguaje fuente es una forma ampliada de un lenguaje de alto nivel cuyo lenguaje objeto es la forma estndar del mismo lenguaje.
102
17
19/09/2013
104
103
Durante la compilacin de un programa, cada vez que se encuentra un identificador en la ta-bla de smbolos, se puede realizar lo siguiente:
La tabla puede ser consultada para ver si es necesario dar de alta el nuevo identificador. En la tabla se puede completar los atributos faltantes de un identificador ya existente. Se pueden recuperar los atributo de un iden-tificador ya existente en la tabla de smbolos.
105
Los dos mecanismos para tablas de smbolos presentadas a continuacin son listas lineales y tablas de dispersin. Cada uno de estos mecanismos se evala basn-dose en el tiempo necesario para aadir n entra-das y realizar e consultas. Una lista lineal es lo ms fcil de implantar, pero su rendimiento es pobre cuando e y n se vuelven ms grandes. Las tablas de dispersin proporcionan un mayor rendimiento con esfuerzo algo mayor de programacin y gasto de espacio. Ambos mecanismos pueden adaptarse rpida-mente funcionar las reglas del anidamiento ms cercano. para
106
Un mecanismo de tabla de smbolos debe permitir aadir nuevas entradas y encontrar las entradas existentes de un analizador lxico eficientemente.
Un compilador debe ser capaz de aumentar dinmicamente la tabla de smbolos durante la compilacin. Si la tabla de smbolos tiene tamao fijo al escribir el compilador, entonces el tamao debe de ser lo suficientemente grande como para almacenar cualquier programa fuente. Es muy probable que dicho tamao sea demasiado grande para la mayora de los programa e inadecuado para algunos. Para mantener uniformes los registros de la tabla de smbolos, es conveniente guardar una parte de la informacin de un nombre fuera de la entrada de la tabla, almacenando en el registro slo un apuntador a esta infor-macin, para hacer referencia a l.
107
108
18
19/09/2013
Las palabras clave deben estar en la tabla de smbolos antes de que comience el anlisis lxico.
109
Si el analizador lxico reconoce las palabras clave, entonces no necesitan aparecer en la tabla de smbolos. Si el lenguaje no convierte en palabras reservadas las palabras clave, entonces es indispensable que las palabras clave se introduzcan en la tabla de smbolos advirtiendo su posible uso como palabras clave. La entrada misma de la tabla de smbolos puede establecerse cuando se aclara el papel de un nombre, y se llenan los valores de los atributos cuando se dispone de la informacin. En algunos casos, el analizador lxico puede iniciar la entrada en cuanto aparezca un nombre en los datos de entrada.
110
Fig. Una tabla de smbolos separada en dos partes, utilizando una parte como apuntador a dicha tabla para hacer referencia a los nombres almacenados en ella.
Un nombre puede indicar varios objetos distintos, quizs incluso en el mismo bloque o procedimiento. Por ejemplo, las declaraciones en C. int x; struct x { float y, z; } ; Utilizan x como entero y como etiqueta de una estructura con dos campos. En ambos casos, el analizador lxico slo puede devolver al analizador sintctico el nombre solo (o un apuntador al lexema que forma dicho nombre), en lugar de un apuntador a la entrada en la tabla de smbolos.
Se crea el registro en la tabla de smbolos cuando se descubre el papel sintctico que desempea este nombre.
111
Para las declaraciones de la expresin, se crearan dos entradas en la tabla de smbolos para x; una con x como entero y otra como estructura. Los atributos de un nombre se introducen en respuesta a las declaraciones, que pueden ser implcitas. Las etiquetas son identificadores seguidos de dos puntos, as que una accin asociada con el reconocimiento de dicho identifica-dor puede ser introducir este hecho en la tabla de smbolos. La sintaxis de las declaraciones de los procedimientos especifican que algunos identificadores son parmetros formales.
112
114
Los errores que puede detectar el Analizador Sintctico son aquellos que no cumplen las reglas de una gramtica independiente del contexto. Una de las caractersticas de un lenguaje de programacin es que no puede enunciarse con las reglas independientes del contexto, ya que dependen de l; por ejemplo, la restriccin de que los identificadores deben declararse previamente antes de ser utilizados.
113
19
19/09/2013
Por tanto, los principales errores semnticos son los siguientes: a).-Identificadores no definidos; b).-Operadores y operandos incompatibles; Es mucho ms difcil introducir mtodos formales para la recuperacin de errores semnticos que para la recuperacin de errores sintcticos, ya que con frecuencia la recuperacin es ambigua.
115
No obstante, puede requerirse que, por lo menos, el error semntico sea informado al programador, que se le ignore y que, por tanto, se suprimir la generacin de cdigo. Sin embargo, la mayora de los errores semnticos pueden ser detectados mediante la revisin de la tabla de smbolos.
116
FUENTES DE INFORMACION
1. Aho, Sethi, Ullman. Compiladores Principios, tcnicas y herramientas. Ed. Addison Wesley.
117
FUENTES DE INFORMACION
118
2. Lemone Karen A. , Fundamentos de Compiladores Cmo traducir al lenguaje de computadora. Ed. Compaa Editorial Continental. 3. Kenneth C. Louden. Construccin de compiladores Principios y prctica. Ed. Thomson. 4. Martin John, Lenguajes Formales y Teora de la Computacin, ED. Mc Graw Hill. 5. Hopcroft John E., Introduccin a la Teora de Autmatas, Lenguajes y Computacin, ED. Addison Wesley 6. Guerra Crespo. Hector. Compiladores. Ed. Tecnolgica Didctica. 7. Ronald Mark. Writing Compilers and Interpreters. Ed. Wiley Computer Publishing. 8. Fischer, LeBlanc. Crafting a compiler with C. Ed. Cummings Publishing Company, Inc. 9. Salas Parrilla, Jess. Sistemas Operativos y Compiladores. Ed. McGraw Hill.
10. Beck. Software de Sistemas, Introduccin a la programacin de Sistemas. Ed. Addison-Wesley Iberoamericana. 11. Teufel, Schmidt, Teufel. Compiladores Conceptos Fundamentales. Ed. Addison-Wesley Iberoamericana. 12. C. Louden, Kenneth. Lenguajes de programacin Principios y prctica. Ed. Thomson. 13. Levine Gutirrez, Guillermo. Computacin y programacin moderna Perspectiva integral de la informtica. Ed. Pearson Educacin. 14. Abel, Peter. Lenguaje ensamblador y programacin para PC IBM y compatibles. Ed. Pearson Educacin. 15. Mak, Ronald. Writing compilers and interpreters. Wiley Computer. Ed. Publishing. 16. Pittman, Thomas, Peters, James. The art of compiler design Theory and prctice. Prentice Hall.
Dudas????
119
20