Вы находитесь на странице: 1из 18

INSTITUTO TECNOLOGICO DE TAPACHULA

INSTITUCION

ING. EN SISTEMAS COMPUTACIONALES
CARRERA


LENGUAJ ES Y AUTOMATAS II
ASIGNATURA


1 UNIDAD
UNIDAD

NOMBRES DE LOS ALUMNOS


INVESTIGACION DE LA UNIDAD 1
TITULO



7TO. SEMESTRE GRUPO: A



TAPACHULA, CHIAPAS DEL 2014

I

NDICE

TEMA PG.
Introduccin I

1. Anlisis semntico. 1
Qu es la semntica?.................................................................... 1
1.1. Arboles de expresiones 2
1.2. Acciones semnticas de un analizador sintactico. 2
Funciones principal.. 2
Acciones semnticas 3
Gramticas con atributos. 3
1.3. Comprobacin de tipos de expresiones.. 4
Aspectos generales.. 4
Especificacin de un comprobador de tipos bsico 4
1.4. Pila semntica en un analizador sintctico. 7
Analizador sintctico 7
Definiciones: Pilas y Colas 8
Anlisis Semntico:... 10
Reglas semnticas: 10
Compatibilidad de tipos: 11
1.5. Esquema de traduccin 12
1.6. Generacin de la tabla de smbolos y de direccin.. 13
1.7. Manejo de errores semnticos 13

Bibliografa III








II

INTRODUCCION
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.
Es por eso que en la investigacin realizada veremos el funcionamiento que
realiza el analizador semntico.
Semntica: Conjunto de reglas que especifican el significado de cualquier
sentencia sintcticamente correcta y escrita en un determinado lenguaje.
El anlisis semntico, a diferencia de otras fases, no se realiza claramente
diferenciado del resto de las tareas del compilador.
o Fase en la que se obtiene informacin necesaria para la compilacin
tras conocer la estructura sintctica del programa.
o Completa las fases de anlisis lxico y sintctico incorporando
comprobaciones que no pueden asimilarse al mero reconocimiento de
una cadena dentro de un lenguaje.











1

1. ANALISIS SEMANTICO
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.
QUE ES LA SEMANTICA?
Se refiere a los aspectos del significado, sentido o interpretacin del significado de
un determinado elemento, smbolo, palabra, expresin o representacin formal.
Semntica: es un conjunto de reglas que especifican el significado de cualquier
sentencia sintcticamente correcta y escrita en un determinado lenguaje.
El anlisis semntico, a diferencias de otras fases, no se realiza claramente
diferenciado del resto de las tareas del compilador.
La fase de anlisis semntico revisa el programa fuente para tratar de encontrar
errores semnticos y rene la informacin sobre los tipos para la fase posterior de
generacin de cdigo. En ella se utiliza la estructura jerrquica determinada por la
fase de anlisis sintctico para identificar los operadores y operandos de
expresiones y proposiciones.
Un componente importante del anlisis semntico es la Verificacin de Tipos.
Aqu, el compilador verifica si cada operador tiene operandos permitidos por la
especificacin del lenguaje fuente.







2

1.1. ARBOLES DE EXPRESIONES
Arboles de expresiones o rbol semntico es una estructura semntica en la cual
se registran las operaciones que implica u operan dentro del programa fuente.
En cada una de las ramas del rbol semntico se registra el valor o significado que
se debe tener, y el anlisis se encarga de terminar cul de los valores registrados
en las ramas es aplicable.
Ejemplo: suponiendo que tenemos esta lnea de cdigo en lenguaje java:
Res= valor1 + valor2;
El anlisis semntico se va a encargar que tanto el valor1 como el valor2 tengan
datos que son compatibles en comn y que adems se les puede aplicar a dicho
operador.
1.2. ACCIONES SEMNTICAS DE UN ANALIZADOR
SINTCTICO
El anlisis semntico dota de un significado coherente a lo que hemos hecho en el
anlisis sintctico. El chequeo semntico se encarga de que los tipos que
intervienen en las expresiones sean compatibles o que los parmetros reales de
una funcin sean coherentes con los parmetros formales
Funciones principal
Identificar cada tipo de instruccin y sus componentes
Completar la Tabla de Smbolos
Realizar distintas comprobaciones y validaciones:
Comprobaciones de tipos.
Comprobaciones del flujo de control.
Comprobaciones de unicidad.
Comprobaciones de emparejamiento.
El Analizador Semntico finaliza la fase de Anlisis del compilador y comienza la
fase de Sntesis, en la cual se comienza a generar el cdigo objeto.
La especificacin de la semntica puede realizarse de dos formas:
Lenguaje natural
Especificacin formal: Semntica Operacional, semntica denotacional,
semntica Axiomtica, Gramticas con Atributos.

3


Acciones semnticas
Dependiendo del tipo de sentencias, las acciones semnticas pueden agruparse
en:
Sentencias de Declaracin: Completar la seccin de tipos de la Tabla de
Smbolos.
Sentencias ejecutables: Realizar comprobaciones de tipos entre los
operados implicados.
Funciones y procedimientos: Comprobar el nmero, orden y tipo de los
parmetros actuales en cada llamada a una funcin o procedimiento.
Identificacin de variables: Comprobar si un identificador ha sido declarado
antes de utilizarlo.
Etiquetas: Comprobar si hay etiquetas repetidas y validacin.
Constantes: Comprobar que no se utilicen en la parte izquierda de una
asignacin.
Conversiones y equivalencias de tipo: Verificacin.
Sobrecarga de operadores y funciones: Detectar y solventar.
Gramticas con atributos
Una Gramtica con Atributos es una generalizacin de las Gramticas Libres de
Contexto, denominada Definicin Dirigida por la Sintaxis:
Cada smbolo gramatical puede tener asociado un conjunto finito de
atributos, que pueden ser de los siguientes tipos:
Sintetizados: su valor se calcula en funcin de los atributos de los
nodos hijos.
Heredados: su valor se calcula en funcin de los atributos de los
nodos hermanos y/o del nodo padre.
Cada atributo tomar valores en un dominio.
Cada produccin llevar asociadas un conjunto de reglas
semnticas.
Las relaciones de dependencia entre atributos, establecidas por las
reglas semnticas, se representarn mediante el Grafo de
Dependencias.
A partir de estas gramticas se llevan a cabo las denominadas Traducciones
dirigidas por sintaxis.


4


1.3. COMPROBACIN DE TIPOS DE EXPRESIONES

Aspectos Generales

Un lenguaje con comprobacin fuerte de tipos es capaz de garantizar que los
programas se pueden ejecutar sin errores de tipo, por lo que los errores de tipo se
detectarn siempre en tiempo de compilacin.

Como mnimo, ante un error, un comprobador de tipos debe informar de la
naturaleza y posicin del error y recuperarse para continuar con la comprobacin
del resto del programa a analizar.

Veamos algunas de las operaciones a tener en cuenta en una comprobacin de
tipos:

Conversin de Tipos: A veces es necesario transformar el tipo de una
expresin para utilizar correctamente un operador o para pasar de forma
adecuada un parmetro a una funcin.

Coercin: Es una conversin de tipos que realiza de forma implcita el
propio compilador. Si es el programador el que realiza la conversin se
tratar entonces de una conversin explcita.

Sobrecarga de operadores: La sobrecarga se resuelve determinando el tipo
de cada una de las expresiones intervinientes en la sobrecarga.

Funciones polimrficas: Son aquellas que trabajan con argumentos cuyo
tipo puede cambiar en distintas llamadas a la funcin.

Especificacin de un Comprobador de Tipos Bsico

Bsicamente se debern realizar dos tareas:

1. Asignacin de tipos: En las declaraciones.
2. Evaluacin y comprobacin de tipos: En las expresiones y en las funciones, as
como en las sentencias.



5


Sea la gramtica:

PD; S
D D; D | id: T
T char | entero | real | booleano | array [num] of T | ^T | T a T
S id: = E | if E then S | while E do S | S; S
E literal | num | id | id[E] | id^ | E op_lgico E | E op_arit E | E mod E | id(E).






Primer paso: Asignacin de tipo

P D; S
D D; D
D id: T {Aadir_TS (id.entrada, T.tipo}
T char {T.tipo = char}
T entero {T.tipo = entero}
T real {T.tipo = real}
T booleano {T.tipo = booleano}
T array [num] of T1 {T.tipo = array (num.val, T1.tipo)}
T ^T1 {T.tipo = puntero (T1.tipo)}
T T1 T2 {T.tipo = T1.tipo T2.tipo}



6


Segundo paso: Comprobacin de tipo en expresiones

E literal {E.tipo = char}
E num {E.tipo = entero}
E id {E.tipo = Consultar_TS (id.entrada)}
E id[E1]
{id.tipo = Consultar_TS (id.entrada)}
{E.tipo =si (id.tipo=array(s, t) y E2.tipo=entero)
Entonces t
Sino error_tipo}

E E1 op_lgico E2
{E.tipo = si (E1.tipo=booleano y E2.tipo=booleano)
Entonces booleano
Sino error_tipo}


E id^
{id.tipo = Consultar_TS(id.entrada)}
{E.tipo = si (id.tipo = puntero(t))
Entonces t
Sino error_tipo}
E E1 mod E2
{E.tipo = si (E1.tipo=entero y E2.tipo=entero)
Entonces entero
Sino error_tipo}

E id (E2)
{id.tipo = Consultar_TS(id.entrada)}

{E.tipo = si id.tipo = s y E1.tipo= s t)
Entonces t
Sino error_tipo}

Tercer paso: Comprobacin de tipo en sentencias

S id:=E {id.tipo = Consultar_TS(id.entrada)}

{S.tipo = si (id.tipo = E.tipo)
Entonces vaco
7

Sino error_tipo}
S if E then S1 {S.tipo = si (E.tipo = booleano)
Entonces S1.tipo
Sino error_tipo}

S while E do S1 {S.tipo = si (E.tipo = booleano)
Entonces S1.tipo
Sino error_tipo}

S S1; S2 {S.tipo = si (S1.tipo=vaco y S2.tipo=vaco)
Entonces vaco
Sino error_tipo}


1.4. PILA SEMNTICA EN UN ANALIZADOR SINTCTICO

Las pilas y colas son estructuras de datos que se utilizan generalmente para
simplificar ciertas operaciones de programacin. Estas estructuras pueden
implementarse mediante arrays o listas enlazadas.
Al utilizar arreglos para implementar pilas se tiene la limitacin de que se debe
reservar el espacio en memoria con anticipacin. Una vez dado un mximo de
capacidad a la pila no es posible insertar un nmero de elementos mayor que el
mximo establecido.

Analizador Sintctico:

Es un Autmata de pila que reconoce la estructura de una cadena de
componentes lxicos.

En general, El analizador sintctico: Inicializa el compilador y para cada smbolo
de entrada llama al analizador morfolgico y proporciona el siguiente smbolo de
entrada.
Analizadores descendentes:
Parten del axioma inicial de la gramtica, se va descendiendo utilizando las
derivaciones izquierdas, hasta llegar a construir la cadena analizada.

Analizadores ascendentes
Se va construyendo el rbol desde sus nodos terminales. Es decir, se
construye desde los smbolos de la cadena hasta llegar al axioma de la
gramtica.
8


Definiciones: Pilas y Colas

Pila: Una coleccin de datos a los cuales se les puede acceder mediante un
extremo, que se conoce generalmente como tope.

Las Pilas tienen dos operaciones bsicas:
Push (para insertar un elemento)
Pop (para extraer un elemento).


Su caracterstica fundamental es que al extraer se obtiene siempre el ltimo
elemento que acaba de insertarse. Por esta razn tambin se conocen como
estructuras de datos LIFO (del ingls Last In First Out). Una posible
implementacin mediante listas enlazadas sera insertando y extrayendo siempre
por el principio de la lista.

Pilas hacen posible el uso de la recursividad. La variable que llama al mismo
procedimiento en el que est, habr que guardarla as como el resto de variables
de la nueva llamada, para a la vuelta de la recursividad ir sacndolas, esto es
posible a la implementacin de pilas.

Las pilas se utilizan en muchas aplicaciones que utilizamos con frecuencia. Por
ejemplo, la gestin de ventanas en Windows (cuando cerramos una ventana
siempre recuperamos la que tenamos detrs).

Cuando las pilas y colas se usan para simplificar ciertas operaciones de
programacin. La pila est llena y se intenta insertar un nuevo elemento, se
producir un error conocido como desbordamiento overflow.

Una posible solucin a este tipo de inconvenientes consiste en definir pilas de gran
tamao, pero esto resultar ineficiente y costoso. No siempre es viable saber con
exactitud el nmero de elementos a tratar, y siempre existe la posibilidad de que
ocurra un error de desbordamiento.

Insertar un elemento- push
Eliminar - pop
Pila_vaca
Pila llena
Operaciones con pilas

9


Las Colas tambin son llamadas FIFO (First In First Out), que quiere decir el
primero que entra es el primero que sale.

1. Colas simples:
Se inserta por un sitio y se saca por otro, en el caso de la cola simple se inserta
por el final y se saca por el principio. Para gestionar este tipo de cola hay que
recordar siempre cual es el siguiente elemento que se va a leer y cul es el ltimo
elemento que se ha introducido.

2. Colas circulares:
En las colas circulares se considera que despus del ltimo elemento se accede
de nuevo al primero. De esta forma se reutilizan las posiciones extradas, el final
de la cola es a su vez el principio, crendose un circuito cerrado.

3. Colas con prioridad:
Las colas con prioridad se implementan mediante listas o arrays Ordenados. No
nos interesa en este caso que salgan en el orden de entrada sino con una
prioridad que le asignemos. Puede darse el caso que existan varios elementos con
la misma prioridad, en este caso saldr primero aquel que primero llego (FIFO).

Analiza el smbolo, la pila y el estado del autmata, el Analizador Sintctico
produce las estructuras necesarias para la siguiente etapa y en el caso de
compilacin dirigida por la sintaxis invoca llamadas directas al analizador
semntico y al generador de cdigo. Escribe mensajes de errores y trata de limitar
el efecto de estos errores.

Al decir, Pila Semntica no se refiere a que hay varios tipos de Pila; hace
referencia a que se debe programar nica y exclusivamente en un solo lenguaje,
es decir, no podemos mezclar cdigo de C++ con Visual Basic; ya que se trabaja
con los mismos comandos.

Ventajas:
Los problemas de integracin entre los subsistemas son sumamente
costosos y muchos de ellos no se solucionan hasta que la programacin
alcanza la fecha lmite para la integracin total del sistema.

Se necesita una memoria auxiliar que nos permita guardar los datos
intermedios para poder hacer la comparacin.

El objetivo terico es construir un rbol de anlisis sintctico, este raramente se
10

construye como tal, sino que las rutinas semnticas integradas van generando el
rbol de Sintaxis abstracta. Se especifica mediante una gramtica libre de
contexto.

Anlisis Semntico:

Detecta la validez semntica de las sentencias aceptadas por el analizador
sintctico. El analizador semntico suele trabajar simultneamente al analizador
sintctico y en estrecha cooperacin. Se entiende por semntica como el conjunto
de reglas que especifican el significado de cualquier sentencia sintcticamente
correcta y escrita en un determinado lenguaje.

Las rutinas semnticas deben realizar la evaluacin de los atributos de las
gramticas siguiendo las reglas semnticas asociadas a cada produccin de la
gramtica. El anlisis sintctico es la fase en la que se trata de determinar el tipo
de los resultados intermedios, comprobar que los argumentos que tiene un
operador pertenecen al conjunto de los operadores posibles, y si son compatibles
entre s, etc.

En definitiva, comprobar que el significado de lo que se va leyendo es vlido. La
salida terica de la fase de anlisis semntico sera un rbol semntico. Consiste
en un rbol sintctico en el que cada una de sus ramas ha adquirido el significado
que debe tener.

Se compone de un conjunto de rutinas independientes, llamadas por los
analizadores morfolgico y sintctico. El anlisis semntico utiliza como entrada el
rbol sintctico detectado por el anlisis sintctico para comprobar restricciones de
tipo y otras limitaciones semnticas y preparar la generacin de cdigo.

Las rutinas semnticas suelen hacer uso de una pila (la pila semntica) que
contiene la informacin semntica asociada a los operados (y a veces a los
operadores) en forma de registros semnticos.

Reglas semnticas:

Son el conjunto de normas y especificaciones que definen al lenguaje de
programacin y estn dadas por la sintaxis del lenguaje, las reglas semnticas
asignan un significado lgico a ciertas expresiones definidas en la sintaxis del
lenguaje.

La evaluacin de las reglas semnticas define los valores de los atributos en los
11

nodos del rbol de anlisis sintctico para la cadena de entrada. Una regla
semntica tambin puede tener efectos colaterales, por ejemplo, imprimir un valor
o actualizar una variable global.

Compatibilidad de tipos:

Un compilador debe comprobar si el programa fuente sigue tanto las convenciones
sintcticas como las semnticas del lenguaje fuente. Esta comprobacin, llamada
comprobacin esttica (para distinguirla de la comprobacin dinmica que se
realiza durante la ejecucin del programa objeto), garantiza la deteccin y
comunicacin de algunas clases de errores de programacin. Los ejemplos de
comprobacin esttica incluyen:
Comprobaciones de tipos. Un compilador debe informar de un error si se aplica un
operador a un operando incompatible, por ejemplo, si se suman una variable tipo
matriz y una variable de funcin.
Comprobaciones del flujo de control. Las proposiciones que hacen que el flujo del
control abandone una construccin deben tener algn lugar a dnde transferir el
flujo de control Por ejemplo, una proposicin break en C hace que el control
abandone la proposicin que la engloba, while, for o switch ms cercana si dicha
proposicin englobadora no existe, ocurre un error.
Comprobaciones relacionadas con nombres. En ocasiones, el mismo nombre
debe aparecer dos o ms veces en un mismo bloque de instrucciones, el
compilador debe comprobar que se utilice el mismo nombre en ambos sitios.

Durante la fase de anlisis semntico, el compilador debe verificar que los tipos y
valores asociados a los objetos de un programa se utilizan de acuerdo con la
especificacin del lenguaje.

Adems debe detectar conversiones implcitas de tipos para efectuarlas o insertar
el cdigo apropiado para efectuarlas as como almacenar informacin relativa a los
tipos de los objetos y aplicar las reglas de verificacin de tipos.

Bottom up:
Es un principio de muchos aos del estilo de programacin que los elementos
funcionales de un programa no deben ser demasiado grandes. Si un cierto
componente de un programa crece ms all de la etapa donde est fcilmente
comprensible, se convierte en una masa de la complejidad que encubre errores
tan fcilmente como una ciudad grande encubre a fugitivos.

12


Tcnica top-down.
Este mtodo consiste en dividir los problemas en subproblemas ms sencillos
para conseguir una solucin ms rpida. El diseo descendente es un mtodo
para resolver el problema que posteriormente se traducir a un lenguaje
comprensible por la computadora.


1.5. ESQUEMA DE TRADUCCIN.
Un esquema de traduccin es una gramtica independiente del contexto en la cual
se han insertado fragmentos de cdigo en las partes derechas de sus reglas de
produccin. Los fragmentos de cdigo asi insertados se denominan acciones
semnticas. Dichos fragmentos actan, calculan y modifican los atributos
asociados con los nodos del rbol sintctico. El orden en que se evalan los
fragmentos es el de un recorrido primero-profundo del rbol de anlisis sintctico.
Obsrvese que, en general, para poder aplicar un esquema de traduccin hay que
construir el rbol sintctico y despus aplicar las acciones empotradas en las
reglas en el orden de recorrido primero-profundo. Por supuesto, si la gramtica es
ambigua una frase podra tener dos rboles y la ejecucin de las acciones para
ellos podra dar lugar a diferentes resultados. Si se quiere evitar la multiplicidad de
resultados (interpretaciones semnticas) es necesario precisar de que rbol
sintctico concreto se esta hablando.
Por ejemplo, si en la regla insertamos un fragmento de cdigo:

La accin se ejecutar despus de todas las acciones asociadas con el
recorrido del subrbol de y antes que todas las acciones asociadas con el
recorrido del subrbol .



13

1.6. GENERACIN DE LA TABLA DE SMBOLOS Y DE
DIRECCIN.
Tambin se la llama tabla de nombres o tabla de identificadores y tiene dos
funciones Principales:

Efectuar chequeos semnticos.
Generacin de cdigo.
Permanece slo en tiempo de compilacin, no de ejecucin, excepto en aquellos
casos en que se compila con opciones de depuracin.

La tabla almacena la informacin que en cada momento se necesita sobre las
variables del programa, informacin tal como: nombre, tipo, direccin de
localizacin, tamao, etc. La gestin de la tabla de smbolos es muy importante, ya
que consume gran parte del tiempo de compilacin.

De ah que su eficiencia sea crtica. Aunque tambin sirve para guardar
informacin referente a los tipos creados por el usuario, tipos enumerados y, en
general, a cualquier identificador creado por el usuario, nos vamos a centrar
principalmente en las variables de usuario.

Una tabla de smbolos puede conceptualizarse como una serie de renglones, cada
uno de los cuales contiene una lista de valores de atributos que son asociados con
una variable en particular. Las clases de los atributos que aparecen en una tabla
de smbolos dependen en algn grado de la naturaleza del lenguaje de
programacin para el cual se escribe el compilador.
Por ejemplo, un lenguaje puede ser sin tipos, y por lo tanto el atributo tipo no
necesita aparecer en la tabla. Similarmente, la organizacin de la tabla de
smbolos variar dependiendo de las limitaciones de memoria y tiempo de acceso.

1.7. MANEJO DE ERRORES SEMNTICOS.
Un compilador que se detiene al encontrar el primer error no es de mucha utilidad.
As pues, es necesario que el compilador sea capaz de recuperarse de los errores
encontrados y de proporcionar mayor informacin que conduzca a la fcil
reparacin de los mismos, de hecho el compilador ideal deber corregir los errores
el mismo.

14

La fase de anlisis lxico detecta errores donde los caracteres no forman
ningn token valido o en donde aparezcan caracteres invlidos.

La fase de anlisis sintctico detecta errores donde se violan las reglas de
sintaxis.

La fase de anlisis semntico detecta errores donde las construcciones son
sintcticamente correctas, pero no tienen ningn sentido.

Por ejemplo, la construccin id1 + id2 no tiene coherencia si id1 es el nombre de
una funcin y id2 es el nombre de un arreglo.


III

BIBLIOGRAFIA

A.V. Aho, R. Sethi, J.D. Ullman.Compiladores: principios, tcnicas y herramientas.
Addison-Wesley Iberoamerica. 1990.
Kenneth C. Louden. Construccin de compiladores. Principios y prcticaThomson-
Paraninfo. 2004.
PDF, Compiladores: Traductores y Compiladores Sergio Glvez Rojas y Miguel ngel
Mora Mata.
Ing. Mirko Manrique Ronceros. (2010). acciones semnticas de un analizador sintctico.
analisis_semantico Y comprobacion de tipos, 2, 1-9.

Azaneth Garza. (9 September 2013). Pila Semntica en un Analizador Sintctico. 28 de
agosto 2014, de prezi Sitio web: http://prezi.com/zoqex9s-t2y8/14-pila-semantica-en-
un-analizador-sintactico.

Вам также может понравиться