Materia: Autómatas II Maestro: Ponce Alumno: Carlos A. Reynosa
González
Contenido
Introducción.................. Introducción........................... .................. .................. ................. ................. .................. .................. ........................................2 ...............................2 Análisis Semántico................ Semántico......................... ................. ................. .................. .................. .................. ................. ................. .................. ...............3 ......3 Arboles de expresiones................... expresiones............................ .................. .................. ................. ................. .................. .................. .................. ......... Acciones semánticas de un analizador sintáctico................. sintáctico.......................... .................. .................. .............!! ....!! Comprobaciones de tipos en expresiones..................... expresiones.............................. .................. .................. .................. ...............!! ......!! "s#uemas de $raducción.............. $raducción...................... ................. .................. .................. .................. ........................... ..............................!% ............!% Generación de la tabla de s&mbolo y de direcciones....................... direcciones................................ ................. ...............! .......! 'ane(o de errores semánticos................... semánticos............................ .................. .................. ................. ................. ....................... ..............2) 2) Conclusiones.................. Conclusiones.......................... ................. .................. .................. .................. .................. .................................... ....................................22 .........22
Introducción *ay determinadas caracter&sticas de los len+ua(es de pro+ramación #ue no pueden ser modeladas mediante +ramáticas contextuales y #ue es necesario comprobar en una ,ase posterior al análisis sintáctico. Por otro lado- las ,ases posteriores de la compilación o interpretación necesitan una representación de la entrada #ue les permita llear a cabo sus ,unciones de manera adecuada. "stas dos ertientes /detección de errores y representación de la in,ormación/ están muy relacionadas y se solapan en la práctica. Supon+amos- por e(emplo- #ue nuestro len+ua(e permite asi+naciones se+0n la re+la Asi+nación 1 id "xpresión4 "s 5abitual #ue se impon+an ciertas restricciones. "n nuestro casoestas podr&an ser "l identi,icador de la parte iz#uierda debe estar declarado preiamente. "l tipo de la expresión debe ser compatible con el del identi,icador. "l analizador semántico deber 6a comprobar #ue estas dos restricciones se cumplen antes de declarar #ue la sentencia de asi+nación está bien ,ormada. Pero sucede #ue la in,ormación necesaria para comprobarlas es 70til tambi8n para +enerar códi+o. "sto #uiere decir #ue si tuo 8ramos una separación estricta entre las ,ases del compilador- para +enerar códi+o deber&amos oler a mirar el identi,icador para saber a #u8 ob(eto 9ariable- ,unción- constante- etc.: corresponde y #ue tipo tiene y tambi8n deber&amos oler a comprobar los tipos de la expresión para +enerar el códi+o adecuado.
Análisis Semántico Se compone de un con(unto de rutinas independientes- llamadas por los analizadores mor,oló+ico y sintáctico. "l análisis semántico utiliza como entrada el árbol sintáctico detectado por el análisis sintáctico para comprobar restricciones de tipo y otras limitaciones semánticas y preparar la +eneración de códi+o. "n compiladores de un solo paso- las llamadas a las rutinas semánticas se realizan directamente desde el analizador sintáctico y son dic5as rutinas las #ue llaman al +enerador de códi+o. "l instrumento más utilizado para conse+uirlo es la +ramática de atributos. "n compiladores de dos o más pasos- el análisis semántico se realiza independientemente de la +eneración de códi+o- pasándose in,ormación a tra8s de un arc5io intermedio- #ue normalmente contiene in,ormación sobre el árbol sintáctico en ,orma linealizada 9para ,acilitar su mane(o y 5acer posible su almacenamiento en memoria auxiliar:. "n cual#uier caso- las rutinas semánticas suelen 5acer uso de una pila 9la pila semántica: #ue contiene la in,ormación semántica asociada a los operandos 9y a eces a los operadores: en ,orma de re+istros semánticos. ;a ,ase de análisis semántico de un procesador de len+ua(e es a#u8lla #ue computa la in,ormación adicional necesaria para el procesamiento de un len+ua(euna ez #ue la estructura sintáctica de un pro+rama 5aya sido obtenida. "s por tanto la ,ase posterior a la de análisis sintáctico y la 0ltima dentro del proceso de s&ntesis de un len+ua(e de pro+ramación. Sintaxis de un len+ua(e de pro+ramación es el con(unto de re+las ,ormales #ue especi,ican la estructura de los pro+ramas pertenecientes a dic5o len+ua(e. Semántica de un len+ua(e de pro+ramación es el con(unto de re+las #ue especi,ican el si+ni,icado de cual#uier sentencia sintácticamente álida.
;a sintaxis del len+ua(e C indica #ue las expresiones se pueden ,ormar con un con(unto de operadores y un con(unto de elementos básicos. "ntre los operadores-
con sintaxis binaria in,i(a- se encuentran la asi+nación- el producto y la diisión. "ntre los elementos básicos de una expresión existen los identi,icadores y las constantes enteras sin si+no 9entre otros:. Su semántica identi,ica #ue en el re+istro asociado al identi,icador super,icie se le a a asociar el alor resultante del producto de los alores asociados a base y altura- diididos por dos 9la super,icie de un trián+ulo:.
•
•
•
•
>ue todos los identi,icadores #ue aparecen en la expresión 5ayan sido declarados en el ámbito actual- o en al+uno de sus ámbitos preios. >ue la subexpresión de la iz#uierda sea semánticamente álida- es decir#ue sea un alue . >ue a los tipos de los identi,icadores base y altura se les pueda aplicar el operador de multiplicación. ?n re+istro en C- por e(emplo- no ser&a álido. =eberá in,erirse el tipo resultante de la multiplicación anterior. Al tipo in,erido se le deberá poder aplicar el operador de diidir- con el tipo entero como multiplicando. =eberá in,erirse el tipo resultante de la diisión y comprobarse si 8ste es compatible con el tipo de super,icie para llear a cabo la asi+nación. Como e(emplo- si super,icie ,uese entera y diision real- no podr&a llearse a cabo la asi+nación.
•
;a ,ase de análisis semántico obtiene su nombre por re#uerir in,ormación relatia al si+ni,icado del len+ua(e- #ue está ,uera del alcance de la representatiidad de las +ramáticas libres de contexto y los principales al+oritmos existentes de análisis4 es por ello por lo #ue se dice #ue captura la parte de la ,ase de análisis considerada ,uera del ámbito de la sintaxis. =entro de la clasi,icación (erár#uica #ue C5oms@y dio de los len+ua(es- la utilización de +ramáticas sensibles al contexto 9o de tipo !: permitir&a identi,icar sintácticamente caracter&sticas como #ue la utilización de una ariable en el len+ua(e Pascal 5a de estar preiamente declarada. Sin embar+o- la implementación de un analizador sintáctico basado en una +ramática de estas caracter&sticas ser&a computacionalmente más comple(a #ue un autómata de pila. As&- la mayor&a de los compiladores utilizan una +ramática libre de contexto para describir la sintaxis del len+ua(e y una ,ase de análisis semántico posterior para restrin+ir las sentencias #ue semánticamenteB no pertenecen al len+ua(e. "n el caso #ue mencionábamos del empleo de una ariable en Pascal #ue necesariamente 5aya tenido #ue ser declarada- el analizador sintáctico se limita a comprobar- mediante una +ramática libre de contexto- #ue un identi,icador ,orma parte de una expresión. ?na ez comprobado #ue la sentencia es sintácticamente correcta- el analizador semántico deberá eri,icar #ue el identi,icador empleado como parte de una expresión 5aya sido declarado preiamente. Para llear a cabo
esta tarea- es t&pica la utilización de una estructura de datos adicional denominada tabla de s&mbolos. sta poseerá una entrada por cada identi,icador declarado en el contexto #ue se est8 analizando. Con este tipo de estructuras de datos adicionales- los desarrolladores de compiladores acostumbran a suplir las carencias de las +ramáticas libres de contexto. "l ob(etio principal del analizador semántico de un procesador de len+ua(e es ase+urarse de #ue el pro+rama analizado satis,a+a las re+las re#ueridas por la especi,icación del len+ua(e- para +arantizar su correcta e(ecución. "l tipo y dimensión de análisis semántico re#uerido ar&a enormemente de un len+ua(e a otro. "n len+ua(es interpretados como ;isp o Smalltal@ casi no se llea a cabo análisis semántico preio a su e(ecución- mientras #ue en len+ua(es como Ada- el analizador semántico deberá comprobar numerosas re+las #ue un pro+rama ,uente está obli+ado a satis,acer. Demos- pues- cómo el análisis semántico de un procesador de len+ua(e no modela la semántica o comportamiento de los distintos pro+ramas construidos en el len+ua(e de pro+ramación- sino #ue- 5aciendo uso de in,ormación parcial de su comportamiento- realiza todas las comprobaciones necesarias no lleadas a cabo por el analizador sintáctico para ase+urarse de #ue el pro+rama pertenece al len+ua(e. Etra ,ase del compilador donde se 5ace uso parcial de la semántica del len+ua(e es en la optimización de códi+o- en la #ue analizando el si+ni,icado de los pro+ramas preiamente a su e(ecución- se pueden llear a cabo trans,ormaciones en los mismos para +anar en e,iciencia. "xisten dos ,ormas de describir la semántica de un len+ua(e de pro+ramación mediante especi,icación in,ormal o natural y ,ormal. ;a descripción in,ormal de un len+ua(e de pro+ramación es lleada a cabo mediante el len+ua(e natural. "sto 5ace #ue la especi,icación sea inteli+ible 9en principio: para cual#uier persona. ;a experiencia nos dice #ue es una tarea muy comple(a- si no imposible- el describir todas las caracter&sticas de un len+ua(e de pro+ramación de un modo preciso. Como caso particular- 8ase la especi,icación del len+ua(e ISEFASI CHH ASICHHJ. ;a descripción ,ormal de la semántica de len+ua(es de pro+ramación es la descripción ri+urosa del si+ni,icado o comportamiento de pro+ramaslen+ua(es de pro+ramación- má#uinas abstractas o incluso cual#uier dispositio 5ardKare. ;a necesidad de 5acer especi,icaciones ,ormales de semántica sur+e para •
•
•
Reelar posibles ambi+Ledades existentes implementaciones de procesadores de len+ua(es o en documentos descriptios de len+ua(es de pro+ramación. Ser utilizados como base para la implementación de procesadores de len+ua(e. Deri,icar propiedades de pro+ramas en relación con pruebas de corrección o in,ormación relacionada con su e(ecución.
•
•
•
=iseMar nueos len+ua(es de pro+ramación- permitiendo re+istrar decisiones sobre construcciones particulares del len+ua(e- as& como permitir descubrir posibles irre+ularidades u omisiones.
Arboles de expresiones.
"n muc5os problemas de pro+ramación num8rica es necesario traba(ar con los alores obtenidos al ealuar una expresión matemática determinada+eneralmente la solución a este problema radica en escribir directamente en el códi+o ,uente dic5a expresión para lue+o usarla. ;a &a anterior trae como inconeniente la recompilación del códi+o ,uente cada ez #ue se #uiera de,inir otra expresión matemática- lo #ue a su ez nos limita si #ueremos 5acer un pro+rama #ue sea +en8rico en ese sentido. Al usar un int8rprete de ,unciones se puede solucionar este problema- al poder ealuar de ,orma dinámica cual#uier expresión matemática. Sin embar+o- prácticamente nin+0n len+ua(e de pro+ramación trae en su implementación estándar de ,unciones yFo clases al+0n soporte para interpretar ,unciones dinámicamente. onceptos importantes
"s necesario para una me(or comprensión de este traba(o de,inir una serie t8rminos #ue serán usados con ,recuencia •
•
otación polaca 9notación pre,i(a: "s una ,orma de notación de expresiones matemáticas donde los operadores se colocan a la iz#uierda de los operandos. Su inención se debe al matemático polaco Nan Ou@asieKicz- #ui8n la creó alrededor de !2). ?na caracter&stica distintia de este tipo de notación es #ue se puede prescindir del uso de par8ntesis como se 5ace en la notación in,i(a 9notación tradicional:.
otación polaca inersa 9notación post,i(a: "ste es el tipo de notación #ue tiene una aplicación práctica en este traba(o- a di,erencia de la notación
pre,i(a- en la notación post,i(a los operadores son colocados a la derec5a de los operandos. "n la si+uiente tabla se muestran e(emplos de notación polaca inersa otación $radicional aHb 9aHb: Q c
otación Polaca Inersa abH ab HcQ
Pila 9stac@ en in+l8s: es una estructura de datos en la #ue el modo de acceso a sus elementos es de tipo ;I
Apilar un elemento introducir 9almacenar: un nueo elemento en la pila =espilar un elemento extraer un elemento de la pila- este elemento será el 0ltimo en ser apilado
Eperadores binarios Acordaremos en llamar operadores binarios a todos a#uellos #ue act0en sobre dos operandos- estos son suma 9H:- resta 9:- multiplicación 9Q:-....- ect. Eperadores unarios Acordaremos en llamar operadores unarios a todos a#uellos #ue act0en sobre sFsólo un operando- estos son las ,unciones matemáticas básicas seno- coseno- tan+ente- ra&z cuadrada- lo+ar&tmo natural-....- ect.
!e notación infi"a a notación postfi"a
Para construir el árbol de expresiones #ue represente nuestra expresión matemática es necesario construir primero la misma expresión pero en la notación polaca correspondiente y a partir de esta es #ue se construye el árbol. "l al+oritmo usado para trans,ormar una expresión in,i(a a pre,i(a es explicado a continuación. Sea A una expresión in,i(a cual#uiera- ,ormada por operadores- par8ntesis 9iz#uierdos y derec5os: y operandos- tambi8n se usará una pila para los operadores. "l procedimiento se+uido es el si+uiente Se lee un elemento de A- si este es un operador o un par8ntesis iz#uierdoentonces se act0a se+0n la re+la I y si es un operando entonces se en&a directamente a la expresión de notación polaca. Si el elemento le&do de A es un par8ntesis derec5o- entonces se desapilarán elementos de la pila de operadores 5asta encontrar el correspondiente par8ntesis iz#uierdo. Cada elemento desapilado pasa a ,ormar parte de la notación polaca- excepto los par8ntesis. Cuando no #ueden elementos en A- entonces se desapilan operadores de la pila5asta #ue esta #uede ac&a.
#e$la I:
"xiste un orden de prioridad para los operadores- #ue de menor a mayor es el si+uiente suma 9H: y resta 9:- multiplicación 9Q: y diisión 9F:- exponenciación 9T:operadores unarios. "l par8ntesis iz#uierdo lo trataremos como un operador 9aun#ue no lo es: cuyo orden de prioridad es el mayor de todos cuando se #uiera apilar y el menor de todos cuando est8 en la cima de la pila. Cuando se intente apilar al+0n operador se 5ará lo si+uiente si es un operador unario entonces se apila- si es un operador binario- se comparará su prioridad con el 0ltimo insertado en la pila 9el de la cima:- si su prioridad es mayor- entonces se apilará. Si ocurre lo contrario 9su prioridad es menor o i+ual: entonces el operador de la cima de la pila se desapilará y pasará a ,ormar parte de la notación polaca. Se olerá a intentar apilar el operador si+uiendo la misma re+la- 5asta #ue se pueda apilar- si la pila #ueda ac&a tambi8n se apila. "l par8ntesis iz#uierdo siempre se apilará y no podrá ser desapilado por nin+0n operador y por tanto no ,ormará parte de la notación polaca inersa. "l si+uiente e(emplo- ayudará a entender me(or lo dic5o anteriormente. Sea la si+uiente expresión in,i(a 2Tsin9yHx:Uln9x:. "n la si+uiente tabla se muestra paso a paso la conersión a notación post,i(a. Se usa el color ro(o para seMalar los casos en #ue es necesario desapilar operadores de la pila.
onstrucción del árbol binario de expresiones
?na ez obtenida la expresión en notación post,i(a- se puede ealuar mediante el uso nueamente de una pila. Sin embar+o- en nuestro caso se traba(a con una árbol binario de expresiones- as& #ue lo #ue se 5ace es construir el árbol. "l al+oritmo usado para construir el árbol no usa como tal la expresión post,i(a ya con,ormada- sino #ue el árbol se a construyendo usando las mismas re+las con las #ue se construye la notación post,i(a- una pila para los operadores y otra para los nodos del árbol- ambas no son necesitadas al terminar el árbol. "l al+oritmo es el si+uiente Se si+uen las mismas re+las expuestas anteriormente usando la pila de operadores- pero cuando se encuentra un operando o un operador es desapiladoentonces se crea el nodo correspondiente y se act0a se+0n la re+la II. Al ,inalizar el al+oritmo solo debe #uedar un nodo apilado en la pila de nodos- el #ue constituye el nodo ra&z de nuestro árbol de expresiones.
#e$la 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 iz#uierda del nodo correspondiente al operador unario y este 0ltimo 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 derec5a del nodo binario y el se+undo a la rama iz#uierda- nueamente este nodo es apilado. "n el si+uiente e(emplo se usa la misma expresión in,i(a anterior 92Tsin9yHx: U ln 9x:: para ilustrar el procedimiento para construir el árbol
Acciones semánticas de un anali%ador sintáctico
=ependiendo del tipo de sentencias- las acciones semánticas pueden a+ruparse en •
•
•
•
• •
• •
Sentencias de =eclaración Completar la sección de tipos de la $abla de S&mbolos. Sentencias e(ecutablesB Realizar comprobaciones de tipos entre los operandos implicados.
omprobaciones de tipos en expresiones •
•
•
• • •
•
Sistema de tipos re+las de un len+ua(e #ue permiten asi+nar tipos alas distintas partes de un pro+rama y eri,icar su corrección.
;a in,ormación de tipos puede ser estática o dinámica • • •
;ISP- CA'; o Smalltal@ utilizan in,ormación de tipos dinámica. "n A=A- Pascal o C la in,ormación de tipos es estática. $ambi8n puede ser una combinación de ambas ,ormas.
Cuantas más comprobaciones puedan realizarse en la ,ase de Compilaciónmenos tendrán #ue realizarse durante la e(ecución •
'ayor e,iciencia del pro+rama ob(eto.
"s parte de la comprobación de tipos •
•
Conersión de tipos expl&cita trans,ormación del tipo de una expresión con un propósito determinado. Coerción conersión de tipos #ue realiza de ,orma impl&cita el compilador.
Conersión de tipos expl&cita el pro+ramador indica el tipo destino. •
Conersión de tipos impl&cita el compilador conierte automáticamente elementos de un tipo en elementos de otro. •
•
•
;a conersión se llea a cabo en la acción semántica de la re+la donde se realiza. Comprobador de tipos se+uro =urante la compilación 9comprobación estática: detecta todos los posibles errores de tipo. ;en+ua(e ,uertemente tipado Si un ,ra+mento de códi+o compila es #ue no se an a producir errores de tipo. "n la práctica- nin+0n len+ua(e es tan ,uertemente tipado #ue permita una completa comprobación estática.
In,ormación de tipos dinámica "l compilador debe +enerar códi+o #ue realice la in,erencia y eri,icación de tipos durante la e(ecución del pro+rama #ue se está compilando. Vlet primero 9a-b: a44 primero a Q b W a X,unW In,ormación de tipos estática U Se utiliza para eri,icar la exactitud del pro+rama antes de la e(ecución. U Permite determinar la asi+nación de memoria necesaria para cada ariable. ,unction Primero9a-binte+er:inte+er4 be+in
Primero a end4 $ipo de datos con(unto de alores H operaciones aplicables "n el ámbito de los compiladores- un tipo se de,ine mediante una expresión de tipo 9in,ormación de tipos expl&cita: • • •
ombre de tipo ,loat "xpresión estructurada expl&cita set o, inte+er "stas expresiones se utilizan en la construcción de otros tipos o para declarar ariables.
$ambi8n es posible incluir in,ormación de tipos impl&cita const 'AY !)4 ;a in,ormación de tipos- impl&cita o expl&cita- se mantiene en la tabla de s&mbolos. "sta in,ormación se recupera de la tabla de s&mbolos mediante el eri,icador de tipo cuando se 5ace re,erencia al nombre asociado. Z "(emplo AiJ [ si A es de tipo array !..!)J o, real [ si i tiene tipo inte+er [ entonces AiJ es correcto y su tipo es real Saber si i ∈ !..!)-
no es una eri,icación de tipo- sino de si el ran+o es o no correcto.
?n len+ua(e de pro+ramación contiene un con(unto de tipos prede,inido denominados tipos simples. Al+unos len+ua(es permiten de,inir nueos tipos simples enumerado- subran+o. $odos los len+ua(es permiten crear nueos tipos comple(os a partir de otros más simples mediante constructores de tipos • •
'atrices- productos- re+istros- punteros- ,unciones-\ "n Pascal array- set- record-...
•
"n CHH struct- class- union-...
Para analizar los di,erentes tipos #ue interienen dentro de un pro+rama- el compilador debe contar con una estructura interna #ue le permita mane(ar cómodamente las expresiones de tipos. "sta estructura interna •
•
=ebe ser ,ácilmente manipulable- pues su creación se realizará con,orme se 5ace la lectura del pro+rama ,uente. =ebe permitir comparar ,ácilmente las expresiones asi+nadas a distintos trozos de códi+o- especialmente a los identi,icadores de ariables.
;a ,orma más 5abitual de representación son los +ra,os ac&clicos diri+idos 9GA=s:. •
;a enta(a de estas representaciones es #ue ocupan poca memoria y por tanto la comprobación de e#uialencia se e,ect0a con rapidez.
Como podemos entender un analizador sintáctico ascendente utiliza durante el análisis una pila. "n esta a +uardando datos #ue le permiten ir 5aciendo las operaciones de reducción #ue necesita. Para incorporar acciones semánticas como lo es construir el árbol sintáctico- es necesario incorporar a la pila del analizador sintáctico ascendente otra columna #ue +uarde los atributos de los s&mbolos #ue se an analizando.
&s'uemas de (raducción ?n analizador sintáctico ascendente utiliza durante el análisis una pila. "n esta a +uardando datos #ue le permiten ir 5aciendo las operaciones de reducción #ue necesita. Para incorporar acciones semánticas como lo es construir el árbol sintáctico- es necesario incorporar a la pila del analizador sintáctico ascendente otra columna #ue +uarde los atributos de los s&mbolos #ue se an analizando. ?n "s#uema de $raducción =iri+ido por Sintaxis • •
• • •
Comienza como una =e,inición =iri+ida por Sintaxis. "l metalen+ua(e de operaciones es un len+ua(e de pro+ramación $urin+ completo U despu8s de todo- es para traducir. ;as acciones pueden ocurrir en cual#uier punto de las producciones. "stán asociadas a un reconocedor concreto. "l resultado producido para el s&mbolo inicial corresponde con la traducción.
Siempre se puede !. Construir el árbol +ramatical completo. 2. Recorrer el árbol en =
o construir todo el árbol +ramatical U a5orrar espacio. Garantizar la e(ecución de acciones en el momento oportuno. $ipo de reconocedor y tipo de atribución de,inirán la estrate+ia.
• • •
;a =e,inición =iri+ida por Sintaxis es SAtribuida. "l reconocedor es ascendente.
]asta e(ecutar las acciones al reducir cada re+la. "stas re+las permiten ealuar el resultado (usto despu8s de cada reducción. S 1"V ^print9".al:_ " 1"!H$ ^".al ` "!.al H $.al_ " 1$ ^".al ` $.al_ $1$!∗< ^$.al ` $!.al ∗ <.al_
$1< ^$.al ` <.al_ < 19": ^<.al ` ".al_ < 1n ^<.al ` n.al_ Atributos de cada s&mbolo en la pila. • •
•
;a propia pila ;R o una pila paralelaB. Si el atributo es simple- contenerlo directamente arios atributos simples en estructura o re+istro ariante. Si son muc5os atributos di,erentes o bien comple(os- contener un apuntador al atributo concreto.
Al momento de reducir A 1 Y • • •
;os atributos de Y- y están en posiciones conocidas en la pila. Al reducir- se retiran de la pila durante el cálculo de los atributos de A. ;os atributos calculados para A #uedarán en el nueo tope de la pila.
•
Imprime la respuesta
)eneración de la tabla de smbolo + de direcciones $ambi8n se la llama tabla de nombres o tabla de identi,icadores y tiene dos ,unciones principales • •
",ectuar c5e#ueos semánticos. Generación de códi+o.
Permanece sólo en tiempo de compilación- no de e(ecución- excepto en a#uellos casos en #ue se compila con opciones de depuración. ;a tabla almacena la in,ormación #ue en cada momento se necesita sobre las ariables del pro+ramain,ormación tal como nombre- tipo- dirección de localización- tamaMo- etc. ;a +estión de la tabla de s&mbolos es muy importante- ya #ue consume +ran parte del tiempo de compilación. =e a5& #ue su e,iciencia sea cr&tica. Aun#ue tambi8n sire para +uardar in,ormación re,erente a los tipos creados por el usuario- tipos enumerados y- en +eneral- a cual#uier identi,icador creado por el usuario- nos amos a centrar principalmente en las ariables de usuario. Respecto a cada una de ellas podemos +uardar Almacenamiento del nombre. Se puede 5acer con o sin l&mite. Si lo 5acemos con l&mite- emplearemos una lon+itud ,i(a para cada ariable- lo cual aumenta la elocidad de creación- pero limita la lon+itud en unos casos- y desperdicia espacio en la mayor&a. Etro m8todo es 5abilitar la memoria #ue necesitemos en cada caso para +uardar el nombre. "n C esto es ,ácil con los c5ar Q. Si 5acemos el compilador en 'E=?;A2- por e(emplo- 5abr&a #ue usar el tipo A==R"SS. =irección de memoria en #ue se +uardará
•
•
"sta dirección es necesaria- por#ue las instrucciones #ue re,erencian a una ariable deben saber dónde encontrar el alor de esa ariable en tiempo de e(ecución- tambi8n cuando se trata de ariables +lobales. "n len+ua(es #ue no permiten recursiidad- las direcciones se an asi+nando secuencialmente a medida #ue se 5acen las declaraciones. "n len+ua(es con estructuras de blo#ues- la dirección se da con respecto al comienzo del blo#ue de datos de ese blo#ue- 9,unción o procedimiento: en concreto. "l n0mero de dimensiones de una ariable array- o el de parámetros de una ,unción o procedimiento (unto con el tipo de cada uno de ellos es 0til para el c5e#ueo semántico. Aun#ue esta in,ormación puede extraerse de la estructura de tipos- para un control más e,iciente- se puede indicar expl&citamente.
onsideraciones sobre la (abla de Smbolos.
;a tabla de s&mbolos puede iniciarse con cierta in,ormación 0til- tal como • • •
Constantes PI- "- etc.
palabra reserada deuele un to@en asociado. ]ien estructurado puede ser una alternatia más e,iciente al lex tal y como lo 5emos isto 95as5 per,ecto:. Con,orme an apareciendo nueas declaraciones de identi,icadores- el analizador l8xico- o el analizador sintáctico se+0n la estrate+ia #ue si+amosinsertará nueas entradas en la tabla de s&mbolos- eitando siempre la existencia de entradas repetidas. "l analizador semántico e,ect0a las comprobaciones sensibles al contexto +racias a la tabla de s&mbolos- y el +enerador de códi+o intermedio usa las direcciones de memoria asociadas a cada identi,icador en la tabla de s&mbolosal i+ual #ue el +enerador de códi+o. "l optimizador de códi+o no necesita 5acer uso de ella.
;a tabla de s&mbolos contiene in,ormación 0til para poder compilar- por tanto existe en tiempo de compilación- y no de e(ecución. Sin embar+o- en un int8rprete- dado #ue la compilación y e(ecución se producen a la ez- la tabla de s&mbolos permanece todo el tiempo. Suponemos #ue #ueremos 5acer las si+uientes operaciones aQ3 b3Qa "n la se+unda instrucción necesitamos saber cuánto ale 6a4 es decir el alor de 6a debe estar +uardado en al+0n sitio. Para ello utilizaremos una lista de pares
=e ,orma #ue cuando nos encontremos con la instrucción a Q 3- miremos en la tabla- si no está 6a en la tabla- creamos un nodo para introducirla
A continuación nos encontramos con b 3 Q a. >u8 es 6af ]usco en la tabla de s&mbolos y emos #ue el alor de 6a es 2!. b 3 Q a A5ora buscamos b en la tabla de s&mbolos y como no está lo creamos.
Si e(ecutáramos a5ora la instrucción a a H b $endr&amos a 6a y 6b en la tabla de s&mbolos con lo cual solo tendr&amos #ue modi,icar el alor de 6a.
;a tabla de s&mbolos consta de una estructura llamada s&mbolo. ;as operaciones #ue puede realizar son • •
•
•
crear Crea una tabla ac&a. insertar Parte de una tabla de s&mbolo y de un nodo- lo #ue 5ace es aMadir ese nodo a la cabeza de la tabla. buscar ]usca el nodo #ue contiene el nombre #ue le paso por parámetro. imprimir =euele una lista con los alores #ue tiene los identi,icadores de usuario- es decir recorre la tabla de s&mbolos. "ste procedimiento no es necesario pero se aMade por claridad- y a e,ectos de resumen y depuración.
Mane"o de errores semánticos.
?n error semántico se produce cuando la sintaxis del códi+o es correcta- pero la semántica o si+ni,icado no es el #ue se pretend&a. ;a construcción obedece las re+las del len+ua(e- y por ello el compilador o int8rprete no detectan los errores semánticos. ;os compiladores e int8rpretes sólo se ocupan de la estructura del códi+o #ue se escribe- y no de su si+ni,icado. ?n error semántico puede 5acer #ue el pro+rama termine de ,orma anormal- con o sin un mensa(e de error. *ablando en t8rminos colo#uiales- puede 5acer #ue el e#uipo se #uede gcol+adog.
(ratamiento errores semánticos
?n len+ua(e con comprobación ,uerte de tipos es capaz de +arantizar #ue los pro+ramas se pueden e(ecutar sin errores de tipo- por lo #ue los errores de tipo se detectarán siempre en tiempo de compilación. Como m&nimo- ante un error- un comprobador de tipos debe in,ormar de la naturaleza y posición del error y recuperarse para continuar con la comprobación del resto del pro+rama a analizar. Deamos al+unas de las operaciones a tener en cuenta en una comprobación de tipos •
•
•
•
Conersión de tipos A eces es necesario trans,ormar el tipo de una expresión para utilizar correctamente un operador o para pasar de ,orma adecuada un parámetro a una ,unción. Coerción "s una conersión de tipos #ue realiza de ,orma impl&cita el propio compilador. Si es el pro+ramador el #ue realiza la conersión se tratará entonces de una conersión expl&cita. Sobrecar+a de operadores ;a sobrecar+a se resuele determinando el tipo de cada una de las expresiones interinientes en la sobrecar+a.
"speci,icación de un comprobador de tipos básico ]ásicamente se deberán realizar dos tareas a: Asi+nación de tipos en las declaraciones. b: "aluación y comprobación de tipos "n las expresiones y en las ,uncionesas& como en las sentencias. Etras comprobaciones semánticas y recuperación de errores semánticos
=entro de las comprobaciones estáticas 9en el momento de la compilación:tenemos la detección e in,ormación de errores como •
•
•
Comprobaciones de tipos operadores aplicados a operandos incompatibles- asi+nación de tipos incompatibles- llamadas a ,unciones con tipos no adecuados- etc. Comprobaciones de ,lu(o de control las sentencias #ue 5acen #ue el ,lu(o de control abandone una construcción debe tener al+ 7un lu+ar a donde transmitir el control. Por e(emplo ?nbrea@ debe estar dentro de una proposición K5ile- ,or o sKitc5 en C. Comprobaciones de unicidad situaciones en las #ue solo se puede de,inir un ob(eto una ez exactamente. Por e(emplo ?n identi,icador- las eti#uetas case dentro de un sKitc5.
onclusiones "l analizador semántico tiene dos ob(etios Z *acer comprobaciones #ue no se 5a+an durante el análisis l8xico o sintáctico. Z Crear una representación adecuada para ,ases posteriores. Implementaremos el análisis semántico en dos partes Z 'ediante es#uemas de traducción diri+idos por la sintaxis. Z Recorriendo el AS$. ?n es#uema de traducción diri+ido por la sintaxis aMade a las +ramáticas Z Acciones intercaladas en las partes derec5as de las re+las. Z Atributos asociados a los no terminales. =os tipos de atributos 5eredados y sintetizados. ;as acciones deben +arantizar #ue se eal0an correctamente los atributos. Se pueden implementar los es#uemas de traducción sobre los analizadores sintácticos interpretando los atributos como parámetros y aMadiendo el códi+o de las acciones al códi+o del analizador. "l cálculo de al+unos atributos y al+unas comprobaciones semánticas son más ,áciles sobre el AS$
,iblio$rafa 5ttpFFdi))2.ed.unioi.esFhortinFpublicationsFsemantico.pd, 5ttpFFKKK.+iaa.in,.uc3m.esFdocenciaFI$IGFSemantico.pd, 5ttpFFKKK.+ramaticas.netF2)!2F)%Fe(emplosdeanalisissemantico.5tml 5ttpFFarantxa.ii.uam.esFhal,onsecFdocsFcompila%.5tm