lunes, 8 de mayo de 2017

UNIDAD 4 ANÁLISIS SEMÁNTICO Y GENERACIÓN DE CÓDIGO INTERMEDIO.



4.1 Atributos


Los atributos, también llamados datos o variables miembro son porciones de información que un objeto posee o conoce de sí mismo. Una clase puede tener cualquier número de atributos o no tener ninguno. Se declaran con un identificador y el tipo de dato correspondiente. Además los atributos y tienen asociado un modificador que define su visibilidad

Los atributos son las características individuales que diferencian un objeto de otro y determinan su apariencia, estado u otras cualidades. Los atributos se guardan en variables denominadas de instancia, y cada objeto particular puede tener valores distintos para estas variables.

En general los atributos de un nodo reciben valor mediante la evaluación de las reglas semánticas asociadas a la producción usada en ese nodo propietario del atributo.

Los valores de los atributos sintetizados se calculan a partir de los valores de atributos de sus nodos hijos en el árbol de análisis sintáctico.

Los valores de los atributos heredados se calculan a partir de los valores de atributos de su nodo padre o sus nodos hermanos.


4.1.1 Atributos heredados



♞ Sirven para expresar la dependencia que hay entre una construcción del lenguaje de programación y su contexto.


♞ Siempre es posible reescribir una definición dirigida por sintaxis para que sea S-atribuida.


 ♞En ocasiones es más natural utilizar atributos heredados


4.1.2 Atributos Sintetizados




🚀 Los atributos sintetizados se utilizan ampliamente.


🚀 Si una definición dirigida por sintaxis tiene únicamente atributos sintetizados se dice que es S-atribuida.


🚀 El árbol de análisis sintáctico de una gramática S-atribuida puede decorarse mediante un recorrido en post orden.


Una de las principales propiedades de las clases es la herencia. Esta propiedad nos permite crear nuevas clases a partir de clases existentes, conservando las propiedades de la clase original y añadiendo otras nuevas.


↣ EJEMPLO:



La forma general de declarar clases derivadas es la siguiente:
      
      class <clase_derivada> : 
   [public|private] <base1> [,[public|private] <base2>] {};

 

En seguida vemos que para cada clase base podemos definir dos tipos de acceso, public o private. Si no se especifica ninguno de los dos, por defecto se asume que es private.

⏩public: los miembros heredados de la clase base conservan el tipo de acceso con que fueron declarados en ella.

private: todos los miembros heredados de la clase base pasan a ser miembros privados en la clase derivada.

De momento siempre declararemos las clases base como public, al menos hasta que veamos la utilidad de hacerlo como privadas.

Veamos un ejemplo sencillo basado en la idea del punto anterior:
               // Clase base Persona:
class Persona {
  public:
   Persona(char *n, int e);
   const char *LeerNombre(char *n) const;
   int LeerEdad() const;
   void CambiarNombre(const char *n);
   void CambiarEdad(int e);
   
  protected:
   char nombre[40];
   int edad;
};
 
// Clase derivada Empleado:
class Empleado : public Persona {
  public:
   Empleado(char *n, int e, float s);
   float LeerSalario() const;
   void CambiarSalario(const float s);
   
  protected:
   float salarioAnual;
};


Se puede ver que hemos declarado los datos miembros de nuestras clases como protected. En general es recomendable declarar siempre los datos de nuestras clases como privados, de ese modo no son accesibles desde el exterior de la clase y además, las posibles modificaciones de esos datos, en cuanto a tipo o tamaño, sólo requieren ajustes de los métodos de la propia clase.


Pero en el caso de estructuras jerárquicas de clases puede ser interesante que las clases derivadas tengan acceso a los datos miembros de las clases base. Usar el acceso protected nos permite que los datos sean inaccesibles desde el exterior de las clases, pero a la vez, permite que sean accesibles desde las clases derivadas.




Bibliografia:



http://c.conclase.net/curso/?cap=036

https://gramaticasformales.wordpress.com/category/traduccion-dirigida-por-sintaxis/

http://ocw.upm.es/lenguajes-y-sistemas-informaticos/programacion-en-java-i/Contenidos/LecturaObligatoria/12-tiposdeatributos.pdf

http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/clases1/clases.htm