INSTITUTO NACIONAL DE MÉXICO INSTITUTO TECNOLÓGICO DE ACAPULCO “Educación Tecnológica con Compromiso Social” Carrera: Ingeniería en Sistemas Computacionales Asignatura: Lenguajes y Autómatas II Actividades de Aprendiaje !nidad "# Analiador Sem$ntico C%&'ETE(CIA ES'ECI)ICA *ise+a mediante el uso de reglas sem$nticas dirigidas por sinta,is- un analiador sem$ntico para un compilador# 'ro.esor: Silvestre /edolla Solano Integrantes e0uipo 1 •
(om2re (3mero de control Solano 4u$re 4es3s /randon *e la Cru loano Edgar &ois5s 6ern$nde /arrera Arturo %rlando .lores olea 4es3s &argarito *ía Car2ajal Al2erto
Acapulco 7uerrero- 8 *e septiem2re 89"#
ÍNDICE 1
Introducción……………………………………………………………………….…….3 Actiid!d " D#t#ct!r #rror#$ $#%&ntico$…………………………………….…..' Actiid!d ( Di$#)!r * $#+#ccion!r in,or%!ción $o-r# +! con$trucción d# un !n!+i!dor $#%&ntico……………………..…………………………………………"/ Actiid!d 3 0#conoc#r #+ %!n#1o d# ti2o$ #n +!$ #2r#$ion#$ * #+ u$o d# o2#r!dor#$. ...................................................................................................…"3 Actiid!d 4 E$t!-+#c#r +!$ r#5+!$ 2!r! +! con #r$ión d# ti2o$ 6c!$tin57 #n #2r#$ion#$. ……………………………………………………………………..…"8 Actiid!d 9 A5r#5!r !ccion#$ $#%&ntic!$ ! +! #$tructur! d# +! 5r!%&tic!. ………………………………………………………………………..……………….(9 Actiid!d : M!ni2u+!r +! t!-+! d# con #r$ión d# $;%-o+o$ * d# #rror#$ * dir#ccion#$. ……………………………………………………………………..…(: Actiid!d ' Int#5r!r #
INT0ODUCCIÓN Antes de comenar es necesario conocer algunos conceptos para poder entender mejor el desarrollo del tema y se enlistan a continuación:
S#%&ntic!: Conjunto de reglas 0ue especi.ican el signi.icado de cual0uier sentencia sint$cticamente correcta y escrita en un determinado lenguaje#
2
An&+i$i$: E,amen detallado de una cosa para conocer sus características o cualidades- o su estado- y e,traer conclusiones- 0ue se realia separando o considerando por separado las partes 0ue la constituyen#
La .ase de an$lisis sem$ntico revisa el programa .uente para tratar de encontrar errores sem$nticos y re3ne la in.ormación so2re los tipos para la .ase posterior de generación de código# En ella se utilia la estructura jer$r0uica determinada por la .ase de an$lisis sint$ctico para identi.icar los operadores y operandos de e,presiones y proposiciones# !n componenteveri.ica importante del an$lisis sem$ntico la veri.icación de tipos# el compilador si cada operador tiene es operandos permitidos porA0uíla especi.icación del lenguaje .uente# 'or ejemplo- las de.iniciones de muc;os lenguajes de programación re0uieren 0ue el compilador indi0ue un error cada ve 0ue se use un n3mero real como índice de una matri# Sin em2argo- la especi.icación del lenguaje puede imponer restricciones a los operandos- por ejemplo- cuando un operador aritm5tico 2inario se aplica a un n3mero entero y a un n3mero real#
gram$tica de atri2utos# En compiladores de dos o m$s pasos- el an$lisis sem$ntico se realia independientemente de la generación de código- pas$ndose in.ormación a trav5s de un arc;ivo intermedio- 0ue normalmente contiene in.ormación so2re el $r2ol sint$ctico en .orma linealiada =para .acilitar su manejo y ;acer posi2le su almacenamiento en memoria au,iliar># En cual0uier caso- las rutinas sem$nticas suelen ;acer uso de una pila =la pila sem$ntica> 0ue contiene la in.ormación sem$ntica asociada a los operandos =y a veces a los operadores> en .orma de registros sem$nticos# E,isten dos .ormas de descri2ir la sem$ntica de un lenguaje de programación:
%#di!nt# #$2#ci,ic!ción in,or%!+ o n!tur!+ * ,or%!+. La descripción in.ormal de un lenguaje de programación es llevada a ca2o mediante el lenguaje natural# Esto ;ace 0ue la especi.icación sea inteligi2le =en principio> para cual0uier persona# La e,periencia nos dice 0ue es una tarea muy compleja- si no imposi2le- el descri2ir todas las características de un lenguaje de programación de un modo preciso# La descripción .ormal de la sem$ntica de lenguajes de programación es la descripción rigurosa del signi.icado o comportamiento de programas- lenguajes de programación- m$0uinas a2stractas o incluso cual0uier dispositivo ;ard?are#
•
•
•
•
•
4
•
Estandariar lenguajes mediante la pu2licación de su sem$ntica de un modo no am2iguo# Los programas de2en poder procesarse en otra implementación de procesador del mismo lenguaje e,;i2iendo el mismo comportamiento#
>E0I?ICACION DE TIPOS DE EXP0ESIONES •
•
)ormado por las de.iniciones y reglas 0ue permiten compro2ar el dominio de un identi.icador- y en 0u5 conte,tos puede ser usado# Cada tiene un sistema de tipos propio- aun0ue puede variar de una a lenguaje otra implementación#
•
La compro2ación de tipos es parte del an$lisis sem$ntico#
•
)unciones 'rincipales:
•
•
•
Todo$ +o$ +#n5u!1#$ 2#r%it#n cr#!r nu#o$ ti2o$ co%2+#1o$ ! 2!rtir d# otro$ %&$ $i%2+#$ %#di!nt# con$tructor#$ d# ti2o$@ •
&atrices- productos- registros- punteros- .unciones- B
•
En 'ascal: array- set- record-###
•
En C: struct- class- union-####
'ara analiar los di.erentes tipos 0ue intervienen dentro de un programa- el compilador de2e contar con una estructura interna 0ue le permita manejar cómodamente las e,presiones de tipos#
E$t! #$tructur! int#rn!@
5
•
•
•
•
*e2e ser .$cilmente manipula2le- pues su creación se realiar$ con.orme se ;ace la lectura del programa .uente# *e2e permitir comparar .$cilmente las e,presiones asignadas a distintos troos de código- especialmente a los identi.icadores de varia2les# La .orma m$s ;a2itual de representación son los gra.os a cíclicos dirigidos =7A*s># La ventaja de estas representaciones es 0ue ocupan poca memoria y por tanto la compro2ación de e0uivalencia se e.ect3a con rapide#
6
ACTI>IDAD ". DE0ECTA0 E00O0ES SEMNTICOS 0ECUPE0ACION DE E00O0ES !n sistema de tipos seguro elimina la necesidad de compro2ar din$micamente errores de tipos ya 0ue permite determinar est$ticamente 0ue dic;os errores no pueden ocurrir cuando se est$ ejecutando el programa o2jeto# Se dice 0ue un lenguaje es .uertemente tipi.icado si su compilador puede garantiar 0ue los programas 0ue acepte se ejecutar$n sin errores de tipo#
MANEBO DE E00O0ES Es una de las misiones m$s importantes del compilador# Se utilia m$s en el an$lisis- pero los errores pueden darse en cual0uier .ase# El manejo de errores es una tarea di.ícil por dos motivos: •
•
A veces algunos errores ocultan otros# !n error puede provocar una avalanc;a de errores 0ue se solucionan con el primero#
C0ITE0IOS A SEGUI0 PA0A EL MANEBO DE E00O0ES •
•
'ararse al detectar el primer error =conveniente para un compilador interactivo># *etectar todos los errores de una pasada =conveniente para un compilador de línea>#
CAPTU0AS DE T0ES EBEMPLOS@ !n arc;ivo de te,to con %peraciones Aritm5ticas#
7
Al momento de ingresar un arc;ivo#t,t- en analiador sem$ntico se encarga de realiar un an$lisis para poder identi.icar el contento del arc;ivo- muestra en la pantalla una ventana especi.icando 0ue tipo de toDen es#
EBEMPLO (@ U$o d# >!ri!-+#$ 6Int $trin57
!na ve identi.icado el toDen- en la parte derec;a se crea una ta2la de sím2olos ordenando el tipo de dato 0ue contiene el arc;ivo de te,to# 8
EBEMPLO 3@ U$o d# condicion#$ 6=oo+7
En dado caso de 0ue el arc;ivo contenga errores- mostrar$ la línea en donde se encuentra el erroreste compilador- tiene como .unciones- a2rir- guardar e incluso modi.icar# Se agregan propiedades como cam2iar el color del te,to- tama+o de la ventana como tam2i5n una opción de Ayuda#
9
ACTI>IDAD (. DISEA0 SELECCIONA0 IN?O0MACION CONST0UCCION DE UN ANALIFADO0 SEMANTICO.
SO=0E
LA
Los $r2oles de e,presiones representan el código de nivel del lenguaje en .orma de datos# Los datos se almacenan en una estructura con .orma de $r2ol# Cada nodo del $r2ol de e,presión representa una e,presión- por ejemplo- una llamada al m5todo o una operación 2inaria- como , y#
Un &r-o+ d# #2r#$ión $ir# 2!r! #!+u!r #2r#$ion#$ d#+ ti2o@ =a 2>FcGd 'ara 0ue un $r2ol represente una e,presi ón se de2en tomar en cuenta 8 características muy importantes: •
Cual0uier ;oja est$ eti0uetada sólo con un operando#
•
Cual0uier nodo interior n est$ eti0uetada por un operador#
A+ introducir +! #2r#$ión d#-#%o$ d# to%!r #n cu#nt! +!$ $i5ui#nt#$ c!r!ct#r;$tic!$@ •
La raí siempre de2e ser un operador
•
Las ;ojas siempre de2en ser operandos
•
•
•
Los nodos de2en estar eti0uetados por operadores prioridad 0ue la raí se coloca como ;ijo#
•
Si un operador tiene mayor
Si un operador tiene igual o menor prioridad 0ue un nodo se coloca como padre# !n nodo puede contener como ;ijo otro su2$r2ol 0ue contiene una pe0ue+a e,presión#
En los $r2oles de e,presión- la sucesión del preorden de eti0uetas nos da lo 0ue se conoce como la .orma pre.ijo de una e,presión An$logamente- la sucesión postorden de las eti0uetas de un $r2ol e,presión nos da lo 0ue se conoce como la representación post.ijo de una e,presión )inalmente- el orden de una e,presión en un $r2ol de e,presión nos da la e,presión in.ijo en sí misma- pero sin par5ntesis Construcción de un $r2ol de e,presión Algoritmo:
10
•
&ientras car$cter di.erente de nulo
•
Leer car$cter de la lista
•
Si es par5ntesis pasar al siguiente car$cter
•
Crear un nodo nuevo 0ue contenga ese car$cter %perando
•
•
•
•
Si el $r2ol est$ vacío ;acer raí a nuevo- si no recorrer el $r2ol por la derec;a ;asta llegar a un nodo con ;ojas- si la ;oja i0uierda- no est$ eti0uetada colocar operando- si no colocarlo en la ;oja derec;a# %perador Si la raí es un operando- insertar nuevo en ese nodo- y convertir el operando en el ;ijo i0uierdo- si no si ;ay un par5ntesis a2ierto insertar nuevo en la 3ltima ;oja derec;a y colocar operando como ;ijo i0uierdo# Si el car$cter anterior es par5ntesis i0uierdo si el siguiente car$cter es par5ntesis derec;o si solo ;ay un operador en el $r2ol nuevo se convierte en raí- si no se inserta en el 3ltimo nodo derec;o- y el nodo se convierte en ;ijo i0uierdo# Si no se cumple ninguna de las condiciones anteriores si la raí es de igual prioridad o menor prioridad convertir la raí en el ;ijo i0# de nuevo si no la prioridad del nodo raí es mayor al de nuevo insertar nuevo como ;ijo derec;o y colocar el nodo reemplaado como ;ijo i0uierdo#
Con$trucción 'ara construir los H $r2oles- de2emos comenar por de.inir 0u5 elementos emplearemos para cada estructura:
11
)íjate 0ue el $r2ol resultante puede representar programas en diversos lenguajes de programación del estilo C- 'ascal- etc# A;ora de2emos utiliar los atri2utos para construir el $r2ol# !tiliando el atri2uto ar2 para devolver el $r2ol 0ue construye cada no terminal- podemos ;acer algo parecido a:
'ara la implementación ;ay dos opciones principales: •
•
!tiliar .unciones =(odoSi- (odo&ientras-# # #> 0ue devuelvan una estructura de datos adecuada# !tiliar o2jetos =(odoSi- (odo&ientras-# # #> para cada uno de los nodos#
'ro2a2lemente- la segunda opción sea la m$s cómoda para el tra2ajo posterior con el $r2ol# En cuanto a la lista de sentencias- podemos utiliar nodos 0ue tengan un grado varia2le- para eso almacenamos una lista con los ;ijos:
12
EBEMPLOS using System; using System.Collections.Generic; using System.Linq; using System.e!t; using System."re#$ing.#s%s; using System.e!t.&egul#r'!(ressions; n#mes(#ce c#$en#)e!(resion * cl#ss +rogr#m * st#tic ,oi$ -#instring/ #rgs * #n#li#ic"ero; st#tic (ulic ,oi$ #n#li#ic"ero * string/ C#$en#s *(l#st#r:#r#g#n'nc#rg#$oSeleccion; string se!(resion; Console.rite'scriir e!(resion< ; se!(resion Console.&e#$Line; =ore#c" string s in C#$en#s
13
* >>System.Console.rite*024 s; i= &ege!.?s-#tc"s se!(resion * System.Console.riteLine'!iste coinci$enci# @*0@ en< @*1@ se!(resion s; else * System.Console.riteLineAo e!iste coinci$enci# @*0@ en< @*1@ se!(resion s;
Console.&e#$Line;
E1#%2+o "@
En este primer ejemplo- se toman J pala2ras en las cuales mediante un reconocimiento- el programa indica si la vocal “a” se encuentra en las cadenas prede.inidas- de no e,iste coincidencia como en el caso de la cuarta cadena- se nos indicara 0ue no e,iste coincidencia de dic;a e,presión en la cadena#
E1#%2+o (@
14
En este caso la e,presión no o2tuvo coincidencia en ninguna de las cadenas#
E1#%2+o 3:
En este caso la e,presión o .ue ;allada en dos de tres cadenas# ACTI>IDAD 3@ 0ECONOCE0 EL MANEBO DE TIPO EN LAS EXP0ESIONES EL USO DE OPE0ADO0ES !na e,presión es una com2inación de operadores y operandos de cuya evaluación se o2tiene un valor# Los operandos pueden ser nom2res 0ue denoten o2jetos varia2les o constantes- .unciones- literales de cual0uier tipo adecuado de acuerdo con los operadores u otras e,presiones m$s simples# La evaluación de una e,presión da lugar a un valor de alg3n tipo- una e,presió n se dice 0ue es del tipo de su resultado# E,presiones !na e,presión es una instrucción o sentencia 0ue devuelve un valor llamado valor de retorno y 0ue asigna a una varia2le un •
*ato num5rico
•
alor lógico
•
Car$cter 15
•
Cadena de caracteres o dato te,tual
E1#%2+o "@
E1#%2+o (@
%peradores !n operador 2#r%it# r#+!cion!r do$ d!to$ en una e,presión * #!+u!r #+ r#$u+t!do d# un! o2#r!ción#
Ti2o$@ •
•
Arit%tico$ D# !$i5n!ción
•
D# co%2!r!ción
•
Ló5ico$
A0ITMÉTICOS M!ni2u+!n d!to$ nu%rico$# Son los siguientes: •
Suma
•
•
'roducto F
•
•
*ivisión G
16
•
Incremento unitario
•
*ecremento unitario K
•
Incremento de cien en cien M"99
•
*ecremento de cien en cien KM"99
E1#%2+o "@ muestra por consola una serie de resultados asociados a c$lculos sencillos realiados con los operadores aritm5ticos#
DE ASIGNACIÓN Tr!n$,i#r#n d!to$ d# un! !ri!-+# ! otr!. Son los siguientes: •
H*
,M,y
•
J*
,M,Ky
K*
,M,Fy
•
*
,M,Gy
•
*
,M,y Es el módulo o resto de una división
•
E1#%2+o "@
alor de : N
17
DE COMPA0ACIÓN Co%2!r!n do$ d!to$ * d#u#+#n un !+or -oo+#!no. Son los siguientes: •
igual =no con.undir con el M de asignación>
•
distinto
•
mayor 0ue
•
menor 0ue
•
mayor o igual 0ue
•
menor o igual 0ue
E1#%2+o@
alor de : true
LÓGICOS Conc!t#n!n #2r#$ion#$ +ó5ic!$ con o2jeto de evaluar si es cierto o .also el conjunto de las e,presiones# Son los siguientes: •
•
•
QQ 6 +ó5ico7@ si todas las e,presiones lógicas 0ue se eval3an son verdaderas se devuelve un valor 2ooleano trueO si alguna es .alsa- devuelve .alse# RR 6O +ó5ico7@ si alguna de las e,presiones lógicas 0ue se eval3a es verdadera- se devuelve un valor 2ooleano trueO si todas son .alsas- devuelve .alse# 6NOT7@ invierte el valor de una e,presión 2ooleana#
E1#%2+o "@
18
alor de : true
E4E&'L% ": muestras las operaciones 0ue se ejecutan como los operadores aritm5ticos y ejecuta la operación
E4E&'L% 8: Eval3a la e,presión identi.ica cada uno de los operadores de la e,presión y veri.ica 0ue no tenga errores#
19
E4E&'L% H: eBecut# l#s o(er#ciones $e #cuer$o # los ,#lores que tiene l#s ,#ri#les $ecl#r#$#s y muestr# los result#$os
ACTI>IDAD 4. ESTA=LECE0 L AS 0EGLAS PA0A LA CON>E0SIÓN DE TIPOS 6CASTING7 EN EXP0ESIONES.
20
Pui$s te ;ayas preguntado 0u5 pasa cuando escri2imos e,presiones num5ricas en las 0ue no todos los operandos son del mismo tipo# 'or ejemplo: c;ar nO int a- 2- c- dO .loat r- s- tO ### a M "9O 2 M "99O r M "999O c M a 2O s M r aO d M r 2O d M n a rO tMras cO ### En estos casos- cuando los operandos de cada operación 2inari a asociados a un operador son de distinto tipo- el compilador los convierte a un tipo com3n# E,isten reglas 0ue rigen estas conversiones- y aun0ue pueden cam2iar ligeramente de un compilador a otro- en general ser$n m$s o menos así: Cual0uier tipo entero pe0ue+o como c;ar o s;ort es convertido a int o unsigned int# En este punto cual0uier pareja de operandos ser$ int =con o sin signo>- longlong long- dou2le- .loat o long dou2le# Si un operando es de tipo long dou2le- el otro se convertir$ a long dou2le# Si un operando es de tipo dou2le- el otro se convertir$ a dou2le# Si un operando es de tipo .loat- el otro se convertir$ a .loat# Si un operando es de tipo unsigned long long- el otro se convertir$ a unsigned long long# Si un operando es de tipo long long- el otro se convertir$ a long long# 21
Si un operando es de tipo unsigned long- el otro se convertir$ a unsigned long# Si un operando es de tipo long- el otro se convertir$ a long# Si un operando es de tipo unsigned int- el otro se convertir$ a unsigned int# Llegados a este punto am2os operandos son int# eamos a;ora el ejemplo: c M a 2O caso "9- am2as son int# s M r aO caso J- a se convierte a .loat# d M r 2O caso J- 2 se convierte a .loat# d M n a rO caso "- n se convierte a int- la operación resultante corresponde al caso J- el resultado =na> se convierte a .loat# t M r a s cO caso J- a se convierte a .loat- caso J =ra> y s son .loat- caso J- c se convierte a .loat# Tam2i5n se aplica conversión de tipos en las asignaciones- cuando la varia2le receptora es de distinto tipo 0ue el resultado de la e,presión de la derec;a# En el caso de las asignaciones- cuando la conversión no implica p5rdida de precisión- se aplican las mismas reglas 0ue para los operandos- estas conversiones se conocen tam2i5n como promoción de tipos# Cuando ;ay p5rdida de precisión- las conversiones se conocen como democión de tipos# El compilador normalmente emite un aviso o ?arning- cuando se ;ace una democión implícitaes decir cuando ;ay una democión autom$tica# En el caso de los ejemplos H y J- es eso precisamente lo 0ue ocurre- ya 0ue estamos asignando e,presiones de tipo .loat a varia2les de tipo int# Conversiones a 2ool Q En C podemos ;a2lar de otro tipo de conversión de tipo implícita- 0ue se realia cuando se usa cual0uier e,presión entera en una condición- y m$s generalmentecuando se usa cual0uier e,presión donde se espera una e,presión 2ooleana# El dominio del tipo 2ool es muy limitado- ya 0ue sólo puede tomar dos valores: true y .alse# 'or convenio se considera 0ue el valor cero es .alse- y cual0uier otro valor entero es true# 22
'or lo tanto- ;ay una conversión implícita entre cual0uier entero y el tipo 2ool- y si a+adimos esta regla a las e,plicadas antes- cual0uier valor dou2le- long dou2le.loat o cual0uiera de los enteros- incluso c;ar- se puede convertir a 2ool# Esto nos permite usar condiciones a2reviadas en sentencias i.- .or- ?;ile o do##?;ilecuando el valor a comparar es cero# 'or ejemplo- las siguientes e,presiones 2ooleanas son e0uivalentes: 9 MM , e0uivale a R,# 9 RM , e0uivale a ,# En el primer caso- usamos el operador MM para comparar el valor de , con ceropero al aplicar el operador R directamente a , o2ligamos al compilador a reinterpretar su valor como un 2ool- de modo 0ue si , vale 9 el valor es .alse- y R .alse es true# *e .orma sim5trica- si , es distinto de cero- se interpretar$ como true- y Rtrue es .alse# El resultado es el mismo 0ue usando la e,presión 9 MM ,# En el segundo caso pasa algo an$logo# A;ora usamos el operador RM para comparar el valor de , tam2i5n con cero- pero a;ora interpretamos directamente , como 2ool- de modo 0ue si , vale 9 el valor es .alse- y si , es distinto de cero- se interpretar$ como true# El resultado es el mismo 0ue usando la e,presión 9 RM ,# (o est$ claro cu$l de las dos opciones es m$s e.ica- a la ;ora de compilar el programa# 'ro2a2lemente- la segunda re0uiera menos instrucciones del procesador- ya 0ue e,isten instrucciones de ensam2lador especí.icas para comparar un entero con cero# *el otro modo estaremos comparando con un valor literal- y salvo 0ue el compilador optimice este código- generalmente se re0uerir$n m$s instrucciones de este modo# A+adir 0ue los ejemplos anteriores .uncionan- aun0ue el tipo de , no sea un entero# Si se trata de un valor en coma .lotante se realiar$ una conversión implícita a entero antes de evaluar la e,presión# Casting: conversiones e,plícitas de tipo Q 'ara eludir estos avisos del compilador se usa el casting- o conversión e,plícita# (ota: de nuevo nos encontramos ante un t5rmino 0ue suele aparecer en ingl5s en los documentos# Se podría traducir como amoldar o moldear- pero no se ;ace#
23
Tam2i5n es un t5rmino 0ue se usa en cine y teatro- y se aplica al proceso de asignar papeles a los actores# La idea es an$loga- en el caso de las varia2les- asignamos papeles a los valoresseg3n sus características# 'or ejemplo- para convertir el valor en coma .lotante "J#8H8 a entero se usa el valor "J- podríamos decir 0ue "J est$ ;aciendo el papel de "J#8H8 en la representación# % 0ue se ajusta a un molde o tro0uel: lo 0ue so2ra se elimina# En general- el uso de casting es o2ligatorio cuando se ;acen asignaciones- o cuando se pasan argumentos a .unciones con p5rdida de precisión# En el caso de los argumentos pasados a .unciones es tam2i5n muy recomenda2le- aun0ue no ;aya p5rdida de precisión# Eliminar los avisos del compilador demost rar$ 0ue sa2emos lo 0ue ;acemos con nuestras varia2les- aun cuando estemos ;aciendo conversiones de tipo e,tra+as# En C ;ay varios tipos di.erentes de casting- pero de momento veremos sólo el 0ue e,iste tam2i5n en C# !n casting tiene una de las siguientes sinta,is: =nom2re de tipo>e,presión nom2re de tipo=e,presión> Esta 3ltima es conocida como notación .uncional- ya 0ue tiene la .orma de una llamada a .unción# En el ejemplo anterior- las líneas H y J 0uedarían: d M =int>=r 2>O d M =int>=n a r>O % 2ien: d M int=r 2>O d M int=n a r>O 6acer un casting indica 0ue sa2emos 0ue el resultado de estas operaciones no es un int- 0ue la varia2le receptora sí lo es- y 0ue lo 0ue ;acemos lo estamos ;aciendo a propósito# E1#%2+o "@ Ta2laKCells9U9UMVToDenVO 24
Ta2laKCells"U9UMVTipoVO Ta2laToDensKCells9U9UMVToDensVO )ILE FTa2la"- FTa2la8O int iM"O int jM"O Ta2la"M.open=Vc:GAnalisis#T,tV- VrV>O .read=Wle,"-sieo.=le,">-"-Ta2la">O ?;ile =R.eo.=Ta2la">> X Ta2laKCells9UiUMle,"#toDenO Ta2laKCells"UiUMle,"#tipoO .read=Wle,"-sieo.=le,">-"-Ta2la">O .close=Ta2la">O Ta2la8M.open=Vc:GToDens#T,tV- VrV>O .read=WtoDen8-sieo.=toDen8>-"-Ta2la8>O ?;ile =R.eo.=Ta2la8>> X Ta2laToDensKCells9UjUMtoDen8#toDensO .read=WtoDen8-sieo.=toDen8>-"-Ta2la8>O
25
En el ejemplo de nuestra captura se o2serva como se ;ace la conversión de e,presiones de tipo num5ricas indicando cado uno de los sím2olos y e,presiones introducidas mediante un an$lisis sint$ctico este programa .ue desarrollado en el lenguaje de programación C#
E1#%2+o (@ Console.riteLine Console.riteLine AL?DE& D' FA '+&'S?EA L'?CHS?AC?C Console.riteLine Console.riteLine?ngrese un# e!(resion #ritmItic# lJgic# rel#cion#l o e!(onenci#l. Console.riteLine Console.rite?ngrese l# e!(resiJn < Console.rite Dim myString s String Console.&e#$Line Console.riteLine Dim myC"#r s String Dim estLens ?nteger LenmyString Dim e!(estLen s String Dim i s ?nteger Dim K s ?nteger Console.riteLineAL?DE& L'?CE< @F? AES :C' &''&'AC? LES C&C'&'S &'CEAEC?DES@ Console.riteLine CE-+EA'A'S L'?CES &'CEAEC?DES< Console.rite or i 0 o estLen H 1 myC"#r myString.C"#rsi ?= myC"#r M Er myC"#r H Er myC"#r > Er myC"#r N Er myC"#r Er myC"#r O "en
26
e!(i o( Console.riteP Q e!(i Q Q myC"#r Q R 'lse?= myC"#r # Er myC"#r Er myC"#r c Er myC"#r $ Er myC"#r e Er myC"#r = Er myC"#r g Er myC"#r " Er myC"#r i Er myC"#r B Er myC"#r % Er myC"#r l "en e!(i e!( Console.riteP Q e!(i Q Q myC"#r Q R 'lse?= myC"#r 1 Er myC"#r 2 Er myC"#r 3 Er myC"#r 4 Er myC"#r 5 Er myC"#r 6 Er myC"#r 7 Er myC"#r 8 Er myC"#r 9 "en e!(i num Console.riteP Q e!(i Q Q myC"#r Q R 'lse?= myC"#r "en e!(iConsole.riteP (#r)$ Q e!(i Q Q myC"#r Q R 'lse?= myC"#r "en e!(i (#r)i Console.riteP Q e!(i Q Q myC"#r Q R 'lse Console.riteLinemyC"#r Q 'n$ ?= Ae!t Console.riteLine Dim s ?nteger K0 1
CE-+EA'A' L'?CE AE &'CEAEC?DE
En el ejemplo de nuestra captura se o2serva como se ;ace la conversión de e,presiones de tipo num5ricas indicando cado uno de los sím2olos y e,presiones introducidas mediante un an$lisis sint$ctico adem$s muestra si la e,presión introducida contiene errores sem$nticos y si son o no reconocidos este programa es desarrollado en el lenguaje de programación cY# E1#%2+o 3@ private void j/utton"Action'er.ormed=java#a?t#event#ActionEvent evt> X 27
oAnaLe,#Inicia=>O oAnaLe,#Analia=jTe,tArea"#getTe,t=>>O modeloMne? &odelo*eTa2la=oAnaLe,#ToDens=>-oAnaLe,#Le,emas=>>O jTa2le"#set&odel=modelo>O private void j/utton8Action'er.ormed=java#a?t#event#ActionEvent evt> X jTe,tArea"#setTe,t=VV>O pu2lic static void main=String argsU> X java#a?t#EventPueue#invoDeLater=ne?
X Z%verride pu2lic void run=> X ne? AnaLe,=>#setisi2le=true>O >O
28
En el ejemplo de nuestra captura se o2serva como se ;ace la conversión de e,presiones de tipo num5ricas indicando cado uno de los toDens y e,presiones introducidas mediante un an$lisis l5,ico adem$s muestra si la e,presión introducida muestra cada e,presión reconocida este programa es desarrollado en el lenguaje de programación java#
29
ACTI>IDAD 9@ AG0EGA0 ACCIONES SEMANTICAS A LA EST0UCTU0A DE LA G0AMATICA Es la .ase del analiador 0ue se encarga de c;e0uear el te,to de entrada en 2ase a una gram$tica dada# [ en caso de 0ue el programa de entrada sea v$lidosuministra el $r2ol sint$ctico 0ue lo reconoce# La 7ram$tica es el estudio de las reglas y principios 0ue regulan el uso del lenguaje a nivel intraoracional# Tam2i5n se denomina así al conjunto de reglas y principios 0ue go2iernan el uso de un lenguaje determinado- por lo 0ue puede decirse 0ue cada lenguaje tiene su propia gram$tica# En teoría- se supone 0ue la salida del analiador sint$ctico es alguna representación del $r2ol sint$ctico 0ue reconoce la secuencia de ToDen suministrada por el analiador l5,ico# En la pr$ctica- el analiador sint$ctico tam2i5n ;ace: •
• • • •
Acceder a la ta2la de sím2olos =para ;acer parte del tra2ajo del analiador sem$ntico># C;e0ueo de tipos =del analiador sem$ntico># 7enerar código intermedio# 7enerar errores cuando se producen# En de.initiva- realia casi todas las operaciones de la compilación# Este m5todo de tra2ajo da lugar a los m5todos de compilación dirigidos por sinta,is
Sem$ntica de un lenguaje dar sentido a sus construcciones- como los toDens estructura y sinta,is# Sem$ntica ayudan a interpretar los sím2olos- sus tipos y sus relaciones con los dem$s# An$lisis sem$ntico los jueces si la sinta,is estructura construida en el programa de srcen se deriva el signi.icado o no#
int # ,#lueT; (o de2e emitir un error l5,ico y la sinta,is en .ase de an$lisis- ya 0ue es l5,ico y estructuralmente correcto- pero se de2e generar un error sem$ntico como del tipo de asignación es di.erente# Estas normas est$n de.inidas por la gram$tica de la lengua y evaluado en an$lisis sem$ntico# Las siguientes tareas de2en realiarse en an$lisis sem$ntico:
30
•
•
Compro2ación de tipos
•
&atri de control
Errores sem$nticos 6emos mencionado algunos de los errores 0ue la sem$ntica analiador sem$ntico se espera para reconocer: •
(o coinciden los tipos
•
aria2le no declarada
•
Identi.icador reservado uso inde2ido#
•
*eclaración de varia2les m3ltiples en un $m2ito#
•
Acceder a una varia2le .uera de alcance#
•
'ar$metro .ormal y real no coincide#
31
E4E&'L% "
Ilustración 1: Ejemplo 1, código
En la ilustración " se de.ine una varia2le “a” de tipo entero despu5s se le asigna un valor decimal y una cadena por0ue nos muestra error
Ilustración 2: Ejemplo 1 asignación incorrecta
32
E4E&'L% 8
Ilustración 3: Código
En la ilustración a una varia2le “a” se trata de asignar valores y esto da un error por0ue la varia2le no est$ de.ina
Ilustración 4: Muestra que hay un erro de semantica
33
E4E&'L% H
Ilustración !: Ejemplo 2 errores de de"nición
Ilustración : Código
En la ilustración se de.ine una varia2le y se le asigna un tipo de dato di.erente
Ilustración #:El codigo aceptado
34
E4E&'L%S En la ilustración " se de.ine una varia2le “a” de tipo entero despu5s se le asigna un valor decimal y una cadena por0ue nos muestra error
Ilustración $: Ejemplo 1 asignación incorrecta
35
ACTI>IDAD :. MANIPULA0 LA TA=LA DE CON>E0SIÓN DE SÍM=OLOS DE E00O0ES DI0ECCIONES !na ta2la de sím2olos es una estructura de datos 0ue usa el proceso de traducción de un lenguaje de programación- por un compilador o un int5rpretedonde cada sím2olo en el código .uente de un programa est$ asociado con in.ormación tal como la u2icación- el tipo de datos y el $m2ito de cada varia2leconstante o procedimiento# !na implementación com3n de una ta2la de sím2olos puede ser una ta2la ;as;- la cual ser$ mantenida a lo largo de todas las .ases del proceso de compilación de ticses# 'uede tratarse como una estructura transitoria o vol$til- 0ue sea utiliada 3nicamente en el proceso de traducción de un lenguaje de programación- para luego ser descartada- o integrada en la salida del proceso de compilación para una e,plotación posterior- como puede ser- por ejemplo- durante una sesión de depuración- o como recurso para o2tener un in.orme de diagnóstico durante o despu5s la ejecución de un programa# Los sím2olos en la ta2la de sím2olos pueden re.erirse a constantes- a .unciones o a tipos de datos en el código .uente de un programa# La ta2la de sím2olos .orma parte de cada .ic;ero 0ue contiene el código o2jeto durante el enlaado o linDing de los di.erentes .ic;erosO recae en la responsa2ilidad del linDer o enlaador resolver cual0uier re.erencia no resuelta# Los sím2olos se guardan en la ta2la con su nom2re y una serie de atri2utos opcionales 0ue depender$n del lenguaje y de los o2jetivos del procesador- este conjunto de atri2utos almacenados se denomina registro de la ta2la de sím2olos# (om2re del identi.icador# *irección en tiempo de ejecución a partir del cual se almacenar$ el identi.icador si es una varia2le# Tipo del identi.icador# Si es una .unción- el tipo 0ue devuelve la .unción# (3mero de dimensiones del array =arreglo>- o n3mero de miem2ros de una estructura o clase- o n3meros de par$metros si se trata de una .unción# 36
Tama+o m$,imo o rango de cada una de las dimensiones de los array- si tiene dimensión est$tica#
Los errores 0ue puede detectar el analiador sint$ctico son a0uellos 0ue violan las reglas de una gram$tica independiente del conte,to# [a ;emos mencionado 0ue algunas de las características de un lenguaje de programación no pueden enunciarse con reglas independientes del conte,to- ya 0ue dependen de 5lO por ejemplo- la restricción de 0ue los identi.icadores de2en declararse previamente# !n compilador utilia una ta2la de sím2olos para llevar un registro de la in.ormación so2re el $m2ito y el enlace de los nom2res# Se e,amina la ta2la de sím2olos cada ve 0ue se encuentra un nom2re en el te,to .uente# Si se descu2re un nom2re nuevo o nueva in.ormación so2re un nom2re ya e,istente- se producen cam2ios en la ta2la# !n mecanismo de ta2la de sím2olos de2e permitir a+adir entradas nuevas y encontrar las entradas e,istentes e.icientemente# Los dos mecanismos para ta2las de sím2olos presentadas en esta sección son listas lioeal#es y ta2las de dispersión# Cada es0uema se eval3a 2as$ndose en el tiempo necesario para a+adir n entradas y realiar e consultas# !na lista lineal es lo m$s .$cil de implantar- pero su rendimiento es po2re cuando e y n s5 vuelven m$s grandes# Los es0uemas de dispersión proporcionan un mayor rendimiento con un es.uero algo mayor de programación y gasto de espacio# Am2os mecanismos pueden adaptarse r$pidamente para .uncionar con la regla del anidamiento m$s cercano# La entrada misma de la ta2la de sím2olos puede esta2lecerse cuando se aclara el papel de un nom2re y se llenan los valores de los atri2utos cuando se dispone de la in.ormación# En algunos casos- el analiador l5,ico puede iniciar la entrada en cuanto apareca un nom2re en los datos de entrada# A menudo- un nom2re puede indicar varios o2jetos distintos- 0ui$s incluso en el mismo 2lo0ue o procedimiento Los atri2utos de un nom2re se introducen en respuesta a las declaraciones- 0ue pueden ser implícitas# Las eti0uetas son a menudo identi.icadores seguidos de dos puntos- así 0ue una acción asociada con el reconocimiento de dic;o identi.icador puede ser introducir este ;ec;o en la ta2la de sím2olos# Asimismo- la sinta,is de las declaraciones de procedimientos especi.ica 0ue algunos identi.icadores son par$metros .ormales#
37
38
E1#%2+o
U
+#c%#ge #n#li#$or;
UU
im(ort st#tic #n#li#$or.o%en.N;
*:?' *>N?gnoreN>
UU
*return SS?GA;
Ucl#ss Le!er
M *return SF-;
Uty(e o%en
N *return -FL;
L /#HH)
H *return &'S;
D /0H9
> *return D?W;
:?'/ VtVrVn
*L*LX*DN ?D;
U*
*le!emeyyte!t;
H*DMX*DM return ?A;
(ulic String le!eme;
. *return '&&E&;
39
return
*le!emeyyte!t;
E1#%2+o " A0uí nos muestra el ejemplo 0ue ;emos realiado- para sa2er si es correcto le damos en la acción =compilar> y en la parte de a2ajo muestra 0ue se compilo con 5,ito e indica el n3mero de .ilas contadas
E1#%2+o ( [a 0ue compilo con 5,ito mostraremos la ta2la de toDens de dic;o ejemplo
E1#%2+o 3 A continuación- mostraremos un error para indicar si los marca- le 0uitaremos el punto y coma de la línea ] y sale el mensaje de error
ACTI>IDAD '. INTEG0A0 EUIPOS PA0A LA CONST0UCCION DE UN ANALIFADO0 SEMANTICO.
P0OG0AMA: A(ALI^A*%< SE&A(TIC% ELA/%
DISEO DEL ANALIFADO0 SEMANTICO
UTILIZANDO UN ARCHIVO.TXT PARA OBSERVAR EL PROCESO DE DESARROLLO
CÓDIGO FUENTE
-A'KE D' '&&E&'S using System; using System.Collections.Generic; using System.Linq; using System.e!t;
n#mes(#ce -#neBoDe'rrores * (ulic cl#ss ' *
>>#l# errores nYmero $e lZne# error como solucion#rlo (ulic ListP#l#)'rroresR 'rrores ne[ ListP#l#)'rroresR; (ulic ListP#l#)'rroresR 'rrorese$ ne[ ListP#l#)'rroresR; (ulic ListP#l#)'rroresR #l#'rrores * get * return 'rrores; set * 'rrores ,#lue; (ulic ,oi$ reinici#list# * 'rrores.Cle#r; 'rrorese$.Cle#r; (ulic ,oi$ inici#lest#'*
#l#)'rrores te ne[ #l#)'rrores0 ,#lor incorrecto escri# el ,#lor #ce(t#$o (or el ti(o $e ,#ri#le ,#lor $i=erente #l #ce(t#$o (or el ti(o; 'rrores.$$te;
#l#)'rrores te1 ne[ #l#)'rrores1 se es(er# un ,#lor escri# un ,#lor (#r# l# ,#ri#le se es(er# un ,#lor $es(ues $e...; 'rrores.$$te1;
#l#)'rrores te2 ne[ #l#)'rrores2 error #l #rir re,ise l# e!tencion $el #rc"i,o o l# $ireccion $el mismo error #l #rir el #rc"i,o; 'rrores.$$te2;
#l#)'rrores te3 ne[ #l#)'rrores3 error #ritmetico re,ise l# o(er#ciJn que est# re#li#n$o e!ce(ciones (ro$uci$#s $ur#nte o(er#ciones #ritmItic#s; 'rrores.$$te3;
#l#)'rrores te4 ne[ #l#)'rrores4 error $i,i$ir (or cero escoB# otro numero que no se# el 0 (#r# $i,i$ir (osile incongruenci# en $i,iciono en cu#lquier o(er#ciJn; 'rrores.$$te4;
#l#)'rrores te5 ne[ #l#)'rrores5 error $e con,ersion $e ti(o ,eri\que que los ti(os $e l#s ,#ri#les se# el mismo Se (ro$uce cu#n$o tiene lug#r un error en tiem(o $e eBecuciJn en un# con,ersiJn e!(lZcit# $e un ti(o #se # un# inter=# o # un ti(o $eri,#$o.; 'rrores.$$te5;
#l#)'rrores te6 ne[ #l#)'rrores6 error re=erenci# nul# re,ise que est# $#n$o un ,#lor #l# ,#ri#le Se (ro$uce #l intent#r "#cer re=erenci# # un oBeto cuyo ,#lor es null.; 'rrores.$$te6;
#l#)'rrores te7 ne[ #l#)'rrores7 error $e $esor$#miento #segurese $el t#m#]o $el result#$o Se (ro$uce cu#n$o un# o(er#ciJn #ritmItic# en un conte!to (ro$uce un $esor$#miento.; 'rrores.$$te7; #l#)'rrores te8 ne[ #l#)'rrores8 error $e mito #segurese $e que l#s ll#,es @*@ teng#n su contr#(#rte @@ Se (ro$uce cu#n$o "#y #lgun# ll#,e sin cerr#r #mito incom(leto; 'rrores.$$te8; #l#)'rrores te9 ne[ #l#)'rrores9 sint#!is $esconoci$# #segurese $e que l# sint#!is se# correct# Se (ro$uce cu#n$o se $esconoce l# sint#!is $e l# sentenci#; 'rrores.$$te9; #l#)'rrores te10 ne[ #l#)'rrores10 sint#!is errone# #segurese $e que l# sint#!is se# correct# ,eri\que es(#cios Se (ro$uce cu#n$o l# sint#!is $e l# sentenci# contiene #lgun error; 'rrores.$$te10; #l#)'rrores te11 ne[ #l#)'rrores11 [#rning #segurese $e que l#s ,#ri#les no esten re(eti$#s Se (ro$uce cu#n$o m#s $e un# ,#ri#le est#n inici#li#$#s con el mismo nomre; 'rrores.$$te11; (ulic ListP#l#)'rroresR ll#m#t#l#' * return 'rrorese$;
(ulic ,oi$ #$$listeint i$int nl * =ore#c" ,#r error in 'rrores * i= error.?$ i$ * #l#)'rrores er ne[ #l#)'rrores; er.Descri(cion error.Descri(cion; er.Solucion error.Solucion; er.'rror error.'rror; er.Aumero$eLine# nl; 'rrorese$.$$er; (ulic ,oi$ #$$listeint i$ * =ore#c" ,#r error in 'rrores *
i= error.?$ i$ * #l#)'rrores er ne[ #l#)'rrores; er.Descri(cion error.Descri(cion; er.Solucion error.Solucion; er.?$ error.?$; 'rrorese$.$$er;
D'S&&ELLE D'L +&EG&- using System; using System.Collections.Generic; using System.Com(onent-o$el; using System.D#t#; using System.Dr#[ing; using System.Linq; using System.e!t; using System.in$o[s.orms; using System.?E; using simolos; using System.e!t.&egul#r'!(ressions;>>using neces#rio ll#m# #l# re=erenci# $e l# lireri# $e e!(resiones regul#res using -icroso=t.E^ce.?ntero(.'!cel; using -#neBoDe'rrores;
n#mes(#ce Com('$ * (ulic (#rti#l cl#ss ?$e < orm * int c#ntLine#s 0 ;
string nom#rc"i,o!; S t#l#)simolos ne[ S; ' t#l#)errorres ne[ ';
(ulic ?$e * ?niti#lieCom(onent; (ri,#te ,oi$ s#liroolStri(-enu?tem)Clic%oBect sen$er ',entrgs e * System.in$o[s.orms.((lic#tion.'!it; (ri,#te ,oi$ toolStri(_utton1)Clic%oBect sen$er ',entrgs e * >>nl$rSntctc;
(ri,#te ,oi$ toolStri(_utton7)Clic%oBect sen$er ',entrgs e * System.in$o[s.orms.((lic#tion.'!it;
(ri,#te ,oi$ ?$e)Lo#$oBect sen$er ',entrgs e>>HHHHHHHHHHHHHHH *
t#l#)errorres.inici#lest#'; t#l#)simolos.inici#list#; t#Control1.Wisile =#lse;
+#gCo$igo.Select; +#gCo$igo.DetectFrls true; `region #re# $e noti\c#cion noti=y?con1.e!t Com('$` 2013; noti=y?con1._#llooni(itle P` :ello orl$; noti=y?con1._#llooni(e!t _ien,eni$o # Com('$` 2013; noti=y?con1._#llooni(?con ooli(?con.?n=o; t"is.Clic% M ne[ ',ent:#n$lernoti=y?con1)Clic%;
noti=y?con1.Wisile true; noti=y?con1.S"o[_#llooni(3000; `en$region
(ri,#te ,oi$ noti=y?con1)Clic%oBect sen$er ',entrgs e * i= t"is.in$o[St#te ormin$o[St#te.-inimie$ t"is.in$o[St#te ormin$o[St#te.-#!imie$;
t"is.cti,#te;
(ri,#te ,oi$ noti=y?con1)_#llooni(S"o[noBect sen$er ',entrgs e *
(ri,#te ,oi$ toolStri(Cont#iner1)o(oolStri(+#nel)Clic%oBect sen$er ',entrgs e *
(ri,#te ,oi$ ?$e)ormClosingoBect sen$er ormClosing',entrgs e * Di#log&esult $i#logo -ess#ge_o!.S"o[a Dese# cerr#r el n#li#$or bCerr#r Com(il#$or -ess#ge_o!_uttons.EC#ncel -ess#ge_o!?con.uestion; i= $i#logo Di#log&esult.E * System.in$o[s.orms.((lic#tion.'!it; else * e.C#ncel true;
(ri,#te ,oi$ #cerc#DeCom('$oolStri(-enu?tem)Clic%oBect sen$er ',entrgs e *
(ri,#te ,oi$ #riroolStri(-enu?tem)Clic%oBect sen$er ',entrgs e * #rir#rc"i,o;
>>HHHHHHHHHHHHHHHHHHHHHHHHHHHHH-'EDES D' &C:?WES HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
(ulic ,oi$ e!(ort#r#e!celD#t#Gri$Wie[ t#l# *
-icroso=t.E^ce.?ntero(.'!cel.((lic#tion e!cel ne[ -icroso=t.E^ce.?ntero(.'!cel.((lic#tion;
e!cel.((lic#tion.or%oo%s.$$true;
int Column?n$e! 0;
=ore#c" D#t#Gri$Wie[Column col in t#l#.Columns *
Column?n$e!MM;
e!cel.Cells/1 Column?n$e! col.A#me;
int ro[?n$e! 0;
=ore#c" D#t#Gri$Wie[&o[ ro[ in t#l#.&o[s *
ro[?n$e!MM;
Column?n$e! 0;
=ore#c" D#t#Gri$Wie[Column col in t#l#.Columns *
Column?n$e!MM;
e!cel.Cells/ro[?n$e! M 1 Column?n$e! ro[.Cells/col.A#me.W#lue; e!cel.Wisile true; or%s"eet [or%s"eet or%s"eete!cel.cti,eS"eet;
[or%s"eet.cti,#te;
(ulic ,oi$ #rir#rc"i,o * try* E(enileDi#log o=$ ne[ E(enileDi#log; o=$.itle Com('$` rc"i,o
rir ;
o=$.S"o[Di#log; >> o=$.ilter rc"i,os e$`N.e$XN.e$; i= ile.'!istso=$.ileA#me * using Stre#m stre#m o=$.E(enile * >>-ess#ge_o!.S"o[#rc"i,o encontr#$o< Mo=$.ileA#me; leer#rc"i,oo=$.ileA#me; nom#rc"i,o! o=$.ileA#me;
t!t)$ireccion.e!t o=$.ileA#me; t#Control1.Wisile true;
c#tc"'!ce(tion*
-ess#ge_o!.S"o['l #rc"i,o no se #rio correct#mente;
t#l#)errorres.#$$liste2;
(ulic ,oi$ leer#rc"i,ostring nom#rc"i,o * Stre#m&e#$er re#$er ne[ Stre#m&e#$ernom#rc"i,o System.e!t.'nco$ing.De=#ult; >>string re#$ re#$er.&e#$Line; string te!to; >> ["ile re#$ d null >>* te!to re#$er.&e#$o'n$; >> re#$ re#$ M Vn;
re#$er.Close;
+#gCo$igo.e!t te!to; >> re#$ re#$er.&e#$Line;
>>
(ulic ool re,is#si#rc"i,oe!istestring nom#rc"i,o *
ool e!iste;
i= ile.'!istsnom#rc"i,o * >> el #rc"i,o e!iste e!iste true; else * >> el #rc"i,o no e!tiste e!iste =#lse; return e!iste;
(ulic ,oi$ gu#r$#rc"i,o * S#,eileDi#log s#,eile ne[ S#,eileDi#log; s#,eile.ilter rc"i,os e$XN.e$; i= s#,eile.S"o[Di#log Di#log&esult.E *
i= ile.'!istss#,eile.ileA#me * >> el #rc"i,o e!iste >>HHHHHHHHHHHHHHHHHHH (#r# un log que #greg# e,entos .................. >>Stre#mriter [riter ile.((en$e!tnom#rc"i,o; >>[riter.riteLineVn PP> HHHctu#li#cion $el M D#teime.Ao[.oString M >RR; >>[riter.rite+#gCo$igo.e!t; >>[riter.Close;
>>HHHHHHHHHHHHHHHHHH (#r# sorescriir el te!to ................... Stre#mriter co$igonue,o ile.Cre#tee!ts#,eile.ileA#me; co$igonue,o.rite+#gCo$igo.e!t; co$igonue,o.lus"; co$igonue,o.Close; nom#rc"i,o! s#,eile.ileA#me; t!t)$ireccion.e!t s#,eile.ileA#me;
else * >> el #rc"i,o no e!tiste
Stre#mriter co$igonue,o ile.Cre#tee!ts#,eile.ileA#me; co$igonue,o.rite+#gCo$igo.e!t;
co$igonue,o.riteVn Vn PP> rc"i,o cre#$o el< M D#teime.Ao[.oString M >RR Vn ; co$igonue,o.lus"; co$igonue,o.Close; nom#rc"i,o! s#,eile.ileA#me; t!t)$ireccion.e!t s#,eile.ileA#me; (ulic ,oi$ gu#r$#rc"i,o2string nom#rc"i,o * try * i= nom#rc"i,o null * gu#r$#rc"i,o;
else * >> el #rc"i,o nue,o Stre#mriter co$igonue,o ile.Cre#tee!tnom#rc"i,o; co$igonue,o.rite+#gCo$igo.e!t; co$igonue,o.lus"; co$igonue,o.Close; c#tc" '!ce(tion
* -ess#ge_o!.S"o[error #l gu#r$#r; (ulic ,oi$ leer)#rc"i,o)#lstring nom#rc"i,o *
int cont#$or)mitoi 0; int cont#$or)mit= 0; int #mito 0; try * Stre#m&e#$er re#$er ne[ Stre#m&e#$ernom#rc"i,o; string/ +#l#r#s)Se(#r#$#s; string re#$; int numero)$e)line#s 0; +#gCo$igo.Select0 +#gCo$igo.SelectionSt#rt;
["ile re#$er d null * numero)$e)line#s numero)$e)line#s M 1; re#$ re#$er.&e#$Line;
i= re#$er.'n$E=Stre#m *
>>-ess#ge_o!.S"o[ultim# line#;
re#%; else +#l#r#s)Se(#r#$#s re#$.S(lit@ @; =ore#c" ,#r (#l#r# in +#l#r#s)Se(#r#$#s * `region -e$icion $el #mito
i= (#l#r# * * cont#$or)mitoi cont#$or)mitoi M 1; i= (#l#r# * cont#$or)mit= cont#$or)mit= M 1; #mito cont#$or)mitoi;
`en$region >>HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH i= t#l#)simolos.com(#r#rL(#l#r#.oString QQ (#l#r# d null>> se m#n$# # com(#r#r l# (#l#r# con l# t#l# $e simolos
* >> t#m#mit
sim ,#l nunlin i$)
ti(o
$escri(
>>uneSentenci#s; t#l#)$e)simolos oBnue,o ne[ t#l#)$e)simolos(#l#r# numero)$e)line#s H0 #mito t#l#)simolos.com(#r#rL&e=(#l#r#.oString (#l#r# nue,# (#l#r# que coinci$e con l# #l# $e simolos ; t#l#)simolos.#]#$ir)oBoBnue,o;
+#gCo$igo.SelectionSt#rt +#gCo$igo.in$(#l#r#; +#gCo$igo.SelectionColor Color.Do$ger_lue;
else>>$e no est#r en l# t#l# $e simolos se #greg# # un c#m(o nue,o * i= &ege!.?s-#tc"(#l#r# /#HH QQ (#l#r# d null>>sentenci# que re,is# los $os te!o! * >> System.in$o[s.orms.-ess#ge_o!.S"o[esto es un# (#l#r#; t#l#)$e)simolos oBnue,o ne[ t#l#)$e)simolos(#l#r# numero)$e)line#s H0 #mito t#l#)simolos.contline#s M 1 (#l#r# nue,# (#l#r# que no coinci$e con l# #l# $e simolos(ero no se consi$er# error; t#l#)simolos.#]#$ir)oBoBnue,o; else i= &ege!.?s-#tc"(#l#r# V$*1XV$*2XV$*3XV$*4XV$*5 QQ (#l#r# d null
* >>System.in$o[s.orms.-ess#ge_o!.S"o[esto es un numero; t#l#)$e)simolos oBnue,o ne[ t#l#)$e)simolos(#l#r# (#l#r# numero)$e)line#s H0 #mito t#l#)simolos.contline#s M 1 numero nue,o numero; t#l#)simolos.#]#$ir)oBoBnue,o;
+#gCo$igo.SelectionSt#rt +#gCo$igo.in$(#l#r#; +#gCo$igo.SelectionColor Color.qu#m#rine;
else * >> System.in$o[s.orms.-ess#ge_o!.S"o['rror en l# e!(resion Vn no cum(le con un =orm#to correcto ; >>\n $el #n#lisis le!ico
+#l#r#s)Se(#r#$#s null; c#ntLine#s numero)$e)line#s;
i= cont#$or)mit= d cont#$or)mitoi * >>-ess#ge_o!.S"o[error $e #mito; t#l#)errorres.#$$liste8;
re#$er.Close; c#tc" rgumentAull'!ce(tion *
-ess#ge_o!.S"o['l #rc"i,o no se #rio correct#mente;
t#l#)errorres.#$$liste2; c#tc" '!ce(tion * -ess#ge_o!.S"o[error;
(ulic string/ uneSentenci#s * string sentenci# null; string/ sentenci#s ne[ string/c#ntLine#s; int #n$er# 0; string ti(o, ;
=or int i 1; i P c#ntLine#s; iMM >>une los to%en $e c#$# line# * =ore#c" ,#r to%en in t#l#)simolos.ll#m#t#l# * i= to%en.AumLine# i QQ to%en d null * i= #n$er# 0 QQ &ege!.?s-#tc"to%en.Simolo P`intXP`integerXP`$ouleXP`oolXP`stringXP`re#lXP`oole#n f * to%en.i(oW#r to%en.Simolo; ti(o, to%en.Simolo;
i= #n$er# d 0 * sentenci# sentenci# M M to%en.simolo.oString; to%en.i(oW#r ti(o,; else
* sentenci# sentenci# M to%en.simolo.oString; #n$er# 1;
sentenci#s/i sentenci#; sentenci# null; #n$er# 0; ti(o, ;
return sentenci#s; `region #n#li#$or sint#ctico (ulic ,oi$ nl$rSntctcstring/ sentenci#s *
=or int i 1; i P sentenci#s.Lengt"; iMM * >>-ess#ge_o!.S"o[sentenci#s/i; `region '!(resiones regul#res i= sentenci#s/i d null *
i= &ege!.?s-#tc"sentenci#s/i OP`intXP`integerVsM/#H 115VsM
System.in$o[s.orms.-ess#ge_o!.S"o[esto es un# sentenci# int; `region (#rte sem#ntic# string/ se(#r#num; se(#r#num sentenci#s/i.S(lit@ @; try* int num ; num int.+#rsese(#r#num/3;
-ess#ge_o!.S"o[si es un numero entero;
c#tc"orm#t'!ce(tion e*
-ess#ge_o!.S"o[no es un numero entero; t#l#)errorres.#$$liste0i;
c#tc"?n$e!EutE=nge'!ce(tion e*
t#l#)errorres.#$$liste10 i; -ess#ge_o!.S"o[error $e escritur#;
`en$region
else i= &ege!.?s-#tc"sentenci#s/i OP`$ouleX P`re#lVsM/#H115VsM
-ess#ge_o!.S"o[si es un numero $oule;
c#tc" orm#t'!ce(tion e * t#l#)errorres.#$$liste0i; -ess#ge_o!.S"o[no es un numero $oule;
c#tc"?n$e!EutE=nge'!ce(tion e* t#l#)errorres.#$$liste10 i;
-ess#ge_o!.S"o[error $e escritur#;
`en$region
else i= &ege!.?s-#tc"sentenci#s/i OP`stringX P`te!toVsM/#H115VsM
else i= &ege!.?s-#tc"sentenci#s/i OP`oolX P`oole#nVsM/#H115VsM
`region (#rte sem#ntic# string/ se(#r#,#r; se(#r#,#r sentenci#s/i.S(lit@ @; try * ool ,#r; ,#r ool.+#rsese(#r#,#r/3;
-ess#ge_o!.S"o[si es un# ,#ri#le ool;
c#tc" orm#t'!ce(tion e *
-ess#ge_o!.S"o[no es un# ,#ri#le ool; t#l#)errorres.#$$liste0 i; `en$region
else i= &ege!.?s-#tc"sentenci#s/i PPN.NRRf * -ess#ge_o!.S"o['sto es un coment#rio; else i= &ege!.?s-#tc"sentenci#s/i /#HVsM
`region (#rte sem#ntic# string t(,1 ; string t(,2 ; string t(,3 ;
string/ se(#r#,#r; se(#r#,#r sentenci#s/i.S(lit@ @;
i= &ege!.?s-#tc"sentenci#s/i /#HVsM>HH #sign#cion $el ti(o monto < num1 M num2 ; *
=ore#c" ,#r to%en in t#l#)simolos.ll#m#t#l# * i= to%en.Simolo se(#r#,#r /0 * t(,1 to%en.i(oW#r; i= to%en.Simolo se(#r#,#r/2 * t(,2 to%en.i(oW#r; i= to%en.Simolo se(#r#,#r/4 * t(,3 to%en.i(oW#r;
>>HH \n $el =ore#c" i= t(,1 t(,2 QQ t(,2 t(,3 QQ t(,1 d *
-ess#ge_o!.S"o[el ti(o $e l#s ,#ri#les son el mismo; i= &ege!.?s-#tc"sentenci#s/i /#H VsM>HH #sign#cion $el ti(o monto < num1 H num2 ; *
=ore#c" ,#r to%en in t#l#)simolos.ll#m#t#l# * i= to%en.Simolo se(#r#,#r/0 * t(,1 to%en.i(oW#r; i= to%en.Simolo se(#r#,#r/2 * t(,2 to%en.i(oW#r; i= to%en.Simolo se(#r#,#r/4 * t(,3 to%en.i(oW#r;
>>HH \n $el =ore#c" i= t(,1 t(,2 QQ t(,2 t(,3 QQ t(,1 d *
-ess#ge_o!.S"o[el ti(o $e l#s ,#ri#les son el mismo; i= &ege!.?s-#tc"sentenci#s/i /#H VsMVsV[NVs;f>>HH #sign#cion $el ti(o monto < num1 > num2 ; *
=ore#c" ,#r to%en in t#l#)simolos.ll#m#t#l# * i= to%en.Simolo se(#r#,#r/0 * t(,1 to%en.i(oW#r; i= to%en.Simolo se(#r#,#r/2 * t(,2 to%en.i(oW#r; i= to%en.Simolo se(#r#,#r/4 * t(,3 to%en.i(oW#r;
>>HH \n $el =ore#c" i= t(,1 t(,2 QQ t(,2 t(,3 QQ t(,1 d *
-ess#ge_o!.S"o[el ti(o $e l#s ,#ri#les son el mismo; i= &ege!.?s-#tc"sentenci#s/i /#H VsM>HH #sign#cion $el ti(o monto < num1 N num2 ; *
=ore#c" ,#r to%en in t#l#)simolos.ll#m#t#l# * i= to%en.Simolo se(#r#,#r/0 * t(,1 to%en.i(oW#r; i= to%en.Simolo se(#r#,#r/2 * t(,2 to%en.i(oW#r; i= to%en.Simolo se(#r#,#r/4 * t(,3 to%en.i(oW#r;
>>HH \n $el =ore#c" i= t(,1 t(,2 QQ t(,2 t(,3 QQ t(,1 d *
-ess#ge_o!.S"o[el ti(o $e l#s ,#ri#les son el mismo;
`en$region
else i= &ege!.?s-#tc"sentenci#s/i O*f * -ess#ge_o!.S"o[inicio $e #mito; else i= &ege!.?s-#tc"sentenci#s/i Of * -ess#ge_o!.S"o[\n $e #mito; else i= &ege!.?s-#tc"sentenci#s/i PPsi)VsVVsMV[MVsPX RXP>HH * -ess#ge_o!.S"o[comieno $e i=; else i= &ege!.?s-#tc"sentenci#s/i PPysi)VsV VsMV[MVsPXRXP>HH * -ess#ge_o!.S"o[comieno $e else i=;
else i= &ege!.?s-#tc"sentenci#s/i PPsinoVsNV*f>>HH * -ess#ge_o!.S"o[comieno $e else; else i= &ege!.?s-#tc"sentenci#s/i `nc#s$VsVVsV[MVsPX RXP>HH * -ess#ge_o!.S"o[comieno $el s[itc"; else i= &ege!.?s-#tc"sentenci#s/i c#s$VsV VsV[MXV$MVsVVs*f>>HH * -ess#ge_o!.S"o[comieno $e c#se; else i= &ege!.?s-#tc"sentenci#s/i =c#s$Vs;f>>HH * -ess#ge_o!.S"o[re#% $el c#se; else i= &ege!.?s-#tc"sentenci#s/i `mintrsVsV VsV[MVsPXRXP
else i= &ege!.?s-#tc"sentenci#s/i `mostr#rVsV VsV[NX@V[N@VVs;f
* -ess#ge_o!.S"o[mostr#r (or (#nt#ll# Vn M sentenci#s/i;
>>else i= &ege!.?s-#tc"sentenci#s/i >>* >>-ess#ge_o!.S"o[; >> >>else i= &ege!.?s-#tc"sentenci#s/i >>* >>-ess#ge_o!.S"o[; >> >>else i= &ege!.?s-#tc"sentenci#s/i >>* >>-ess#ge_o!.S"o[; >> >>else i= &ege!.?s-#tc"sentenci#s/i >>* >>-ess#ge_o!.S"o[; >> else * i= sentenci#s/i d null * t#l#)errorres.#$$liste9 i;
>>-ess#ge_o!.S"o['!(resion in,#li$#;
`en$region
>>System.in$o[s.orms.-ess#ge_o!.S"o[ M sentenci#s/i;
`en$region
(ri,#te ,oi$ gu#r$#roolStri(-enu?tem)Clic%oBect sen$er ',entrgs e * gu#r$#rc"i,o;
(ri,#te ,oi$ toolStri(_utton3)Clic%oBect sen$er ',entrgs e * gu#r$#rc"i,o2nom#rc"i,o!;
(ri,#te ,oi$ gu#r$#roolStri(-enu?tem1)Clic%oBect sen$er ',entrgs e * gu#r$#rc"i,o2nom#rc"i,o!;
(ri,#te ,oi$ nue,ooolStri(-enu?tem)Clic%oBect sen$er ',entrgs e * t#Control1.Wisile true;
(ri,#te ,oi$ toolStri(_utton8)Clic%oBect sen$er ',entrgs e * $#t#Gri$Wie[1.D#t#Source null; $#t#Gri$Wie[2.D#t#Source null; $#t#Gri$Wie[1.D#t#Source t#l#)simolos.ll#m#t#l#;
$#t#Gri$Wie[2.D#t#Source t#l#)errorres.ll#m#t#l#';
(ri,#te ,oi$ #n#li#$orLe!icooolStri(-enu?tem)Clic%oBect sen$er ',entrgs e * leer)#rc"i,o)#lnom#rc"i,o!;
(ri,#te ,oi$ toolStri(_utton9)Clic%oBect sen$er ',entrgs e * t#Control1.Wisile true;
(ri,#te ,oi$ cerr#r+royectooolStri(-enu?tem)Clic%oBect sen$er ',entrgs e * t#Control1.Wisile =#lse ;
(ri,#te ,oi$ toolStri(_utton6)Clic%oBect sen$er ',entrgs e * #rir#rc"i,o;
(ri,#te ,oi$ m#!imi#rWent#n#oolStri(-enu?tem)Clic%oBect sen$er ',entrgs e * t"is.in$o[St#te ormin$o[St#te.-#!imie$;
(ri,#te ,oi$ minimi#rWent#n#oolStri(-enu?tem)Clic%oBect sen$er ',entrgs e * t"is.in$o[St#te ormin$o[St#te.Aorm#l;
(ri,#te ,oi$ minimi#rWent#n#oolStri(-enu?tem1)Clic%oBect sen$er ',entrgs e * t"is.in$o[St#te ormin$o[St#te.-inimie$;
(ri,#te ,oi$ o(cionesoolStri(-enu?tem)Clic%oBect sen$er ',entrgs e *
(ri,#te ,oi$ colorDeL#uenteoolStri(-enu?tem)Clic%oBect sen$er ',entrgs e *
,#r cl colorDi#log1.S"o[Di#log; i= cl System.in$o[s.orms.Di#log&esult.E * >>+#gCo$igo.SelectionColor colorDi#log1.Color; P..... esto (#r# un# (#rte $el te!to +#gCo$igo.oreColor colorDi#log1.Color;
(ri,#te ,oi$ colorDeConsol#oolStri(-enu?tem)Clic%oBect sen$er ',entrgs e * ,#r cl colorDi#log1.S"o[Di#log; i= cl System.in$o[s.orms.Di#log&esult.E * >>+#gCo$igo.SelectionColor colorDi#log1.Color; P..... esto (#r# un# (#rte $el te!to +#gCo$igo._#c%Color colorDi#log1.Color;
(ri,#te ,oi$ =orm#tooolStri(-enu?tem)Clic%oBect sen$er ',entrgs e *
,#r =m =ontDi#log1.S"o[Di#log; i= =m Di#log&esult.E * >>+#gCo$igo.SelectionColor colorDi#log1.Color; P..... esto (#r# un# (#rte $el te!to +#gCo$igo.ont =ontDi#log1.ont;
(ri,#te ,oi$ toolStri(_utton2)Clic%oBect sen$er ',entrgs e * i= C)result#$os.e!t ,er log $e errores * e!(ort#r#e!cel$#t#Gri$Wie[2; else i= C)result#$os.e!t ,er log $e simolos * e!(ort#r#e!cel$#t#Gri$Wie[1;
(ri,#te ,oi$ toolStri(_utton5)Clic%oBect sen$er ',entrgs e * gu#r$#rc"i,o2nom#rc"i,o!; t#l#)simolos.reinici#list#; t#l#)errorres.reinici#list#; t#l#)errorres.inici#lest#'; t#l#)simolos.inici#list#; leer)#rc"i,o)#lnom#rc"i,o!; string/ sent uneSentenci#s; t#l#)simolos.com(#r#rLsem#ntic;
i= t#l#)simolos.re,is#r)$u(lic#$os * t#l#)errorres.#$$liste11; nl$rSntctcsent; $#t#Gri$Wie[1.D#t#Source null; $#t#Gri$Wie[2.D#t#Source null; $#t#Gri$Wie[1.D#t#Source t#l#)simolos.ll#m#t#l#; $#t#Gri$Wie[2.D#t#Source t#l#)errorres.ll#m#t#l#'; System.-e$i#.SystemSoun$s.steris%.+l#y;
ACTI>IDAD 8. NUEST0O P0OECTO A DESA00OLLA0 SE0 UN COMPILADO0 UE INCLUA EL ANALIFADO0 LEXICO SINTACTICO SEMANTICO. P0OG0AMA: A(ALI^A*%< SE&A(TIC% ELA/%
*esarrollar e implementar un analiador 0ue se encarga de c;e0uear el te,to de entrada en 2ase a una gram$tica dada# [ en caso de 0ue el programa de entrada sea v$lido- suministra el $r2ol sint$ctico 0ue lo reconoce# En teoría- se supone 0ue la salida del analiador sem$ntico ser$ alguna representación del $r2ol sint$ctico 0ue reconoce la secuencia de toDens suministrada por el analiador l5,ico# En la pr$ctica- el analiador sem$ntico tam2i5n realiara:
Acceder a la ta2la de sím2olos =para ;acer parte del tra2ajo del analiador sem$ntico># C;e0ueo de tipos =del analiador sem$ntico># 7enerar código intermedio# 7enerar errores cuando se producen#
En de.initiva- realia casi todas las operaciones de la compilación# Este m5todo de tra2ajo da lugar a los m5todos de compilación dirigidos por sinta,is#
&etodologia a utiliar___
CONCLUSIÓN Aprendí 0ue las ;erramientas 0ue muestran tipos de an$lisis de programas .uenteson muy 3tiles al momento de crear un programa al codi.icar un algoritmo- ya 0ue estas ;erramientas nos ayudan .ormateando el te,to- corrigiendo errores- dando tipsO para 0ue nosotros como programadores seamos m$s e.icientes al momento de
crear
alguna
aplicación#
'or otro lado- comprendí 0ue un compilador- re0uiere de una sinta,is y lenguajes especí.icos- ya 0ue- al igual 0ue el lenguaje ;umano- si no lo escri2imos
correctamente el compilador no ;ar$ lo 0ue deseamos# [ 0ue en la compilación ;ay dos partes: An$lisis y Síntesis# La parte del an$lisis divide al programa .uente en sus elementos componentes y crea una representación intermedio# El analiador sem$ntico tiene dos o2jetivos: ` 6acer compro2aciones 0ue no se ;agan durante el an$lisis l5,ico o sint$ctico# ` Crear una representación adecuada para .ases posteriores# Implementaremos el an$lisis sem$ntico en dos partes: ` &ediante es0uemas de traducción dirigidos por la sinta,is# `
_iliogr#=Z# 29 $e 10 $e 2014. Eteni$o $e "tt(<>>es.[i%i(e$i#.org>[i%i>Wisu#l)_#sic)#l=#eto # (#rtir $e un lengu#Be
29 $e 10 $e 2014. Eteni$o $e "tt(<>>[[[.(#gin#s(ro$igy.com>e$sern#>cursos>com(il#$or>not#s>Aot#s1 .($= 29 $e 10 $e 2014. Eteni$o $e "tt(<>>es.sli$es"#re.net>Gon#loS#nti#go>teori#H$eHlengu#BesHgr#m#tic#sH yH#utom#t#sH(#r#Hin=orm#ticos .W."o K. 1994. oun$#tions o= Com(uter Science. 'n K. .W."o%ciense &ress (gs. 156H162. Aue,# hor%. K.:#rtm#nis &. y. 1963. 'egulatiry(preser)ing modi"cacations o* regular e+pressions ingl#terr#. -cC#rt"y C. S. 1956. ,-.edan/en e+periments on sequential machines FS. S.C.leene. 1956. estudio de automatas est#$os uni$os. FA-. 03 $e no,iemre $e 2014. Eteni$o $e "tt(<>>iliotec#s.un#m.m!> FA-. 03 $e no,iemre $e 2014. Eteni$o $e "tt(<>>iliotec#s.un#m.m!>in$e!.("(>iliotec#sun#m)liro el estu$io $e lengu#Bes y #utom#t#s