Maestro: Ponce
Alumno: Carlos A. Reynosa
Gonzlez
Contenido
Introduccin...............................................................................................................2
Anlisis Semntico.....................................................................................................3
Arboles de expresiones..........................................................................................6
Acciones semnticas de un analizador sintctico................................................11
Comprobaciones de tipos en expresiones...............................................................11
Esquemas de Traduccin........................................................................................15
Generacin de la tabla de smbolo y de direcciones...............................................16
Manejo de errores semnticos.............................................................................20
Conclusiones...........................................................................................................22
Introduccin
Hay determinadas caractersticas de los lenguajes de programacin que no
pueden ser modeladas mediante gramticas contextuales y que es necesario
comprobar en una fase posterior al anlisis sintctico. Por otro lado, las fases
posteriores de la compilacin o interpretacin necesitan una representacin de la
entrada que les permita llevar a cabo sus funciones de manera adecuada. Estas
dos vertientes deteccin de errores y representacin de la informacin estn
muy relacionadas y se solapan en la prctica. Supongamos, por ejemplo, que
nuestro lenguaje permite asignaciones segn la regla Asignacin id:=
Expresin; Es habitual que se impongan ciertas restricciones. En nuestro caso,
estas podran ser:
El identificador de la parte izquierda debe estar declarado previamente. El tipo de
la expresin debe ser compatible con el del identificador. El analizador semntico
deber a comprobar que estas dos restricciones se cumplen antes de declarar que
la sentencia de asignacin est bien formada.
Pero sucede que la informacin necesaria para comprobarlas es til tambin para
generar cdigo. Esto quiere decir que si tuvo ramos una separacin estricta entre
las fases del compilador, para generar cdigo deberamos volver a mirar el
identificador para saber a qu objeto (variable, funcin, constante, etc.)
corresponde y que tipo tiene y tambin deberamos volver a comprobar los tipos
de la expresin para generar el cdigo adecuado.
Anlisis Semntico
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.
En compiladores de un solo paso, las llamadas a las rutinas semnticas se
realizan directamente desde el analizador sintctico y son dichas rutinas las que
llaman al generador de cdigo. El instrumento ms utilizado para conseguirlo es la
gramtica de atributos.
En compiladores de dos o ms pasos, el anlisis semntico se realiza
independientemente de la generacin de cdigo, pasndose informacin a travs
de un archivo intermedio, que normalmente contiene informacin sobre el rbol
sintctico en forma linealizada (para facilitar su manejo y hacer posible su
almacenamiento en memoria auxiliar).
En cualquier caso, 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.
La fase de anlisis semntico de un procesador de lenguaje es aqulla que
computa la informacin adicional necesaria para el procesamiento de un lenguaje,
una vez que la estructura sintctica de un programa haya sido obtenida. Es por
tanto la fase posterior a la de anlisis sintctico y la ltima dentro del proceso de
sntesis de un lenguaje de programacin.
Sintaxis de un lenguaje de programacin es el conjunto de reglas formales que
especifican la estructura de los programas pertenecientes a dicho lenguaje.
Semntica de un lenguaje de programacin es el conjunto de reglas que
especifican el significado de cualquier sentencia sintcticamente vlida.
Finalmente, el anlisis semntico1 de un procesador de lenguaje es la fase
encargada de detectar la validez semntica de las sentencias aceptadas por el
analizador sintctico.
La sintaxis del lenguaje C indica que las expresiones se pueden formar con un
conjunto de operadores y un conjunto de elementos bsicos. Entre los operadores,
Arboles de expresiones.
En muchos problemas de programacin numrica es necesario trabajar con los
valores obtenidos al evaluar una expresin matemtica determinada,
generalmente la solucin a este problema radica en escribir directamente en el
cdigo fuente dicha expresin para luego usarla. La va anterior trae como
inconveniente la recompilacin del cdigo fuente cada vez que se quiera definir
otra expresin matemtica, lo que a su vez nos limita si queremos hacer un
programa que sea genrico en ese sentido. Al usar un intrprete de funciones se
puede solucionar este problema, al poder evaluar de forma dinmica cualquier
expresin matemtica. Sin embargo, prcticamente ningn lenguaje de
programacin trae en su implementacin estndar de funciones y/o clases algn
soporte para interpretar funciones dinmicamente.
Conceptos importantes
Es necesario para una mejor comprensin de este trabajo definir una serie
trminos que sern usados con frecuencia:
Notacin Tradicional
a+b
(a+b) * c
Regla I:
Existe un orden de prioridad para los operadores, que de menor a mayor es el
siguiente: suma (+) y resta (-), multiplicacin (*) y divisin (/), exponenciacin (^),
operadores unarios. El parntesis izquierdo lo trataremos como un operador
(aunque no lo es) cuyo orden de prioridad es el mayor de todos cuando se quiera
apilar y el menor de todos cuando est en la cima de la pila.
Cuando se intente apilar algn operador se har lo siguiente: si es un operador
unario entonces se apila, si es un operador binario, se comparar su prioridad con
el ltimo insertado en la pila (el de la cima), si su prioridad es mayor, entonces se
apilar. Si ocurre lo contrario (su prioridad es menor o igual) entonces el operador
de la cima de la pila se desapilar y pasar a formar parte de la notacin polaca.
Se volver a intentar apilar el operador siguiendo la misma regla, hasta que se
pueda apilar, si la pila queda vaca tambin se apila. El parntesis izquierdo
siempre se apilar y no podr ser desapilado por ningn operador y por tanto no
formar parte de la notacin polaca inversa.
El siguiente ejemplo, ayudar a entender mejor lo dicho anteriormente. Sea la
siguiente expresin infija: 2^sin(y+x)ln(x).
En la siguiente tabla se muestra paso a paso la conversin a notacin postfija. Se
usa el color rojo para sealar los casos en que es necesario desapilar operadores
de la pila.
Regla II.
Si el nodo corresponde a un operando, entonces se apila. Si el nodo corresponde
a una operador unario entonces se desapila un nodo de la pila de nodos y es
enlazado a la rama izquierda del nodo correspondiente al operador unario y este
ltimo es apilado. Si el nodo corresponde a un operador binario entonces dos
nodos son desapilados de la pila de nodos, el primero es enlazado a la rama
derecha del nodo binario y el segundo a la rama izquierda, nuevamente este nodo
es apilado.
En el siguiente ejemplo se usa la misma expresin infija anterior (2^sin(y+x) ln
(x)) para ilustrar el procedimiento para construir el rbol:
Primero:= a
end;
Esquemas de Traduccin
Un analizador sintctico ascendente utiliza durante el anlisis una pila. En esta va
guardando datos que le permiten ir haciendo las operaciones de reduccin que
necesita.
Para incorporar acciones semnticas como lo es construir el rbol sintctico, es
necesario incorporar a la pila del analizador sintctico ascendente otra columna
que guarde los atributos de los smbolos que se van analizando.
Un Esquema de Traduccin Dirigido por Sintaxis
Siempre se puede
1. Construir el rbol gramatical completo.
2. Recorrer el rbol en DFS de izquierda a derecha.
3. Ejecutar las acciones a medida que se encuentran en este recorrido
En la prctica
S E# {print(E.val)}
E E1+T {E.val E1.val + T.val}
E T {E.val T.val}
TT1F {T.val T1.val F.val}
TF {T.val F.val}
F (E) {F.val E.val}
F n {F.val n.val}
Atributos de cada smbolo en la pila.
Imprime la respuesta
La tabla de smbolos contiene informacin til para poder compilar, por tanto
existe en tiempo de compilacin, y no de ejecucin.
Sin embargo, en un intrprete, dado que la compilacin y ejecucin se
producen a la vez, la tabla de smbolos permanece todo el tiempo.
Suponemos que queremos hacer las siguientes operaciones:
a=7*3
b=3*a
En la segunda instruccin necesitamos saber cunto vale a; es decir el valor
de a debe estar guardado en algn sitio. Para ello utilizaremos una lista de
pares:
Conclusiones
El analizador semntico tiene dos objetivos:
Hacer comprobaciones que no se hagan durante el anlisis lxico o sintctico.
Crear una representacin adecuada para fases posteriores.
Implementaremos el anlisis semntico en dos partes:
Mediante esquemas de traduccin dirigidos por la sintaxis.
Recorriendo el AST.
Un esquema de traduccin dirigido por la sintaxis aade a las gramticas:
Acciones intercaladas en las partes derechas de las reglas.
Atributos asociados a los no terminales.
Dos tipos de atributos: heredados y sintetizados.
Las acciones deben garantizar que se evalan correctamente los atributos.
Se pueden implementar los esquemas de traduccin sobre los analizadores
sintcticos interpretando los atributos como parmetros y aadiendo el cdigo de
las acciones al cdigo del analizador.
El clculo de algunos atributos y algunas comprobaciones semnticas son ms
fciles sobre el AST
Bibliografa
http://di002.edv.uniovi.es/~ortin/publications/semantico.pdf
http://www.giaa.inf.uc3m.es/docencia/ITIG/Semantico.pdf
http://www.gramaticas.net/2012/05/ejemplos-de-analisis-semantico.html
http://arantxa.ii.uam.es/~alfonsec/docs/compila5.htm