Documentos de Académico
Documentos de Profesional
Documentos de Cultura
*
Carlos Andres Delgado S, Msc
Marzo de 2019
2. Lenguaje Univalle GO
GO es un lenguaje de programación compilado inspirado en C, que soporta programación orientada a ob-
jetos y tiene una estructuras de paso de parámetros por valor. En este lenguaje sólo trabajaremos paso por valor.
; ; * * * * * * * * * * * * * * E s p e c i f i c a c i o n e s l é x i c a s * * * * * * * * * * * * * * * * *
<d i g i t o D e c i m a l > : : = <d i g i t o ><d i g i t o >∗
<d i g i t o D e c i m a l > : : = " - " <d i g i t o ><d i g i t o >∗
<d i g i t o O c t a l > : : = " 0 x " ( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 ) ( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 ) ∗
<d i g i t o O c t a l > : : = " - " " 0 x " ( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 ) ( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 ) ∗
<h e x a d e c i m a l > : : = " h x " ( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | " A " | " B " | " C " | " D " | " E " | " F " )
( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | "A" | "B" | "C" | "D" | "E" | "F")∗
<h e x a d e c i m a l > : : = " - " " h x " ( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | " A " | " B " | " C " | " D " | " E " | " F " )
( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | "A" | "B" | "C" | "D" | "E" | "F")∗
<f l o t a n t e > : : = <d i g i t o ><d i g i t o >∗" . "<d i g i t o ><d i g i t o >∗
<f l o t a n t e > : : = " - " <d i g i t o ><d i g i t o >∗" . "<d i g i t o ><d i g i t o >∗
<cadena> : : = " < s i m b o l o > < s i m b o l o > * "
<c o m e n t a r i o > : : = " \ \ " ( n o t #\ n e w l i n e )
<e s p a c i o > : : = <w h i t e s p a c e >
* carlos.andres.delgado@correounivalle.edu.co
1
; ;************** Especificaciones gramaticales *****************
; ; C o n d i c i o n a l e s y e s t r u c t u r a s de c o n t r o l
: : = " i f " <e x p r e s i o n > " { " <e x p r e s i o n > " e l s e " <e x p r e s i o n > " { " ( i f − e x p )
::= " switch " "(" i d e n t i f i c a d o r ")" "{" ( " case " expresion expresion ) ∗ " default :" expresion
" } " ( switch−exp )
: : = " f o r " < i d e n t i f i c a d o r > " = " <e x p r e s i o n > " ; " e x p r e s i o n " ; " e x p r e s i o n " { " e x p r e s i o n " } "
( for−exp )
: : = " w h i l e " <e x p r e s i o n > " { " <e x p r e s i o n > " } " ( while−exp )
; ; S e c u e n c i a c i ó n
: : = " b e g i n " (< e x p r e s i o n >) ∗ ( ; ) " e n d " ( b e g i n - e x p )
;; Funciones
: : = " f u n c " < i d e n t i f i c a d o r > " ( " (< i d e n t i f i c a d o r > <tipo−exp ) ∗ ( , )
expresion " return " expresion ( func−exp )
: : = " c a l l " < i d e n t i f i c a d o r > " ( " <e x p r e s i o n > ∗ ( , ) " ) " ( c a l l − e x p )
; ; I n v o c a c i ó n y l l a m a d o d e o b j e t o s
: : = " n e w " < i d e n t i f i c a d o r > < i d e n t i f i c a d o r > " ( " <e x p r e s i o n > ∗ ( , ) " ) " ( new−obj )
: : = " s e n d " < i d e n t i f i c a d o r >" . "< i d e n t i f i c a d o r > " ( " <e x p r e s i o n > ∗ ( , ) " ) " ( method−invoke )
<b o o l − e x p r e s i o n >
::= true ( true−exp )
::= f a l s e ( false−exp )
;; Primitivas
<p r i m i t i v a > : : = + ( sum−prim )
: : = − ( minus−prim )
: : = ∗ ( mult−prim )
: : = m o d ( modulo−prim )
: : = & ( concat−prim )
: : = pow ( e l e v a r − p r i m )
: : = < ( menor−prim )
: : = > ( mayor−prim )
: : = <=(menorigual−prim )
: : = >=(mayorigual−prim )
: : = !=( diferent−prim )
:= ==(i g u a l − p r i m )
: : = n o t ( not−prim )
: : = a n d ( and−prim )
: : = o r ( or−prim )
: : = x o r ( xor−prim )
: : = l e n g t h ( length−prim )
: : = n t h ( nth−prim )
;; Tipos
<tipo−exp> : : = i n t ( i n t − t i p o )
::= octal ( octal−tipo )
: : = hex ( hex−tipo )
::= float ( float−tipo )
::= string ( texto−tipo )
::= bool ( bool−tipo )
::= void ( void−tipo )
; ; D e c l a r a c i ó n v a r i a b l e s
<v a r i a b l e − d e c l > : : = " v a r N " < i d e n t i f i c a d o r > " = " <e x p r e s i o n > ( decl1−exp )
: : = " v a r T " < i d e n t i f i c a d o r > <tipo−exp> ( decl2−exp )
<s t r u c t − d e c l > : : = " t y p e " < i d e n t i f i c a d o r > " s t r u c t " " { " <a t r i b u t o s >∗ <metodos >∗ " } " ( obj−decl )
2
2.2. Estructuras léxicas
Identificadores: Son secuencias de caracteres alfanuméricos que comienzan con una letra
Comentarios: Inician con // y terminan con fin de linea.
Números enteros: Los números son un conjunto de dı́gitos. Se dividen de la siguiente forma:
1. Dı́gitos decimales del 0 al 9
2. Dı́gitos octales del 0 al 7
3. Dı́gitos hexadecimales del 0 al F.
Estos números pueden ser antecedidos por ”para indicar que son negativos.
Números flotantes: Los números son un conjunto de dı́gitos seguidos por un punto y seguidos por un
conjunto de dı́gitos. Estos números pueden ser antecedidos por ”para indicar que son negativos. Única-
mente tenemos números decimales flotantes
Cadenas: Inician con comillas seguidas por un conjunto de dı́gitos o letras y terminadas en comillas.
( define l e x i c a
’ ( ( white−sp
( whitespace ) skip )
( comment
( " %" ( arbno ( n o t #\ n e w l i n e ) ) ) s k i p )
( identificador
( l e t t e r ( arbno ( o r l e t t e r d i g i t " ? " ) ) ) s y m b o l )
( digitoDecimal
( d i g i t ( arbno d i g i t ) ) n u m b e r )
( digitoDecimal
( " - " d i g i t ( arbno d i g i t ) ) n u m b e r )
( digitoOctal
( " 0 x " ( or " 0 " " 1 " " 2 " " 3 " " 4 " " 5 " " 6 " " 7 " )
( arbno ( o r " 0 " " 1 " " 2 " " 3 " " 4 " " 5 " " 6 " " 7 " ) ) ) s t r i n g )
( digitoOctal
( " - " " 0 x " ( or " 0 " " 1 " " 2 " " 3 " " 4 " " 5 " " 6 " " 7 " )
( arbno ( o r " 0 " " 1 " " 2 " " 3 " " 4 " " 5 " " 6 " " 7 " ) ) ) s t r i n g )
( digitoHexadecimal
( " hx " ( or " 0 " " 1 " " 2 " " 3 " " 4 " " 5 " " 6 " " 7 " " 8 " " 9 " " A " " B " " C " " D " " E " " F " )
( arbno ( o r " 0 " " 1 " " 2 " " 3 " " 4 " " 5 " " 6 " " 7 " " 8 " " 9 " " A " " B " " C " " D " " E " " F " ) ) ) s t r i n g )
( digitoHexadecimal
( " - " " hx " ( or " 0 " " 1 " " 2 " " 3 " " 4 " " 5 " " 6 " " 7 " " 8 " " 9 " " A " " B " " C " " D " " E " " F " )
( arbno ( o r " 0 " " 1 " " 2 " " 3 " " 4 " " 5 " " 6 " " 7 " " 8 " " 9 " " A " " B " " C " " D " " E " " F " ) ) ) s t r i n g )
( flotante
( d i g i t ( arbno d i g i t ) " . " d i g i t ( arbno d i g i t ) ) n u m b e r )
( flotante
( " - " d i g i t ( arbno d i g i t ) " . " d i g i t ( arbno d i g i t ) ) n u m b e r )
( cadena ( " \ " " ( o r d i g i t l e t t e r ) ( arbno ( o r l e t t e r d i g i t ) ) " \ " " ) s t r i n g )
))
( define gramatica
’(
( programa ( ( arbno s t r u c t − d e c l ) e x p r e s i o n ) a−programa )
( e x p r e s i o n ( b o o l − e x p r e s i o n ) bool−exp )
( e x p r e s i o n ( i d e n t i f i c a d o r ) var−exp )
( e x p r e s i o n ( numero−exp ) num−exp )
( e x p r e s i o n ( cadena ) cadena−exp )
( e x p r e s i o n ( v a r i a b l e ) decl−exp )
( e x p r e s i o n ( " ( " e x p r e s i o n p r i m i t i v a e x p r e s i o n " ) " ) prim−exp )
( e x p r e s i o n ( " c o n s t " i d e n t i f i c a d o r " = " e x p r e s i o n ) const−exp )
( e x p r e s i o n ( " s e t " i d e n t i f i c a d o r " = " e x p r e s i o n ) set−exp )
( e x p r e s i o n ( " l i s t " tipo−exp " ( " ( s e p a r a t e d − l i s t e x p r e s i o n " , " ) " ) " ) l i s t a − e x p )
; ; C o n d i c i o n a l e s y e s t r u c t u r a s de c o n t r o l
( e x p r e s i o n ( " if " e x p r e s i o n " { " e x p r e s i o n " else " e x p r e s i o n " } " ) if−exp )
( e x p r e s i o n ( " s w i t c h " " ( " i d e n t i f i c a d o r " ) " " { " ( arbno " c a s e " e x p r e s i o n e x p r e s i o n ) " d e f a u l t "
,→ e x p r e s i o n " } " ) swtich−exp )
( expresion ( " for " i d e n t i f i c a d o r " = " expresion " ; " expresion " ; " expresion " { " expresion " } " )
,→ for−exp )
( expresion ( " while " expresion " { " e x p r e s i o n " } " ) while−exp )
3
; ; S e c u e n c i a c i ó n
( e x p r e s i o n ( " b e g i n " ( s e p a r a t e d − l i s t e x p r e s i o n " ; " ) " e n d " ) begin−exp )
;; Funciones
( e x p r e s i o n ( " f u n c " i d e n t i f i c a d o r " ( " ( s e p a r a t e d − l i s t i d e n t i f i c a d o r tipo−exp " , " ) " ) " e x p r e s i o n "
,→ r e t u r n " e x p r e s i o n ) func−exp )
( expresion ( " call " i d e n t i f i c a d o r "(" ( s e pa r a te d − l i st expresion " ," ) ")" ) call−exp )
;; Objetos
( e x p r e s i o n ( " n e w " i d e n t i f i c a d o r " ( " ( s e p a r a t e d − l i s t e x p r e s i o n " , " ) " ) " ) new−obj )
( expresion ( " send " i d e n t i f i c a d o r "." i d e n t i f i c a d o r "(" ( s e pa r a te d − l is t expresion " ," ) ")" )
,→ method−invoke )
( numero−exp ( d i g i t o D e c i m a l ) decimal−num )
( numero−exp ( d i g i t o O c t a l ) octal−num )
( numero−exp ( d i g i t o H e x a d e c i m a l ) hexadecimal−num )
( numero−exp ( f l o t a n t e ) float )
( s t r u c t − d e c l ( " t y p e " i d e n t i f i c a d o r " s t r u c t " i d e n t i f i c a d o r " { " ( arbno a t r i b u t o s ) ( arbno metodos ) "
,→ } " ) o b j − d e c l )
( a t r i b u t o s ( tipo−exp i d e n t i f i c a d o r ) a t t r − e x p )
( metodos ( " m e t h o d " i d e n t i f i c a d o r " ( " ( s e p a r a t e d − l i s t i d e n t i f i c a d o r tipo−exp " , " ) " ) " e x p r e s i o n "
,→ r e t u r n " e x p r e s i o n ) method−exp )
)
)
Booleanos:
4
> ( s c a n&p a r s e " f a l s e " )
#( s t r u c t : a−programa ( ) #( s t r u c t : bool−exp #( s t r u c t : f a l s e − e x p ) ) )
Listas:
> ( s c a n&p a r s e " l i s t h e x ( 0 x1 , 0 x2 , 0 x3 , 0 x4 , 0 x 5 ) " )
#( s t r u c t : a−programa
()
#( s t r u c t : l i s t a − e x p
#( s t r u c t : hex−tipo )
(#( s t r u c t : num−exp #( s t r u c t : octal−num ”0 x1 ” ) ) #( s t r u c t : num−exp #( s t r u c t : octal−num ”0 x2 ” ) ) #( s t r u c t
,→ : num−exp #( s t r u c t : octal−num ”0 x3 ” ) ) #( s t r u c t : num−exp #( s t r u c t : octal−num ”0 x4 ” ) ) #( s t r u c t :
,→ num−exp #( s t r u c t : octal−num ”0 x5 ” ) ) ) ) )
Texto:
Se utiliza el escape
”para indicar que van comillas.
2.3.2. Variables
2.3.3. Primitivas:
Las primitivas pueden operar de acuerdo al tipo de dato que se tiene, las primitivas que se tienen son:
Numéricas: +, −, ∗,pow,mod
Comparación: >, <, <=, >=, ! =, ==
Booleanos: and, or, not, xor
5
2.4.2. while:
2.4.3. for:
2.4.4. switch:
2.6. Funciones
2.6.1. Creación:
2.6.2. Invocación:
6
> ( s c a n&p a r s e " c a l l p (1 , 2 , 3 ) " )
#( s t r u c t : a−programa ( ) #( s t r u c t : c a l l − e x p p (#( s t r u c t : num−exp #( s t r u c t : decimal−num 1 ) ) #( s t r u c t :
,→ num−exp #( s t r u c t : decimal−num 2 ) ) #( s t r u c t : num−exp #( s t r u c t : decimal−num 3 ) ) ) ) )
3. Evaluación
En este taller se solicita:
Las operaciones numéricas deben permitir trabajar con flotantes, hexadecimales y octales. Si no las realiza
el punto no será válido
2. (30 puntos:) Estructuras de control
#I n t e r p r e t a d o r : i f ( 2 > 4 ) { 4 e l s e 3 }
4
#I n t e r p r e t a d o r : s w i t c h ( x ) {
c a s e 1 −0x2323
c a s e 2 32323
d e f a u l t 32 32 323}
// Supongamos que x v a l e 32
3232323
#I n t e r p r e t a d o r : f o r x = 3 ; ( x < 7 ) ; s e t x = ( x +1) { s e t y = ( y ∗ 2 ) }
// S e t e s una o p e r a c i o n de e f e c t o , e n t o n c e s d e v u e l v e v o i d
#( s t r u c t : v o i d − t i p o )
#I n t e r p r e t a d o r : w h i l e ( x < 7 ) { s e t x = ( x + 1 ) }
#( s t r u c t : v o i d − t i p o )
Para las funciones piense en una forma de cómo representarlas, no se requiere una clausura ya que existe
un sólo ambiente por todo el código, pero requerimos alguna forma de poder utilizarlas.
4. (15 puntos:) La representación de ambientes es de alcance global, es decir que existe un ambiente por
todo el código, sin embargo usted debe considerar para la variable de control en el for y el alcance de
variables dentro de las funciones.
Diseñe una representación de ambiente y genere un ambiente inicial con 3 variables con cualquier va-
lor desee darle. Explique las razones de realzar su representación.
7
// Supongamos que tenemos que x = 3
#I n t e r p r e t a d o r x
3
#I n t e r p r e t a d o r varN x = 3
" Error : x ya existe "
#I n t e r p r e t a d o r s e t x = 0 x4
#( s t r u c t : v o i d − t i p o )
#I n t e r p r e t a d o r x
0 x4