Professional Documents
Culture Documents
ANLISIS
SEMNTICO
Instituto Tecnolgico de Tapachula
Ricardo Enrique de la Parra Aguirre
13510644
Ing. Sistemas Computacionales
Lenguajes y Autmatas ll
Lic. Manuel Cedecedo Garca
Contenido
Introduccin.......................................................................................................... 2
Unidad 1. Anlisis semntico................................................................................... 3
1.1 rboles de expresiones.................................................................................. 3
1.2 Acciones semnticas de un analizador sintctico................................................3
1.3 Comprobaciones de tipos de expresiones.........................................................7
Declaraciones................................................................................................. 8
Sentencias...................................................................................................... 9
Expresiones.................................................................................................... 9
1.4 Pila semntica en un analizador sintctico.......................................................10
1.5 Esquema de traduccin................................................................................ 11
1.6 Generacin de la tabla de smbolos y de direcciones........................................13
1.7 Manejo de errores semnticos.......................................................................17
Conclusin.......................................................................................................... 19
Bibliografa.......................................................................................................... 20
Introduccin
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.
TipoVar =enterobooleano
Donde todos los smbolos son terminales excepto DeclVar y TipoVar, que son no
terminales.
var . lexema , nombreVar .lexema ,nombreVar . direccion ,
Las acciones semnticas se suelen contener entre llaves (o llaves y dos puntos)
para separarlas de la gramtica. A grandes rasgos se tendr (figura 1.2.1):
Reglas semnticas
insert (id . name , typeexp .tipe)
typeexp
typeexp bool
2
typeexp array [ num ] of type
1
2
type type makeTypeNode (array , num . type type)
sent id :=exp
if not
if not
exp true
exp false
exp id
Donde el hijo del nodo array (arreglo) es el rbol del tipo dado por el parmetro
type. Se supone que los tipos simples integer y boolean se construyen como
nodos de hoja estndar en la representacin de rbol.
type
Sentencias
Las no tienen tipos en s mismas, sino subestructuras que es necesario verificar
en cuanto a la exactitud de tipo. Situaciones tpicas se muestran mediante las dos
reglas de sentencia en la gramtica simple, la sentencia if y la sentencia de
asignacin. En el caso de la sentencia if, la expresin condicional debe tener tipo
booleano.
Esto
se
indica
mediante
la
regla
if not typeEqual ( exp . type , boolean ) then typeerror (sent ) donde type_error indica un
mecanismo de informe cuyo comportamiento se describir en breve.
En el caso de la sentencia de asignacin, el requerimiento es que la variable que
se est asignando debe tener el mismo tipo que la expresin cuyo valor est por
recibir. Esto depende del algoritmo de equivalencia de tipos, como se expres
mediante la funcin typeEqual.
Expresiones
Las expresiones constantes, tales como nmeros, y los valores booleanos true y
false, tienen tipos implcitamente definidos integer y boolean. Los nombres de
variable tienen sus tipos determinados mediante operadores, tales como el
operador aritmtico +, el operador booleano or y el operador de subndice [ ]. En
cada caso las subexpresiones deben ser del tipo correcto para la operacin
indicada. En el caso de los subndices, esto se indica mediante la regla
if isArrayType ( exp2 .type )typeEqual ( exp3 . type ,integer )
thenexp 1 . type exp2 . type . childl else type . error (exp1 )
Aqu la funcin isArrayType prueba que su parmetro es un tipo arreglo (array),
es decir, que la representacin de rbol del tipo tenga un nodo raz que represente
el constructor de tipo arreglo. El tipo de la expresin del subndice resultante es el
tipo base del arreglo, el cual es el tipo representado por el (primer) hijo child del
nodo raz en la representacin de rbol de un tipo arreglo, y esto se indica
escribiendo exp2 .type . child 1.
El resto describe el comportamiento de un verificador de tipo as en la presencia
de errores, como se indica mediante el procedimiento type_error en las reglas
semnticas de la tabla 3.1.1. Las cuestiones principales son cundo generar un
mensaje de error y cmo continuar la verificacin de tipos en la presencia de
emes. No se debera generar un mensaje de error cada vez que ocurre un error de
tipo; de otro modo, un error simple podra causar que se imprimiera una cascada
de muchos errores (algo que tambin puede pasar con errores de anlisis
sintctico). En su lugar, si el procedimiento type_error puede determinar que un
error de tipo ya debe haber ocurrido en un lugar relacionado, entonces debera
suprimirse la gene- racin de un mensaje de error. Esto se puede sealar teniendo
un tipo de error interno especial (el cual se puede representar mediante un rbol
de tipo nulo). Si typeError encuentra este tipo de error en una subestructura,
entonces no se genera ningn mensaje de error. Al mismo tiempo, si un error de
tipo tambin significa que no se puede determinar el tipo de una estructura,
entonces el verificador de tipo puede usar el tipo de error como su (en realidad
desconocido) tipo.
Por ejemplo, en las reglas semnticas de la tabla 3.1.1, dada una expresin con
subndice exp1 exp 2 [exp 3 ] , si exp2 no es un tipo arreglo, entonces no se
puede asignar a
acciones semnticas. Esto supone que los campos de tipo se han inicializado para
algn tipo de error. Por otra parte, en el caso de las operaciones + y or, incluso en
la presencia de un error de tipo, puede hacerse la suposicin de que cl resultado
10
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
se puede mezclar cdigo C++ con Visual Basic; ya que se trabaja con comandos
similares.
El objetivo terico es construir un rbol de anlisis sintctico, este raramente se
construye como tal, sino que las rutinas semnticas integradas van generando el
rbol de sintaxis abstracta. Las rutinas semnticas deben realizar la evaluacin de
11
los atributos de las gramticas siguiendo las reglas semnticas asociadas a cada
produccin de la gramtica. En definitiva, comprobar que el significado que se va
leyendo es vlido. La salida terica de la fase de anlisis semntico sera un
rbol semntico. Las rutinas semnticas suelen hacer uso de una pila (la pila
semntica) que contiene la informacin semntica asociada a los operandos ( y a
veces a los operadores) en forma de registros semnticos.
1.5 Esquema de traduccin
Un esquema de traduccin es una gramtica de contexto libre en la que se
encuentran intercalados, en el lado derecho de la regla de produccin, fragmentos
de programas a los que hemos llamado acciones semnticas. Un esquema de
traduccin es como una definicin dirigida por sintaxis, con la excepcin de que el
orden de evaluacin de las reglas semnticas se muestra explcitamente. La
posicin en la que se ejecuta alguna accin se da entre llaves y se escribe en el
lado derecho de la regla de produccin. Por ejemplo:
A cd { printf ( c+ d ) } B
T real { T . tipo=real }
L { L1 . her =L. her } L1 ,id {aadetipo ( id . pt r tbs , L . her ) }
L id {aadetipo ( id . ptrtbs , L .her ) }
Un traductor divide su labor en dos etapas: una que analiza la entrada y genera
estructuras intermedias y otra que sintetiza la salda a partir de dichas estructuras.
Por tanto, el esquema de un traductor pasa de ser el de la figura 1.5.1, a ser el de
la figura 1.5.2.
Bsicamente los objetos de la etapa de anlisis son:
a) Controlar la correccin del programa fuente
b) Generar las estructuras necesarias para comenzar la etapa de sntesis
16
17
18
19
Conclusin
Se denomina tradicionalmente anlisis semntico a todo aquello que forma parte
del frontal [front-ent] ms all de lo que la gramtica utilizada nos permite: Tabla
de smbolos, chequeos de tipos, generacin de representacin interna.
La etapa de anlisis semntico detecta la validez semntica de las sentencias
aceptadas por el analizador sintctico, es decir, revisa el conjunto de reglas que
especifican el significado de las sentencias sintcticas y las compara, verificando
su correcta escritura. El analizador semntico suele trabajar simultneamente al
analizador sintctico y en estrecha cooperacin.
El analizador semntico es la fase que sigue al anlisis sintctico.
20
Bibliografa
Snchez Dueas, G., & Valverde Andreu, J. A. (1990). Compiladores e interpretes.
Un enfoque pragmatico. Madrid: Daz de Santos.
V. Aho, A., Sethi, R., & D. Ullman, J. (1990). Compiladores. Principios, tcnicas y
herramientas. Massachusetts, EUA: Addison Wesley Longman.
Glvez Rojas, S. & Mora Mata, M. A. (2005). Traductores y compiladores con
Lex/Yacc, JFlex/Cup y JavaCC. Dpto. de Lenguajes y Ciencias de la
Computacin, E.T.S. de Ingeniera Informtica: Universidad de Mlaga.
Teufel, T., Schmidt, S. & Teufel, B. (1995).
fundamentales. Delaware, EUA: Astro Data.
Compiladores. Conceptos
21