Essays.club - Ensayos gratis, notas de cursos, notas de libros, tareas, monografías y trabajos de investigación
Buscar

Analisis semantico. ARBOLES DE EXPRESIONES

Enviado por   •  18 de Enero de 2018  •  4.164 Palabras (17 Páginas)  •  1.056 Visitas

Página 1 de 17

...

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

Manejo de errores sintácticos

[pic 5]

Los errores sintácticos son dados por una expresión aritmética o paréntesis no equilibrados.

El manejo de errores de sintaxis es el más complicado desde el punto de vista de la creación de compiladores. Nos interesa que cuando el compilador encuentre un error, se recupere y siga buscando errores. Por lo tanto el manejador de errores de un analizador sintáctico tiene como objetivos:

∙ Indicar los errores de forma clara y precisa. Aclarar el tipo de error y su localización.

∙ Recuperarse del error, para poder seguir examinando la entrada.

∙ No ralentizar significativamente la compilación

Tipo de gramática que acepta un analizador sintáctico

Nosotros nos centraremos en el análisis sintáctico para lenguajes basados en gramáticas formales, ya que de otra forma se hace muy difícil la comprensión del compilador, y se pueden corregir, quizás más fácilmente, errores de muy difícil localización, como es la ambigüedad en el reconocimiento de ciertas sentencias.

La gramática que acepta el analizador sintáctico es una gramática de contexto libre:

Gramática: G (N, T, P, S)

N = No terminales.

T = Terminales.

P = Reglas de Producción.

S = Axioma Inicial.

1.3 COMPROBACIONES DE TIPOS EN EXPRESIONES

La labor de comprobación de tipos consiste en conferir a las construcciones sintácticas del lenguaje la semántica de tipificación y en realizar todo tipo de comprobaciones de dicha índole. Por su naturaleza, sin embargo, ésta se encuentra repartida entre la fase de análisis semántico y la generación de código intermedio.

Se dice que la comprobación realizada por un compilador es estática, mientras que la comprobación hecha al ejecutar el programa objeto se denomina dinámica. En principio, cualquier verificación se puede realizar dinámicamente, si el código objeto carga el tipo de un elemento con el valor de dicho elemento.

Un sistema de tipos seguro elimina la necesidad de comprobar dinámicamente errores de tipos ya que permite determinar estáticamente que dichos errores no pueden ocurrir cuando se está ejecutando el programa objeto. Se dice que un lenguaje es fuertemente tipificado si su compilador puede garantizar que los programas que acepte se ejecutarán sin errores de tipo.

∙ Comprobaciones estáticas

Las comprobaciones estáticas recogen el compendio de todas aquellas tareas de carácter semántico que, por su naturaleza, pueden ser realizadas directamente durante la fase de compilación mediante el uso de los artefactos y mecanismos propios de dicha fase. Este tipo de comprobaciones son beneficiosas puesto que confieren seguridad a la ejecución del programa.

Características:

-Diferente de la dinámica en runtime.

-Ejemplo: comprobación de tipos, flujo de control, unicidad.

∙ Comprobaciones dinámicas Las comprobaciones dinámicas son aquellas que no se realizan durante la fase de compilación y se delegan al momento de la ejecución del programa. Ello requiere generar código ejecutable específicamente diseñado para realizar tales comprobaciones. Los lenguajes con una carga excesiva de comprobaciones dinámicas generan programas más largos, lentos e inseguros en ejecución.

Verificación de tipos

Comprueba la compatibilidad de tipos de todas las expresiones del código fuente recuperando la información durante la gestión de declaraciones. Además se asegura de que no existe en el programa ninguna referencia a ningún símbolo no declarado.

Hay situaciones en las cuales se tiene un valor de un tipo dado y se desea almacenar ese valor en una variable de un tipo diferente.

En algunos tipos es posible almacenar simplemente el valor sin una conversión de tipos; lo que se denomina conversión automática.

A la conversión de tipos se le llama coerción o casting.

Inferencia de tipos

En lenguajes sin tipificación de variables o con sobrecarga se aplican tareas de inferencia de tipos en el nivel gramatical de las expresiones para resolver el tipo de datos de la expresión resultante en función del contexto de evaluación.

Esto sólo es posible en algún lenguaje de programación, si el compilador reconoce que la variable destino tiene la suficiente precisión para contener el valor origen. En Java se puede almacenar un valor byte en una variable int, dado que este tipo de datos es de mayor precisión que el primero.

A esto se le llama ensanchamiento o promoción, dado que el tipo más pequeño se ensancha o promociona al tipo compatible más grande. Si por el contrario, se desea asignar un valor de variable int a una variable byte se necesita realizar una conversión de tipos explícita.

En algunos casos se puede realizar la conversión pero se pueden perder datos, como por ejemplo al pasar un valor flotante a un entero.

A esto se le llama estrechamiento, dado que se

...

Descargar como  txt (27.8 Kb)   pdf (78.1 Kb)   docx (26.2 Kb)  
Leer 16 páginas más »
Disponible sólo en Essays.club