TEMA 6: ANÁLISIS SEMÁNTICO DE EXPRESIONES E INSTRUCCIONES EN L-0
|
|
- Ricardo Álvaro Navarrete Ávila
- hace 6 años
- Vistas:
Transcripción
1 TEMA 6: ANÁLISIS SEMÁNTICO DE EXPRESIONES E INSTRUCCIONES EN L-0 En este tema vamos a mostrar una estrategia para llevar a cabo, partiendo del ASA obtenido en el tema 4, el resto de comprobaciones semánticas (además de la resolución de nombres) a las que es necesario someter a L-0, y que son: comprobación de tipos, L/R value y otras comprobaciones semánticas. 1.- TIPOS Y EXPRESIONES El sistema de tipos de un lenguaje de programación suele constar de 5 componentes: (a) un conjunto de tipos predefinidos simples, (b) constructores de nuevos tipos a partir de los existentes, (c) reglas de equivalencia de tipos, (d) reglas de inferencia de tipo para expresiones y (e) reglas de compatibilidad de tipos. Estos componentes en L-0 presentan la siguiente forma: (a) Los tipos predefinidos simples en L-0 son: entero, real, logico, caracter. (b) Los constructores de nuevos tipos en L-0 se clasifican en: I. tipos predefinidos compuestos: formacion. II. tipos no predefinidos: clase. Los tipos predefinidos compuestos permiten construir nuevos tipos anónimos (tipos sin nombre). (c) Las reglas de equivalencia 1. Cuándo dos tipos son equivalentes? La respuesta a esta pregunta define lo que se denomina las reglas de equivalencia de tipos del lenguaje. La equivalencia de tipos se puede considerar desde dos puntos de vista: Equivalencia por Nombre: Se dice que dos tipos T y T son equivalentes por nombre sii el nombre de T coincide con el nombre de T. Equivalencia por Estructura: Se dice que dos tipos T y T son equivalentes por estructura sii T y T tienen definiciones con estructuras equivalentes. EJEMPLO: inst clase Elemento real e consultar() dev real 1 No debemos confundir la equivalencia de tipos con la compatibilidad de tipos, concepto este último que veremos posteriormente.
2 dev e modificar(real n) e:=consultar() inst clase Elemento oculto entero e consultar() dev entero dev e modificar(entero n) e:=n Las declaraciones anteriores en L-0 definen dos tipos equivalentes si se aplica equivalencia por nombre y dos tipos no equivalentes si se aplica equivalencia estructural. EJEMPLO : inst clase Elemento1 real e consultar() dev real dev e modificar(real n) e:=consultar() inst clase Elemento2 real e consultar() dev real dev e modificar(real n) e:=consultar() Las declaraciones anteriores en L-0 definen dos tipos equivalentes si se aplica equivalencia estructural o dos tipos no equivalentes si se aplica equivalencia por nombre.
3 Cada aproximación tiene pros y contras. La equivalencia por nombre tiene una implementación más simple porque sólo necesita comparar nombres para decidir si los tipos implicados son equivalentes. La equivalencia estructural requiere almacenar la estructura de los tipos para compararlos. L-0 dispone de tipos con nombres y de tipos anónimos. Al diseñar el sistema de tipos del lenguaje L-0, tomamos las siguientes decisiones: Dos tipos anónimos L-0 son equivalentes sii tienen la misma Estructura. Dos tipos con nombre L-0 son equivalentes sii tienen el mismo Nombre. (d) Las reglas para inferir el tipo 2 de una expresión en L-0 son: a. (Base) Si v es una variablelocal/parámetro/literal de tipo T entonces v es una expresión bien formada de tipo T. b. (Base) Si atr es un atributo visible de tipo T declarado en una clase C no instanciable entonces la expresión C.atr usada es una expresión bien formada de tipo T. c. (Base) Si atr es un atributo visible de tipo T declarado en una clase C instanciable entonces la expresión o.atr es una expresión bien formada de tipo T siendo o una instancia de C. d. (Base) Si atr es un atributo de tipo T declarado en una clase C entonces la expresión atr usada en la propia clase/objeto es una expresión bien formada de tipo T. e. (Inducción) Sean exp1,..., expk un conjunto de expresiones bien formadas de tipo ENTERO y t una expresión Base bien formada de tipo FORMACION de dimensión k y tipo base T, entonces t[exp1,...,expk] es una expresión bien formada de tipo T. f. (Inducción) Sean exp1,..., expk un conjunto de expresiones bien formadas de tipo T T1,...Tk respectivamente y f un método visible con dominio T1,...Tk y rango T declarado en una clase C no instanciable entonces C.f(exp1,...,expk) es una expresión bien formada de tipo T. g. (Inducción) Sean exp1,..., expk un conjunto de expresiones bien formadas de tipo T T1,...Tk respectivamente y f un método visible con dominio T1,...Tk y rango T declarado en una clase C instanciable entonces o.f(exp1,...,expk) es una expresión bien formada de tipo T siendo o una instancia de C. h. (Inducción) Sean exp1,..., expk un conjunto de expresiones bien formadas de tipo T T1,...Tk respectivamente y f un método con dominio T1,...Tk y rango T declarado en una clase C entonces f(exp1,...,expk) usada en la propia clase/objeto es una expresión bien formada de tipo T. i. (Inducción) Sean exp1,..., expk un conjunto de expresiones bien formadas de tipo T1,...Tk respectivamente y f una función definida en un tipo predefinido de L-0 con dominio T1,...,Tk y rango T entonces la expresión f(exp1,...,expk) es una expresión bien formada de tipo T. 2 Siempre teniendo en cuenta que en L-0 no se permiten referencias adelantadas.
4 El conjunto de reglas anteriores nos permite determinar el tipo y la corrección de las expresiones bases de L-0. Entendiendo por expresiones bases los accesos a variables (atributos, parámetros y variables locales), literales y llamadas a métodos. Sin embargo, también debemos dotar al sistema con el conjunto de reglas que nos permita inferir los tipos de expresiones compuestas, como las que incluyen operadores binarios y unarios. Puesto que una expresión compuesta involucra a más de una expresión (base o no), debemos establecer también un conjunto de reglas que nos especifique que tipos pueden combinarse mediante un operador (compatibilidad de tipos). (e) Las reglas de compatibilidad. Cuándo dos tipos son compatibles? La pregunta está mal planteada, ya que dos tipos pueden ser compatibles cuando se combinan con un operador e incompatibles con otro. La compatibilidad de tipos siempre se hace respecto a los operadores y depende de la definición del lenguaje. En L-0 la regla de compatibilidad es muy simple, ya que L-0 no acepta coerciones de tipos, es decir, los tipos de las expresiones que forman una expresión compuesta deben ser equivalentes. Hay que decir que L-0 presenta un tipado estático (la inferencia y chequeo de tipos se realiza en tiempo de compilación) y fuerte (toda expresión bien formada tiene un único tipo). Ejercicio.- Partiendo del ejemplo del capítulo anterior, vamos a calcular tipos de distintas expresiones: p, p.apilar y p.apilar(i). (Solución en clase) 2.- EVALUACIÓN L/R EN LAS ASIGNACIONES La asignación es la instrucción fundamental de cualquier lenguaje de programación imperativo con la siguiente semántica informal: expresion de tipo T + lugar de almacenamiento := expresion de tipo T Adoptamos dos visiones diferentes al evaluar las expresiones situadas a izquierda y a la derecha del símbolo :=. La evaluación a de la parte izquierda produce lugares de almacenamiento (Lvalues) y la evaluación de la parte derecha produce valores funcionales clásicos (R-values). Desde el punto de vista sintáctico no hay diferencias entre la expresión de la izquierda y la expresión de la derecha. Por ejemplo, sean x e y variables enteras y la asignación x := y está compuesta de una expresión a la izquierda de tipo entero y una expresión a la derecha de tipo entero. Sin embargo, y adicionalmente, la expresión a la izquierda denota un L-value, es decir, un lugar donde ubicar el valor producido por la evaluación de la expresión y (R-value). Por ejemplo, la siguiente asignación sería incorrecta 1 := y aunque las expresiones a la izquierda y derecha concuerden en tipo porque 1 no denota lugar de almacenamiento. Concluyendo, para que una asignación sea correcta desde un punto de vista semántico debe ocurrir que las expresiones a izquierda y derecha coincidan en tipo y además que la expresión
5 de la izquierda denote un lugar para almacenar. Por lo tanto, al procesar asignaciones en L-0 es necesario realizar no sólo un test de equivalencia de tipos entre las expresiones a la izquierda y derecha del símbolo := sino un test para decidir si la expresión a la izquierda es un atributo (visible) o variable local. 3.- TREEPARSER PARA EL ANÁLISIS SEMÁNTICO EN L-0 En este apartado nos vamos a limitar a mostrar el treeparser para el análisis semántico de L-0. En las siguientes secciones describiremos tantos las estructuras de datos usadas como las funciones auxiliares. header... class AnaSem extends TreeParser options buildast=true int cont_dev // variable contador del número de instrucciones DEV en un método // Incluir todas las funciones de Análisis Semántico declaracion_modulo: #(MODULO nombre_modulo definicion_modulo) nombre_modulo : IDENT definicion_modulo: lista_declaraciones_clases lista_declaraciones_clases: (declaracion_clase)* declaracion_clase : #(CLASE nombre_clase cualificador_clase definicion_clase) cualificador_clase : INST NO_INST nombre_clase : IDENT definicion_clase : declaraciones_elementos_clase declaraciones_elementos_clase : (declaracion_elemento_clase)* declaracion_elemento_clase : #(METODO declaracion_metodo cualificador_elemento_clase) #(ATRIBUTO IDENT tipo cualificador_elemento_clase) cualificador_elemento_clase: OCULTO VISIBLE declaracion_metodo AST tipodev : tipodev =prototipo_metodo definicion_metodo[tipodev] if (cont_dev == 0)
6 error // método funcional que no devuelve nada prototipo_metodo returns [AST tipodev]: #(PROTOTIPO IDENT #(PARAMETROS declaracion_parametros) #(RESULTADO ( t: tipo cont_dev = 0 // inicializa el contador de instrucciones DEV tipodev = t v: VACIO cont_dev = -1 // marca a -1 para indicar que es un procedimiento tipodev = v ))) declaracion_parametros : (declaracion_parametro)* declaracion_parametro : #(PARAMETRO IDENT tipo) definicion_metodo [AST tipodev]: #(DEFINICION #(VARIABLES_LOCALES declaracion_variables_locales) #(INSTRUCCIONES instrucciones[tipodev]) declaracion_variables_locales : (declaracion_variable_local)* declaracion_variable_local : #(VARIABLE_LOCAL IDENT tipo) instrucciones [AST tipodev] : (instrucción[tipodev])* instruccion [AST tipodev] : #(INSTRUCCION ( instruccion_simple[tipodev] instruccion_compuesta[tipodev]) instruccion_simple [AST tipodev] : llamada_metodo asignacion retorno [tipodev] instruccion_compuesta [AST tipodev] : condicion [tipodev] iteracion [tipodev] asignacion Atr_Expr e1, e2: #(ASIGNACION e1=expresion e2=expresion ) AS_Asignacion(e1,e2) retorno [AST tipodev] Atr_Expr e: #(DEV e=expresion) cont_dev=as_devolucion( tipodev, e, cont_dev) llamada_metodo Atr_Expr a, res LinkedList l: #(LLAMADA a=acceso #(EXPRESIONES l=lista_expresiones)) res=as_llamada( a, l) if (res.gettipo().gettype()!= VACIO) error // No es un procedimiento lista_expresiones returns [LinkedList l= new LinkedList()] Atr_Expr e: (e=expresion l.add(e))*
7 condicion [AST tipodev] Atr_Expr e : #(SI e=expresion #(INSTRUCCIONES instrucciones[tipodev]) #(INSTRUCCIONES instrucciones[tipodev])) AS_Condicion( e) iteracion [AST tipodev] Atr_Expr e : #(MIENTRAS e=expresion #(INSTRUCCIONES instrucciones[tipodev])) AS_Condicion( e) expresion returns [Atr_Expr res] Atr_Expr e1,e2 LinkedList l: #(O e1=expresion e2=expresion) res=as_exp_bin_log( e1, e2) #(Y e1=expresion e2=expresion) res=as_exp_bin_log( e1, e2) #(NO e1=expresion) res=as_exp_una_log( e1) #(MAYOR e1=expresion e2=expresion) res=as_exp_bin_rel( e1, e2) #(MAYOR_IGUAL e1=expresion e2=expresion) res=as_exp_bin_rel( e1, e2) #(MENOR e1=expresion e2=expresion) res=as_exp_bin_rel( e1, e2) #(MENOR_IGUAL e1=expresion e2=expresion) res=as_exp_bin_rel( e1, e2) #(IGUAL e1=expresion e2=expresion) res=as_exp_bin_rel( e1, e2) #(DISTINTO e1=expresion e2=expresion) res=as_exp_bin_rel( e1, e2) #(MAS e1=expresion e2=expresion) res=as_exp_bin_arit( e1, e2) #(MENOS e1=expresion e2=expresion) res=as_exp_bin_arit( e1, e2) #(MENOSUNARIO e1=expresion) res=as_exp_una_arit( e1) #(POR e1=expresion e2=expresion) res=as_exp_bin_arit( e1, e2) #(DIVISION e1=expresion e2=expresion) res=as_exp_bin_arit( e1, e2) #(LLAMADA e1=acceso #(EXPRESIONES l=lista_expresiones)) res=as_llamada( e1, l) if (res.gettipo().gettype() == VACIO) error // No es un método funcional #(ACCESO_TABLA e1=acceso #(EXPRESIONES l=lista_expresiones_nv)) res=as_acceso_tabla( e1, l) e1=acceso res=e1 i:lit_entero res=as_literal( i) j:lit_real res=as_literal( j) k:lit_car res=as_literal( k) m:cierto res=as_literal( m) n:falso res=as_literal( n) acceso returns [Atr_Expr res] Atr_Expr e: e=acceso_simple res=e #(ACCESO_OBJETO r:e=acceso_simple a:ident) res=as_acceso_objeto( e, r, a) acceso_simple returns [Atr_Expr res]: #(ACCESO_SIMPLE IDENT d:declaracion_acceso) res=as_acceso_simple(d) declaracion_acceso: declaracion_modulo declaracion_clase_1 declaracion_elemento_clase_1 declaracion_parametro_1 declaracion_variable_local_1
8 lista_expresiones_nv returns [LinkedList l= new LinkedList()] Atr_Expr e: (e=expresion l.add(e))+ tipo : tipo_predefinido_simple tipo_predefinido_compuesto declaracion_clase_1 tipo_predefinido_simple : ENTERO REAL LOGICO CARACTER tipo_predefinido_compuesto : formacion formacion : #(FORMACION #(LlSTA_ENTEROS lista_enteros) (tipo_predefinido_simple declaracion_clase_1)) lista_enteros : (LIT_ENTERO)+ // DECLARACION DE CLASES EN ACCESOS SIMPLES E IDENTIFICADORES DE TIPO. NO ES NECESARIO EL ANÁLISIS SEMÁNTICO EN ESTOS ÁRBOLES. declaracion_clase_1 : #(CLASE nombre_clase_1 cualificador_clase_1 definicion_clase_1) cualificador_clase_1 : INST NO_INST nombre_clase_1 : IDENT definicion_clase_! : declaraciones_elementos_clase_1 declaraciones_elementos_clase_1 : (declaracion_elemento_clase_1)* declaracion_elemento_clase_1 : #(METODO declaracion_metodo_1 cualificador_elemento_clase_1) #(ATRIBUTO IDENT tipo_1 cualificador_elemento_clase_1) cualificador_elemento_clase_1: OCULTO VISIBLE declaracion_metodo_1: prototipo_metodo_1 definicion_metodo_1 prototipo_metodo_1: #(PROTOTIPO IDENT #(PARAMETROS declaracion_parametros_1) #(RESULTADO ( tipo_1 VACIO_1))) declaracion_parametros_1 : (declaracion_parametro_1)*
9 declaracion_parametro_1 : #(PARAMETRO IDENT tipo_1) definicion_metodo_1: #(DEFINICION #(VARIABLES_LOCALES declaracion_variables_locales_1) #(INSTRUCCIONES instrucciones_1) declaracion_variables_locales_1 : (declaracion_variable_local_!)* declaracion_variable_local_1 : #(VARIABLE_LOCAL IDENT tipo_1) instrucciones_1: (instrucción_1)* instruccion_1 : #(INSTRUCCION ( instruccion_simple_1 instruccion_compuesta_1) instruccion_simple_1 : llamada_metodo_1 asignacion_1 retorno_1 instruccion_compuesta_1 : condicion_1 iteracion_1 asignacion_1: #(ASIGNACION expresion_1 expresion_1 ) retorno_1: #(DEV expresion_1) llamada_metodo_1: #(LLAMADA acceso_1 #(EXPRESIONES lista_expresiones_1)) lista_expresiones_1: (expresion_1)* condicion_1 : #(SI expresion_1 #(INSTRUCCIONES instrucciones_1) #(INSTRUCCIONES instrucciones_1)) iteracion_1: #(MIENTRAS expresion_1 #(INSTRUCCIONES instrucciones_1)) expresion_1: #(O expresion_1 expresion_1) #(Y expresion_1 expresion_1) #(NO expresion_1) #(MAYOR expresion_1 expresion_1) #(MAYOR_IGUAL expresion_1 expresion_1) #(MENOR expresion_1 expresion_1) #(MENOR_IGUAL expresion_1 expresion_1) #(IGUAL expresion_1 expresion_1) #(DISTINTO expresion_1 expresion_1) #(MAS expresion_1 expresion_1) #(MENOS expresion_1 expresion_1) #(MENOSUNARIO expresion_1) #(POR expresion_1 expresion_1)
10 #(DIVISION expresion_1 expresion_1) #(LLAMADA acceso_1 #(EXPRESIONES lista_expresiones_1)) #(ACCESO_TABLA acceso_1 #(EXPRESIONES lista_expresiones_nv_1)) acceso_1 LIT_ENTERO LIT_REAL LIT_CAR CIERTO FALSO acceso_1: acceso_simple_1 #(ACCESO_OBJETO acceso_simple_1 IDENT) acceso_simple_1: #(ACCESO_SIMPLE IDENT declaracion_acceso_1) declaracion_acceso_1: declaracion_clase_1 declaracion_elemento_clase_1 declaracion_parametro_1 declaracion_variable_local_1 lista_expresiones_nv_1: (expresion )+ tipo_1 : tipo_predefinido_simple_1 tipo_predefinido_compuesto_1 declaracion_clase_1 tipo_predefinido_simple_1 : ENTERO REAL LOGICO CARACTER tipo_predefinido_compuesto_1 : formacion_1 formacion_1 : #(FORMACION #(LlSTA_ENTEROS lista_enteros_1) (tipo_predefinido_simple_1 declaracion_clase_1)) lista_enteros_1 : (LIT_ENTERO)+ 4.- ESTRUCTURA DE DATOS Vamos a usar una clase, a la que denominaremos Atr_Expr, para almacenar la información del tipo, L-val y R-val de cada expresión que aparezca en el programa. La información del tipo es necesaria para realizar las comprobaciones de tipos en los distintos contextos, y las
11 características de L-val y R-val son requeridas si la expresión se encuentra dentro del ámbito de una asignación. Veamos los atributos métodos de esta clase. Atr_Expr.- Atributos: o tipo (AST) AST del tipo de la expresión. o Lval (boolean) Indica la expresión tiene L-value. o Rval (boolean) Indica si la expresión tiene R-value. Métodos: o Atr_Expr() Constructor de la clase vacía. o AST gettipo() Devuelve el AST del tipo de la expresión. o boolean getlval() Devuelve el valor del atributo LVal. o boolean getrval() Devuelve el valor del atributo RVal. o settipo(ast tipo) Establece el AST del tipo de la expresión. o setlval(boolean lval) Establece el valor del atributo LVal. o setrval(boolean rval) Establece el valor del atributo RVal. 5.- FUNCIONES PARA EL ANÁLISIS SEMÁNTICO DE LAS EXPRESIONES EN L ANÁLISIS SEMÁNTICO DE LOS LITERALES Esta rutina se limita a calcular el tipo, Lval y Rval de los literales (entero, real, carácter y lógico) que aparezcan. Atr_Expr As_Literal(AST lit) Atr_Expr result=new Atr_Expr() AST tipo=null switch(lit.gettype()) case LIT_ENTERO: tipo=#(#[entero,"entero"]) break case LIT_REAL: tipo=#(#[real,"real"]) break case LIT_CAR: tipo=#(#[caracter,"caracter"]) break case CIERTO: case FALSO: tipo=#(#[logico,"logico"]) break result.settipo(tipo) result.setlval(false) result.setrval(true) return result ANÁLISIS SEMÁNTICO DE LOS ACCESOS SIMPLES
12 Esta función calcula el tipo, Lval y Rval de los accesos simples en función de la declaración que se le asoció en la etapa de resolución de nombres. Recibe como parámetro el árbol de declaración de acceso simple. Atr_Expr As_Acceso_Simple(AST dec) Atr_Expr result=new Atr_Expr() AST tipo=null switch(dec.gettype()) case MODULO: System.out.println("ERROR ) break case CLASE: tipo=dec result.setlval(false) result.setrval(false) break case ATRIBUTO: tipo=dec.getfirstchild().getnextsibling() result.setlval(true) result.setrval(true) break case METODO: tipo=dec.getfirstchild() result.setlval(false) result.setrval(false) break case PARAMETRO: tipo=dec.getfirstchild().getnextsibling() result.setlval(false) result.setrval(true) break case VARIABLE_LOCAL: tipo=dec.getfirstchild().getnextsibling() result.setlval(true) result.setrval(true) break result.settipo(tipo) return result ANÁLISIS SEMÁNTICO DE LOS ACCESOS A OBJETOS La estructura sintáctica de un acceso a objeto es la siguiente: raiz. atrib En el ASA de la expresión, raiz es un acceso simple (cuyo Atr_Expr se ha calculado con al función del apartado anterior) y atrib es un nodo IDENT.
13 La función que lleva a cabo el análisis semántico de los accesos a objeto, al igual que todas las rutinas de análisis semántico de expresiones, calcula el tipo, Lval y Rval de la expresión. Pero además realiza otros chequeos semánticos. Esta función hace lo siguiente: 1. Comprobar que la expresión raiz sea de tipo clase. 2. Si la raiz es una clase, entonces se debe comprobar que sea no instanciable. Si la raiz es un objeto, entonces se debe comprobar que sea de una clase instanciable. 3. Comprobar que atrib es un atributo/método visible del tipo clase de la raiz. 4. Resultado (Atr_Expr que devuelve la función): Si atrib es un atributo: el tipo es el tipo del atributo, Lval y Rval son true. Si atrib es un método: el tipo es el prototipo del método, Lval y Rval son false. Recibe los siguientes parámetros: Atr_Expr de la raiz (necesario para 1,2,3 y 4), AST de la raiz (necesario para 2) y el AST del atrib (necesario para 3). Atr_Expr As_Acceso_Objeto(Atr_Expr atrraiz, AST raiz, AST atrib) Atr_Expr result=new Atr_Expr() AST tiporaiz, aux, tipo // 1 tiporaiz=atrraiz.gettipo() if (tiporaiz.gettype()!= CLASE) System.out.println("ERROR ") // 2 If (raiz.getfirstchild().getnextsibling().gettype() == CLASE) if (tiporaiz.getfirstchild().getnextsibling().gettype()!= NO_INST) System.out.println("ERROR ) else if (tiporaiz.getfirstchild().getnextsibling().gettype()!= INST) System.out.println("ERROR ) // 3 aux = tiporaiz.getfirstchild().getnextsibling().getnextsibling() while(aux!= null) if (aux.gettype() == METODO) if(aux.getfirstchild().getfirstchild().equals(atrib)) break else if(aux.getfirstchild().equals(atrib)) break aux = aux.getnextsibling() if(aux==null)
14 System.out.println("ERROR ") if(aux.getfirstchild().getnextsibling().getnextsibling().gettype()!= VISIBLE) System.out.println("ERROR ") // 4 if(aux.gettype()==atributo) tipo=aux.getfirstchild().getnextsibling() result.setlval(true) result.setrval(true) else tipo=aux.getfirstchild() result.setlval(false) result.setrval(false) result.settipo(tipo) return result ANÁLISIS SEMÁNTICO DE LLAMADAS A MÉTODOS La estructura sintáctica de una llamada a un método es la siguiente: raiz ( expresiones ) En el ASA de la expresión, raiz es un acceso simple o un acceso a objeto (cuyo Atr_Expr se ha calculado con alguna de las funciones de los apartados anteriores) y expresiones es una lista de expresiones (cuyos Atr_Expr están calculados y almacenados en una LinkedList durante el treeparser). Esta función hace lo siguiente: 1. Comprobar que la expresión raiz sea de tipo método (prototipo). 2. Comprobar que los parámetros formales (descritos en el prototipo del método) coinciden en número y tipo con los parámetros reales ( expresiones ). 3. Resultado (Atr_Expr que devuelve la función): El tipo es el rango del método, Lval es false y Rval es true. Recibe los siguientes parámetros: Atr_Expr de la raiz (necesario para 1,2 y 3), LinkedList con los Atr_Expr de todos los parámetros reales (necesario para 2). Atr_Expr As_Llamada(Atr_Expr atr_raiz, LinkedList expresiones) Atr_Expr res=new Atr_Expr() Atr_Expr par_r AST par_f Iterator it=expresiones.iterator() // 1
15 if(atr_raiz.gettipo().gettype()!=prototipo) System.out.println("ERROR ") // 2 par_f=atr_raiz.gettipo().getfirstchild().getnextsibling().getfirstchild() while(par_f!= null && it.hasnext()) par_r=(atr_expr) it.next() if(!par_r.gettipo().equalstree(par_f.getfirstchild().getnextsibling())) System.out.println("ERROR ") par_f=par_f.getnextsibling() if(par_f == null && it.hasnext()) System.out.println("ERROR ") if(par_f!= null &&! it.hasnext()) System.out.println("ERROR ") // 3 res.settipo(atr_raiz.gettipo().getfirstchild().getnextsibling().getnextsibling().getfirstchild()) res.setlval(false) res.setrval(true) return res ANÁLISIS SEMÁNTICO DE LOS ACCESOS A TABLAS La estructura sintáctica de un acceso a tabla es la siguiente: raiz [ expresiones ] En el ASA de la expresión, raiz es un acceso simple o un acceso a objeto (cuyo Atr_Expr se ha calculado con alguna de las funciones de los apartados anteriores) y expresiones es una lista de expresiones (cuyos Atr_Expr están calculados y almacenados en una LinkedList durante el treeparser). Esta función hace lo siguiente: 1. Comprobar que la expresión raiz sea de tipo formación. 2. Comprobar que las expresiones son de tipo entero y que coinciden en número con las dimensiones de la formación. 3. Resultado (Atr_Expr que devuelve la función): El tipo es el tipo base de la formación, Lval y Rval lo heredan de la raiz. Recibe los siguientes parámetros: Atr_Expr de la raiz (necesario para 1,2 y 3), LinkedList con los Atr_Expr de todas las expresiones (necesario para 2). Atr_Expr As_Acceso_Tabla(Atr_Expr atr_raiz, LinkedList expresiones) Atr_Expr res=new Atr_Expr() Atr_Expr aux Iterator it=expresiones.iterator()
16 // 1 if(atr_raiz.gettipo().gettype()!=formacion) System.out.println("ERROR ") // 2 while(it.hasnext()) aux=(atr_expr) it.next() if(aux.gettipo().gettype()!= ENTERO) System.out.println("ERROR ") if(expresiones.size()!= atr_raiz.gettipo().getfirstchild().getnumberofchildren()) System.out.println("ERROR ") // 3 res.settipo(atr_raiz.gettipo().getfirstchild().getnextsibling()) res.setlval(atr_raiz.getlva()) res.setrval(atr_raiz.getrval()) return res ANÁLISIS SEMÁNTICO DE LAS EXPRESIONES BINARIAS ARITMÉTICAS La estructura sintáctica de una expresión binaria aritmética es la siguiente: expresion1 operador_aritmético expresion2 En el ASA de la expresión, expresion1 y expresion2 son expresiones bien formadas de L-0 (cuyos Atr_Expr se han calculado durante el treeparser). Esta función hace lo siguiente: 1. Comprobar que expresion1 y expresion2 tienen Rval. 2. Comprobar que los tipos de expresion1 y expresion2 son compatibles respecto al operador binario aritmético (en L-0 habría que comprobar la equivalencia de tipos de ambas expresiones). Además hay que comprobar que tanto expresion1 como expresion2 sean de tipo numérico (entero o real). 3. Resultado (Atr_Expr que devuelve la función): El tipo es el tipo de expresion1 o expresion2, Lval es false y Rval es true. Recibe los siguientes parámetros: Atr_Expr de los dos operandos (necesarios para 1,2 y 3). Atr_Expr As_Exp_Bin_Arit(Atr_Expr e1,atr_expr e2) Atr_Expr res=new Atr_Expr() // 1 if(!e1.getrval()!e2.getrval()) System.out.println("ERROR")
17 // 2 if(!e1.gettipo().equals(e2.gettipo())) System.out.println("ERROR") if(e1.gettipo().gettype()!= ENTERO && e1.gettipo().gettype()!= REAL) System.out.println("ERROR") // 3 res.settipo(e1.gettipo()) res.setlval(false) res.setrval(true) return res ANÁLISIS SEMÁNTICO DE LAS EXPRESIONES BINARIAS LÓGICAS La estructura sintáctica de una expresión binaria lógica es la siguiente: expresion1 operador_lógico expresion2 En el ASA de la expresión, expresion1 y expresion2 son expresiones bien formadas de L-0 (cuyos Atr_Expr se han calculado durante el treeparser). Esta función hace lo siguiente: 1. Comprobar que expresion1 y expresion2 tienen Rval. 2. Comprobar que los tipos de expresion1 y expresion2 son compatibles respecto al operador binario lógico (en L-0 habría que comprobar que los tipos de ambas expresiones sean lógicos). 3. Resultado (Atr_Expr que devuelve la función): El tipo es el tipo de expresion1 o expresion2, Lval es false y Rval es true. Recibe los siguientes parámetros: Atr_Expr de los dos operandos (necesarios para 1,2 y 3). Atr_Expr As_Exp_Bin_Log (Atr_Expr e1,atr_expr e2) Atr_Expr res=new Atr_Expr() // 1 if(!e1.getrval()!e2.getrval()) System.out.println("ERROR") // 2 if(e1.gettipo().gettype()!= LOGICO e2.gettipo().gettype()!= LOGICO) System.out.println("ERROR") // 3 res.settipo(e1.gettipo()) res.setlval(false) res.setrval(true) return res
18 5.8.- ANÁLISIS SEMÁNTICO DE LAS EXPRESIONES BINARIAS RELACIONALES La estructura sintáctica de una expresión binaria relacional es la siguiente: expresion1 operador_relacional expresion2 En el ASA de la expresión, expresion1 y expresion2 son expresiones bien formadas de L-0 (cuyos Atr_Expr se han calculado durante el treeparser). Esta función hace lo siguiente: 1. Comprobar que expresion1 y expresion2 tienen Rval. 2. Comprobar que los tipos de expresion1 y expresion2 son compatibles respecto al operador binario relacional (en L-0 habría que comprobar la equivalencia de tipos de ambas expresiones). 3. Comprobar que si los operandos son de tipo clase, lógico o formación, el operador que se aplica sea igual o distinto. 4. Resultado (Atr_Expr que devuelve la función): El tipo es lógico, Lval es false y Rval es true. Recibe los siguientes parámetros: Atr_Expr de los dos operandos (necesarios para 1,2, 3 y 4) y el AST del operador_relacional (necesario para 3). Atr_Expr As_Exp_Bin_Rel (Atr_Expr e1,atr_expr e2, AST op) Atr_Expr res=new Atr_Expr() AST tipo // 1 if(!e1.getrval()!e2.getrval()) System.out.println("ERROR") // 2 if(! e1.gettipo().equalstree(e2.gettipo())) System.out.println("ERROR") // 3 if ((e1.gettipo().gettype() == CLASE e1.gettipo().gettype() == LOGICO e1.gettipo().gettype() == FORMACION) && (op.gettype()!= IGUAL && op.gettype()!= DISTINTO) ) System.out.println("ERROR") // 4 tipo = #(#[LOGICO,"logico"]) res.settipo(tipo) res.setlval(false) res.setrval(true) return res
19 5.9.- ANÁLISIS SEMÁNTICO DE LAS EXPRESIONES UNARIAS ARITMÉTICAS La estructura sintáctica de una expresión unaria aritmética es la siguiente: operador_aritmético expresion En el ASA de la expresión, expresion es una expresión bien formada de L-0 (cuyo Atr_Expr se ha calculado durante el treeparser). Esta función hace lo siguiente: 1. Comprobar que expresion tiene Rval. 2. Comprobar que el tipo de expresión es compatible respecto al operador unario aritmético (en L-0 habría que comprobar que sea de tipo numérico). 3. Resultado (Atr_Expr que devuelve la función): El tipo es el tipo de expresion, Lval es false y Rval es true. Recibe el siguiente parámetro: Atr_Expr del operando (necesario para 1,2 y 3). Atr_Expr As_Exp_Una_Arit( Atr_Expr e) Atr_Expr res=new Atr_Expr() // 1 if(!e.getrval()) System.out.println("ERROR") // 2 if(e.gettipo().gettype()!= ENTERO && e.gettipo().gettype()!= REAL) System.out.println("ERROR") // 3 res.settipo(e.gettipo()) res.setlval(false) res.setrval(true) return res ANÁLISIS SEMÁNTICO DE LAS EXPRESIONES UNARIAS LÓGICAS La estructura sintáctica de una expresión unaria lógica es la siguiente: operador_unario expresion En el ASA de la expresión, expresion es una expresión bien formada de L-0 (cuyo Atr_Expr se ha calculado durante el treeparser). Esta función hace lo siguiente:
20 1. Comprobar que expresion tiene Rval. 2. Comprobar que el tipo de expresión es compatible respecto al operador unario lógico (en L-0 habría que comprobar que sea de tipo lógico). 3. Resultado (Atr_Expr que devuelve la función): El tipo es lógico, Lval es false y Rval es true. Recibe el siguiente parámetro: Atr_Expr del operando (necesario para 1,2 y 3). Atr_Expr As_Exp_Una_Log( Atr_Expr e) Atr_Expr res=new Atr_Expr() // 1 if(!e.getrval()) System.out.println("ERROR") // 2 if(e.gettipo().gettype()!= LOGICO) System.out.println("ERROR") // 3 res.settipo(e.gettipo()) res.setlval(false) res.setrval(true) return res 6.- FUNCIONES PARA EL ANÁLISIS SEMÁNTICO DE LAS INSTRUCCIONES EN L ANÁLISIS SEMÁNTICO DE LA ASIGNACIÓN La estructura sintáctica de una instrucción asignación es la siguiente: expresion1 ASIGNACION expresion2 En el ASA de la instrucción, expresion1 y expresion2 son expresiones bien formadas de L-0 (cuyos Atr_Expr se han calculado durante el treeparser). Esta función hace lo siguiente: 1. Comprobar que expresion1 tiene Lval. 2. Comprobar que expresion2 tiene Rval. 3. Comprobar que los tipos de expresion1 y expresion2 son equivalentes. Recibe los siguientes parámetros: Atr_Expr de los dos operandos (necesarios para 1,2, 3). void AS_Asignacion (Atr_Expr e1,atr_expr e2)
21 // 1 y 2 if(!e1.getlval()!e2.getrval()) System.out.println("ERROR") // 3 if(! e1.gettipo().equals(e2.gettipo())) System.out.println("ERROR") if(e1.gettipo().gettype() == FORMACION &&! e1.gettipo().equalstree(e2.gettipo())) System.out.println("ERROR") if(e1.gettipo().gettype() == CLASE &&! e1.gettipo()..getfirstchild(). equals(e2.gettipo().getfirstchild())) System.out.println("ERROR") ANÁLISIS SEMÁNTICO DE LA ITERACIÓN Y CONDICIONAL Esta función se limita a comprobar que la condición de un bucle o condicional es una expresión que tiene Rval y es de tipo Lógico. Su implementación es la siguiente: void AS_Condicion (Atr_Expr e) if(!e.getrval()) System.out.println("ERROR") if(e.gettipo().gettype() == LOGICO) System.out.println("ERROR") ANÁLISIS SEMÁNTICO DE LA DEVOLUCIÓN La estructura sintáctica de una instrucción devolución es la siguiente: DEV expresion En el ASA de la instrucción, expresión es una expresión bien formada de L-0 (cuyo Atr_Expr se ha calculado durante el treeparser). Esta función hace lo siguiente: 1. Comprobar que el método que incluye la instrucción sea un método funcional. 2. Comprobar que expresion tiene Rval. 3. Comprobar que el rango del método sea equivalente al tipo de expresión 4. Incrementa el contador de instrucciones de devolución del método y lo devuelve.
22 Recibe los siguientes parámetros: AST del rango del método (necesario para 3), Atr_Expr de la expresión (necesario para 2 y 3) y el contador de instrucciones de devolución (necesario para 1 y 4). int AS_Devolucion (AST tipo_dev, Atr_Expr e, int cont) // 1 if (cont == -1) System.out.println("ERROR") // 2 if(!e.getrval()) System.out.println("ERROR") // 3 if(! tipo_dev.equals(e.gettipo())) System.out.println("ERROR") if( tipo_dev.gettype() == FORMACION &&! tipo_dev.equalstree(e.gettipo())) System.out.println("ERROR") if( tipo_dev.gettype() == CLASE &&! tipo_dev..getfirstchild(). equals(e.gettipo().getfirstchild())) System.out.println("ERROR") // 4 return cont+1
TEMA 2: PARSERS Y CONSTRUCCIÓN DEL ÁRBOL DE SINTAXIS ABSTRACTA PARA L-0
TEMA 2: PARSERS Y CONSTRUCCIÓN DEL ÁRBOL DE SINTAXIS ABSTRACTA PARA L-0 En este tema se divide en tres secciones: (1) la definición el analizador léxico de L-0, (2) el conjunto de reglas sintácticas de
Más detallesUnidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones
Unidad Didáctica 2 Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 1.0.3 Índice
Más detallesPROCESADORES DEL LENGUAJES Enero 2015
PROCESADORES DEL LENGUAJES Enero 2015 NOMBRE El lenguaje ASSERTION ASSERTION es un lenguaje de programación. Sus programas pueden incluir asertos. Un aserto es una condición lógica construida con las siguientes
Más detallesTEMA 3: ANÁLISIS SEMÁNTICO
1 TEMA 3: ANÁLISIS SEMÁNTICO OBJETIVO Dar respuesta a las siguientes preguntas: Qué es el análisis semántico de un lenguaje? Cómo se diseña y construye un analizador semántico? EL PROBLEMA DEL CÁLCULO
Más detallesJava. Introducción a la Programación Orientada a Objetos
Java Java es un lenguaje de programación presentado en 1995 enfocado a: soportar los fundamentos de la programación orientada a objetos. generar código independiente de la arquitectura de la computadora
Más detallesPROCESADORES DEL LENGUAJES Ev. Alternativa
PROCESADORES DEL LENGUAJES Ev. Alternativa 2016-17 NOMBRE: GRUPO: EL LENGUAJE LVECT LVECT es un lenguaje de programación secuencial. El programa LVECT consta de declaraciones de variables y secuencia de
Más detallesPRÁCTICA DE PROCESADORES DE LENGUAJE EVALUACIÓN ORDINARIA CURSO 2009/2010 OBJETIVO DE LA PRÁCTICA
PRÁCTICA DE PROCESADORES DE LENGUAJE EVALUACIÓN ORDINARIA CURSO 2009/2010 OBJETIVO DE LA PRÁCTICA El objetivo de la práctica es desarrollar un compilador utilizando las herramientas flex y bison y el lenguaje
Más detallesDepartamento de Lenguajes y Sistemas Informáticos Procesadores de Lenguajes
1 ANÁLISIS SEMÁNTICO OBJETIVO Problemas para consolidar el diseño y construcción de analizadores semánticos. PROBLEMA 1: LA RUPTURA DE CONTROL INALCANZABLE Supongamos un lenguaje de programación secuencial
Más detallesVARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E
Java Java es un lenguaje de programación presentado en 1995 enfocado a: soportar los fundamentos de la programación orientada a objetos. generar código independiente de la arquitectura de la computadora
Más detallesDESCRIPCIÓN DEL LENGUAJE DE PROGRAMACIÓN P-0
DESCRIPCIÓN DEL LENGUAJE DE PROGRAMACIÓN P-0 Este documento define los elementos de programación del lenguaje P-0, basado en un subconjunto del lenguaje de programación Arduino. 1.- PROGRAMA Un programa
Más detallesCompiladores e Intérpretes Análisis Semántico IV
1 Compiladores e Intérpretes Análisis Semántico IV Sebastian Gottifredi 2018 Repaso 2 Repaso El análisis semántico es el encargado validar y entender el significado del programa Para esto el analizador
Más detallesCurso de Java Introducción a la Programación II
Curso de Java Introducción a la Programación II Jaime Fernández Martín Curso INEM 02830. Programación en Java Marzo 2010 Índice 1 Tipos Java 2 Decalaración de variables 3 Operadores aritméticos Índice
Más detallesUnidad Didáctica 3. Tipos genéricos. Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos
Unidad Didáctica 3 Tipos genéricos Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Definición de tipo genérico Hablamos de un tipo genérico cuando el tipo en cuestión depende
Más detallesOperadores. Java es un lenguaje rico en operadores, que son casi idénticos a los de C/C++.
Operadores Java es un lenguaje rico en operadores, que son casi idénticos a los de C/C++. Operadores aritméticos Son operadores binarios (requieren siempre dos operandos) que realizan las operaciones aritméticas
Más detallesInformática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales
UNA / AREA TRANSDEPARTAMENTAL DE ARTES MULTIMEDIALES Licenciatura en Artes Multimediales Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales JavaScript Algoritmo
Más detallesComprender las diferencias entre tipos de datos primitivos similares, y aprender a elegir el tipo más conveniente en cada caso.
Elementos básicos de programación en Java Objetivos del tema Conocer la estructura básica de un programa Java. Comprender los conceptos de tipo, valor y variable. Comprender las diferencias entre tipos
Más detallesPROCESADORES DEL LENGUAJES Enero 2018
PROCESADORES DEL LENGUAJES Enero 2018 NOMBRE: GRUPO: LENGUAJE LR3 El lenguaje de programación LR3 permite expresar programas secuenciales con los siguientes recursos: (a) Declaraciones de variables de
Más detallesCAPÍTULO IV: 4.1 Introducción a la. Programación Funcional
CAPÍTULO IV: Programación Funcional 4.1 Introducción a la Programación Funcional 1 Programación Funcional Paradigma diferente a los imperativos, que se aleja de la máquina de von Neumann Basado en funciones
Más detallesProcesadores de lenguaje Tema 5 Comprobación de tipos
Procesadores de lenguaje Tema 5 Comprobación de tipos Departamento de Ciencias de la Computación Universidad de Alcalá Resumen Sistemas de tipos. Expresiones de tipo. Equivalencia de tipos. Sobrecarga,
Más detallesEstructura de un programa en Java. Tipos de datos básicos. class miprimerprograma{ // comentario, no es parte del programa
Contenido Estructura de un programa en Java... 2 Tipos de datos básicos... 2 Operadores... 3 Literales... 4 Entrada / Salida... 4 Sentencias condicionales... 5 Funciones... 5 Ejercicios... 6 Variables,
Más detallesCentro Asociado Palma de Mallorca. Antonio Rivero Cuesta
Centro Asociado Palma de Mallorca Antonio Rivero Cuesta La Sintaxis de Java II... 6 Estructuras de control... 7 Estructuras de selección... 8 Sentencia if... 9 Sentencia if - else... 12 Operador condicional...
Más detallesPROCESADORES DEL LENGUAJES Septiembre 2017
PROCESADORES DEL LENGUAJES Septiembre 2017 NOMBRE: GRUPO: LENGUAJE DE PROGRAMACIÓN MP Un programa MP consta de un conjunto de interfaces para declarar procedimientos y un bloque para definir variables
Más detallesIntroducción a c++ Introducción a la programación EIS Informática III
Introducción a c++ Un lenguaje de programación es un lenguaje formal diseñado para realizar procesos que pueden ser llevados a cabo por máquinas como las computadoras. Pueden usarse para crear programas
Más detallesTema 2. El lenguaje JAVA
Tema 2. El lenguaje JAVA Nomenclatura habitual Variables Tipos de variables Tipos primitivos Referencias Arrays Operadores Operadores de Java Precedencia de operadores Sentencias de control Sentencias
Más detallesPráctica 2. Reutilización de código Elementos básicos del lenguaje Java Definición de variables, expresiones y asignaciones
Práctica 2 Reutilización de código Elementos básicos del lenguaje Java Definición de variables, expresiones y asignaciones Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos
Más detallesCarlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas
2 - Introducción al lenguaje Java, identificadores y comentarios. Carlos Montenegro Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas 1. Introducción: Java tiene como todos
Más detallesPROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez
PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez Elementos de lenguaje: Identificadores Tipos de datos 2 Tipos de datos primitivos 3 Tipos de datos referenciados Clases Interfaces Arrays
Más detallesEscuela Normal Superior N 40 Mariano Moreno. Cuadernillo Propedéutico 2017 Nivel Superior
Escuela Normal Superior N 40 Mariano Moreno Cuadernillo Propedéutico 2017 Nivel Superior INDICE Página Datos 1 Tipos de Datos 2 Variables 3 Constantes 4 Operadores y Expresiones 5 Algoritmos - Algoritmos
Más detallesAnálisis semántico Tabla de símbolos, chequeo de tipos y representaciones internas
Análisis semántico Tabla de símbolos, chequeo de tipos y representaciones internas Análisis semático v1.2 c 2005 José Fortes Gálvez p.1 Análisis?... semántico? La semántica corresponde al significado asociado
Más detallesVARIABLES AUTOMÁTICAS
VARIABLES AUTOMÁTICAS Perl es un lenguaje muy flexible y con unas instrucciones muy potentes y útiles. Uno de los aspectos más destacables en este sentido es el de las expresiones regulares, hay multitud
Más detallesJava posee dos grandes categorías de tipos para las variables:
Declaración identificador tipo int i; i entero String s; s referencia a string int a[]; a referencia a arreglo de enteros int[] b; b referencia a arreglo de enteros Java posee dos grandes categorías de
Más detallesLABORATORIO DE PROCESADORES DE LENGUAJE Curso: Práctica 2: Analizador léxico/sintáctico/semántico con Flex y Bison
13048- LABORATORIO DE PROCESADORES DE LENGUAJE Curso: 2011-2012 Práctica 2: Analizador léxico/sintáctico/semántico con Flex y Bison Se trata de realizar, mediante el generador de analizadores léxicos FLEX
Más detallesAnálisis semántico Tabla de símbolos, chequeo de tipos y representaciones internas
Análisis semántico Tabla de símbolos, chequeo de tipos y representaciones internas Análisis semático c 2001 José Fortes Gálvez p.1 Análisis?... semántico? La semántica corresponde al significado asociado
Más detallesCentro Asociado Palma de Mallorca. Antonio Rivero Cuesta
Centro Asociado Palma de Mallorca Antonio Rivero Cuesta La Sintaxis de Java I... 5 Tipos de datos... 6 Tipos de datos simples... 7 Operadores... 11 Operadores Aritméticos... 12 Operadores relacionales...
Más detallesComponentes Básicos. InCo. InCo Componentes Básicos 1 / 28
Componentes Básicos InCo InCo Componentes Básicos 1 / 28 Modelo de Computación Vemos al computador como un procesador de datos. +------------+ Entrada ===> Computador ===> Salida +------------+ InCo Componentes
Más detallesIntroducción a Java. Introducción a Java. Programación I
Introducción a Java Introducción a Java Programación I Como Funciona Tipos de Datos TIPO TAMAÑO RANGO byte 8 bits Valores numéricos de 128 a 127 short 16 bits Valores numéricos de 32.768 a 32.767 int 32
Más detallesDiseño de compiladores Recordando la clase anterior
Diseño de compiladores Recordando la clase anterior Control de Tipos public class Clase1 implements Interfaz1 private string entero1; void metodo1() int[] x = new string; x[5] = entero1 * y; void metodo1()
Más detallesGENERACIÓN DE CÓDIGO INTERMEDIO ÁRBOLES DE SINTAXIS ABSTRACTA (ASA)
Todos los derechos de propiedad intelectual de esta obra pertenecen en exclusiva a la Universidad Europea de Madrid, S.L.U. Queda terminantemente prohibida la reproducción, puesta a disposición del público
Más detalles2ª Parte: Problemas (5 puntos sobre 10)
NOMBRE: APELLIDOS: NIA: GRUPO: 2ª Parte: Problemas (5 puntos sobre 10) Duración: 1 hora 45 minutos Puntuación máxima: 5 puntos Fecha: 17 de Junio de 2013 PROBLEMA 1 (3 puntos) El sistema de gestión de
Más detallesEstructuras de control selectivas
Práctica 3 Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión 2.0.2 Concepto de sentencia y estructura de control El cuerpo de los métodos
Más detallesEstructuras de Datos. 14 de junio de Apellidos
Ejercicio 1) (3 puntos). Dado el TAD Pila de Números Enteros con las siguientes operaciones: boolean pilavacia (); void apilar (int x); int desapilar () throws PilaVacia; SE PIDE: Codificar un método estático
Más detallesTema 2.- Objetos y mensajes
Tema 2.- Objetos y mensajes 1. Objetos y mensajes: mecanismo de envío de mensajes...2 2. SMALLTALK: EXPRESIONES...3 2.1. LITERALES: designan objetos constantes...3 2.2. NOMBRES DE VARIABLES: identifican
Más detallesTema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN
Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN - Introducción - Sintaxis - Semántica básica - Tipos de datos - Expresiones y enunciados - Procedimientos y ambientes - Tipos abstractos de datos y módulos
Más detallesAnálisis semántico: Comprobación de tipos
Análisis semántico: Comprobación de tipos Expresiones de tipos, sistemas de comprobación de tipos, equivalencia, resolución de sobrecargas y unificación. Introducción Objetivo de comprobación estática:
Más detallesIntroducción a Java (II) Dr. (c) Noé Alejandro Castro Sánchez
Introducción a Java (II) Dr. (c) Noé Alejandro Castro Sánchez Sintaxis de Java Sintaxis Define las reglas que determinar el uso de palabras clave, operadores y variables para construir y evaluar expresiones.
Más detallesEXPRESIONES Y OPERADORES
EXPRESIONES Y OPERADORES Una expresión es un conjunto de operandos y operadores cuyo resultado puede ser evaluado. Las expresiones constituyen la base de cualquier aplicación y se construyen agrupando
Más detallesJavaScript Básico. Elementos Básicos: Comentarios: Literales: Valores que puede tomar una variable o una constante.
Javascript (II) 1 Elementos Básicos: Comentarios: Para una línea // Esto es un Comentario Para un bloque /*......... */ Literales: Valores que puede tomar una variable o una constante. Ejemplos: "Soy una
Más detallesConstrucciones del Lenguaje Java
Construcciones del Lenguaje Java Autor: Juan Alberto López Cavallotti Versión de Java: 5 / 6 Comentarios Comentario de Línea Comentario Multilínea //Esto es un comentario. /* Esto comenta varias lineas.
Más detallesPROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 4
PROCESADORES DE LENGUAJES I PRÁCTICA DE LABORATORIO 4 En esta práctica trabajaremos con ANTLR a nivel semántico utilizando gramáticas con atributos. ANTLR permite implementar con facilidad los dos modelos
Más detallesCentro Asociado Palma de Mallorca. Antonio Rivero Cuesta
Centro Asociado Palma de Mallorca Introducción Práctica de Programación Java Antonio Rivero Cuesta Sesión III La Sintaxis de Java II... 6 Estructuras de Control... 7 Estructuras de Selección... 8 Sentencia
Más detallesProgramación Estructurada. Sesión 2:El lenguaje de programación C
Programación Estructurada Sesión 2:El lenguaje de programación C Contextualización Una parte importante del lenguaje C son las palabras reservadas, son identificadores con un significado predefinido. Estas
Más detallesIntroducción a PL/SQL
Introducción a PL/SQL Grupo de Ingeniería del Software y Bases de Datos Departamento de Lenguajes y Sistemas Informáticos Universidad de Sevilla noviembre 2011 Objetivos de este tema Conocer PL/SQL. PL/SQL
Más detallesSobre Carga de Operadores
Programación Orientada o Objetos Univesidad de Los Andes - Facultad de Ingeniería Escuela de Sistemas Programación Digital II Profesor: Gilberto Diaz gilberto@ula.ve Las operaciones tradicionales que se
Más detallesPROGRAMACIÓN GENÉRICA
PROGRAMACIÓN GENÉRICA Lenguajes de Programación - Orientación a Objetos: Progr. Genérica 1 Programación genérica Objetivo: escribir algoritmos genéricos, independientes de las clases concretas de los datos
Más detallesAnálisis semántico. Análisis semántico. Índice (I)
Análisis semántico Índice (I) Marina de la Cruz Alfonso Ortega Objetivo del análisis semántico Decisiones para la construcción de un analizador semántico Análisis semántico con Bison Nivel de indirección
Más detalles3.3 Conceptos Básicos del Lenguaje Java
3.3 Conceptos Básicos del Lenguaje Java Conjunto de Caracteres Java utiliza Unicode, un conjunto de caracteres de 16 bits Java permite leer ASCII de 7-bit o Latin-1, conviertiéndolo a Unicode Son pocos
Más detallesInformática General 2018 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales
UNA / AREA TRANSDEPARTAMENTAL DE ARTES MULTIMEDIALES Licenciatura en Artes Multimediales Informática General 2018 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales JavaScript - Programación
Más detallesPrefacio 25 Organización de la Unidad Didáctica Cómo utilizar el libro Objetivos docentes... 27
ÍNDICE Prefacio 25 Organización de la Unidad Didáctica.................... 25 Cómo utilizar el libro............................. 26 Objetivos docentes.............................. 27 1 Fundamentos de
Más detalles1. Repaso del Lenguaje C M.C. Luis A. Zarza López
1. Repaso del Lenguaje C M.C. Luis A. Zarza López Graficación por Computadora Universidad Tecnológica de la Mixteca Julio de 2016 Introducción El lenguaje C fue desarrollado en la década de 1970 en el
Más detalles4. Operadores Operador asignación
Programación orientada a objetos con Java 43 4. Operadores Objetivos: a) Describir los operadores (aritméticos, incrementales, de relación, lógicos y de asignación) y los tipos de dato primitivos sobre
Más detallesTema 7. Generación de código
Departamento de Tecnologías de la Información Tema 7 Generación de código Ciencias de la Computación e Inteligencia Artificial Índice 7.1 Visión general 7.2 Código de tres direcciones 2 Índice 7.1 Visión
Más detallesLENGUAJE. Tema 2 Elementos de un programa
LENGUAJE Tema 2 Elementos de un programa ELEMENTOS DE UN PROGRAMA Comentarios. Identificadores. Constantes. Variables. Operadores. Sentencias o instrucciones. COMENTARIOS Los comentarios en C pueden ocupar
Más detallesPHP: Lenguaje de programación
Francisco J. Martín Mateos Carmen Graciani Diaz Dpto. Ciencias de la Computación e Inteligencia Artificial Universidad de Sevilla Tipos de datos Enteros Con base decimal: 45, -43 Con base octal: 043, -054
Más detallesIntroducción al lenguaje C
Introducción al lenguaje C Programación 2 Profesorado de Informática CeRP del Suroeste, Colonia, Uruguay 15 de marzo de 2016 Programación 2 Introducción al lenguaje C 15 de marzo de 2016 1 / 34 Objetivos
Más detallesDocente: Juan Carlos Pérez P. Alumno : Fecha : Nota:
Docente: Juan Carlos Pérez P. Alumno : Fecha : Nota: Justificación: Se pretende con éste contribuir a que el alumno se inicie y conozca el entorno del IDE en la creación de pequeños programas en java Objetivos:
Más detallesUnidad II: Análisis semántico
Unidad II: Análisis semántico Se compone de un conjunto de rutinas independientes, llamadas por los analizadores morfológico y sintáctico. El análisis semántico utiliza como entrada el árbol sintáctico
Más detallesGENERACIÓN DE CÓDIGO INTERMEDIO EJEMPLOS PARA DISTINTAS ESTRUCTURAS DE DATOS
Todos los derechos de propiedad intelectual de esta obra pertenecen en exclusiva a la Universidad Europea de Madrid, S.L.U. Queda terminantemente prohibida la reproducción, puesta a disposición del público
Más detallesProgramación Estructurada
Programación Estructurada PROGRAMACIÓN ESTRUCTURADA 1 Sesión No. 2 Nombre: El lenguaje de programación C Contextualización Una constante en todos los lenguajes de programación (viejos y nuevos) es la implementación
Más detallesUn calculadora avanzada... y algo más!
INFORMÁTICA, GRUPO D Un calculadora avanzada... y algo más! Vamos a familiarizarnos con el entorno interactivo de Python. Vamos a construir expresiones aritméticas y a guardar los resultados en variables
Más detallesEl lenguaje C. 1. Identificadores, constantes y variables
Principios de Programación El lenguaje C 1. Identificadores, constantes y variables 1.1. Conceptos de memoria Los nombres de variable como x, y, suma corresponden a localizaciones o posiciones en la memoria
Más detallesTema 2: Elementos básicos de un programa. Tipos de datos, variables y constantes Asignación Operadores y expresiones
Tema 2: Elementos básicos de un programa Tipos de datos, variables y constantes Asignación Operadores y expresiones Ejemplo de programa Dados dos números, leídos desde el teclado, visualizar el mayor #include
Más detallesProcesadores del Lenguaje Práctica 1: Ejemplo sencillo
Procesadores del Lenguaje Práctica 1: Ejemplo sencillo ANTLR es una herramienta que integra la generación de analizadores léxicos, sintácticos, árboles de sintaxis abstracta y evaluadores de atributos.
Más detallesJavaScript: Lenguaje de programación
Francisco J. Martín Mateos Carmen Graciani Diaz Dpto. Ciencias de la Computación e Inteligencia Artificial Universidad de Sevilla Literales Enteros Con base decimal: 45, -43 Con base octal: 043, -054 Con
Más detalles2.2 Nombres, Ligado y Ámbito
2.2 Nombres, Ligado y Ámbito Ligado estático y dinámico, reglas de ámbito y prueba de tipos. Conceptos Nombres e Identificadores Variables Tipos Ámbito Constantes Nombres Identificador que designa en el
Más detallesGeneración de Código Intermedio
Generación de Código Intermedio Programación II Margarita Álvarez Generación de código intermedio Con la generación de código intermedio se inicia la tarea de síntesis. Aunque un programa fuente se puede
Más detallesTema 5. Análisis semántico
Departamento de Tecnologías de la Información Tema 5 Análisis semántico Ciencias de la Computación e Inteligencia Artificial Índice 5.1 Características del análisis semántico 5.2 Gramáticas atribuidas
Más detallesCOMPILADORES. Tema 4. Análisis semántico
COMPILADORES Tema 4. Análisis semántico Presenta: David Martínez Torres Universidad Tecnológica de la Mixteca Instituto de Computación Oficina No. 37 dtorres@mixteco.utm.mx Contenido 1. Funcionalidad del
Más detallesTema 2: Desarrollo de Algoritmos. E.E. de Algorítmica
Tema 2: Desarrollo de Algoritmos E.E. de Algorítmica Temas a tratar Identificadores Variables Constantes Tipos de Datos Separadores Operadores Aritméticos Unarios Relacionales y Condicionales Nivel de
Más detallesAlgoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2
Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2 Contenidos: 1. Definición de clases 2. Implementación de los métodos 3. Constructores y destructores 4. Objetos
Más detallesING1310 Introducción a la Computación. Python. Conceptos Básicos. Carlos Reveco
ING1310 Introducción a la Computación Python Conceptos Básicos Carlos Reveco creveco@dcc.uchile.cl careveco@miuandes.cl Facultad de Ingeniería/Universidad de los Andes/Chile Rev : 254 C.Reveco Facultad
Más detallesProgramación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 2. Lenguaje de programación y ejecución de un programa
Programación 1 Tema I. Conceptos y elementos básicos de Programación Lección 2. Lenguaje de programación y ejecución de un programa 1 Léxico, sintaxis y semántica de un lenguaje #include #include
Más detallesRepaso Lenguaje C Área de Servicios Programación (Ing. Elect. y Prof. Tec.), Programación I (TUG y TUR) y Electrónica programable (TUE)
Repaso Lenguaje C OBJETOS Variables Constantes Variable: objeto del ambiente cuyo contenido puede cambiar. Constante: objeto cuyo contenido no puede cambiar. Variables: - un nombre que la identifica. Deben
Más detallesESTRUCTURAS DE DATOS Y ALGORITMOS
ESTRUCTURAS DE DATOS Y ALGORITMOS CURSO 2009 PRÁCTICO 8 Nota: al igual que en los prácticos 6 y 7, en los problemas que siguen se usarán los tipos lista y árbol binario, como tipos abstractos, cada uno
Más detallesLenguaje C. República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III
República Bolivariana de Venezuela Fundación Misión Sucre Aldea Fray Pedro de Agreda Introducción a la Programación III Lenguaje C 1 Puntos previos Los códigos fuentes generados en C requieren ser compilados
Más detallesInformática. JavaScript: Lenguaje de programación. Fco J. Martín Mateos Carmen Graciani
Informática JavaScript: Lenguaje de programación Fco J. Martín Mateos Carmen Graciani Dpto. Ciencias de la Computación e Inteligencia Artificial Universidad de Sevilla Literales Enteros Con base decimal:
Más detallesTeoría 7. Lenguaje C. Int. a la Computación- Int. a la Programación Fund. De la Informática
Teoría 7 Primer Cuatrimestre - 2017 1 Etapas en el proceso de resolver un problema: 1- Comprender el problema: lograr una abstracción 4 Descomposición del problema. 2- Bosquejar una solución: 4 Determinar
Más detallesUNIDAD 2 Descripción de un programa
Descripción de un programa Estructura general de un programa. Elementos básicos. Tipos de datos simples: enteros, reales y carácter. Representación de datos en memoria. Operaciones sobre tipos de datos
Más detallesCompiladores: Análisis Semántico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inès Alvarez V.
Compiladores: Análisis Semántico Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inès Alvarez V. Verificaciòn de tipos Se puede hacer en forma Estàtica: en tiempo
Más detallesSebastián García Galán
Universidad de Jaén E.U.P. Linares Dpto. Telecomunicaciones Área de Ingeniería Telemática Sebastián García Galán sgalan@ujaen.es Variables y tipos de datos Operaciones y operadores Clases y objetos Tipos
Más detallesGrado en Ingeniería Informática. Estructura de Datos y Algoritmos, Grupo 84M, 2014/ de Marzo de
Grado en Ingeniería Informática Estructura de Datos y Algoritmos, Grupo 84M, 2014/2015 12 de Marzo de 2015 Nombre y Apellidos:... PROBLEMA 1 (1 punto) Programación Orientada a Objetos. Una empresa de alquiler
Más detallesESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º
1. Ejercicio (1 puntos) Dado el array A={8, 3, 7, 1, 4, 9, 5, 2, 6 (a) Escribir la secuencia de ordenación del array A por medio del algoritmo de InsertionSort. {8, 3, 7, 1, 4, 9, 5, 2, 6 {3, 8, 7, 1,
Más detallesInformática General Cátedra: Valeria Drelichman Pedro Paleo Leonardo Nadel Norma Morales
Informática General 2018 Cátedra: Valeria Drelichman Pedro Paleo Leonardo Nadel Norma Morales Qué es JavaScript? Se trata de un lenguaje de tipo script compacto, basado en objetos y guiado por eventos
Más detallesÍndice general 7. Presentación 15
ÍNDICE GENERAL Índice general 7 Presentación 15 1. Introducción 19 1.1. Antecedentes históricos de la computación................... 19 1.2. Definiciones previas............................... 24 1.3.
Más detallesLección 2 Introducción al lenguaje C
Lección Introducción al lenguaje C Decimal Binario Hexadecimal A B C D E F Octal Equivalencia entre decimal, binario, hexadecimal y octal. Código ASCII (American Standard Code for Information Interchange)
Más detallesAlgoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos
Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos 1! 1. Algoritmos recursivos " 1.1 Algoritmos recursivos. Recursión simple " 1.2 Algoritmos con vuelta atrás y ejemplos! 2. Complejidad de
Más detallesExamen de Estructuras de Datos y Algoritmos (Ingeniería Informática)
Examen de Estructuras de Datos y Algoritmos (Ingeniería Informática) Primera parte (50% nota del examen) Septiembre 2009 1) Se desea hacer un método con la cabecera que se muestra abajo que cree y retorne
Más detallesParadigma Funcional Caso de estudio: ML. Lenguajes de Programación 2017
Paradigma Funcional Caso de estudio: ML Lenguajes de Programación 2017 Paradigma Funcional FUNCIÓN: Mapeo de un dominio en un rango El mapeo se puede describir por medio de una EXPRESIÓN f(1) = 2 f(2)
Más detallesTema: Estructuras de Selección en C#.
2 Programación I Tema: Estructuras de Selección en C#. Programación I. Guía 4 3 Facultad: Ingeniería Escuela: Ingeniería en Computación Asignatura: Programación I Objetivos Utilizar las instrucciones de
Más detalles