Diferencia entre revisiones de «Usuario:ManuelRomero/preferencias/compiladores/analisisSemático»

De WikiEducator
Saltar a: navegación, buscar
Línea 89: Línea 89:
 
  tVECTOR '[' rango']' resto_variable_compuesta{$$=$5;}
 
  tVECTOR '[' rango']' resto_variable_compuesta{$$=$5;}
 
  ;
 
  ;
*Vamos a crear la produuccion '''resto_variable_compuesta la cual puede o no empeza por rango como veremos
+
*Vamos a crear la produuccion '''resto_variable_compuesta''' la cual puede o no empeza por rango como veremos
*Ademas a la produccion '''resto_variable_compuesta ''' le vamos a asignar un atributo TIPO_VARIABLE_COMPUESTA  
+
*Ademas a la produccion '''resto_variable_compuesta''' le vamos a asignar un atributo TIPO_VARIABLE_COMPUESTA  
 
<source lang=C>
 
<source lang=C>
 
typedef enum{
 
typedef enum{
Línea 100: Línea 100:
 
#accion
 
#accion
 
*La acción '''{$$=$5;}''' preciamente pasa el valor de dicho atributo de la producción '''' resto_variable_compuesta''' a la producción '''variable_compuesta'''
 
*La acción '''{$$=$5;}''' preciamente pasa el valor de dicho atributo de la producción '''' resto_variable_compuesta''' a la producción '''variable_compuesta'''
 +
====rango====
 +
*Esta producción va a aportar información que debemos almacenar en la tabla de simbolos,
 +
*El problema que ya conocemos es que hasta que no tengamos el identificador de la variable que va a tener este rango no lo podemos hacer, así que hay que porpagar esto con atributos heredados.
  
 +
==PROGRAMA==
 +
*primera producción
 +
*Producción obligatoria
 +
*define de qué consta un programa
 +
programa : tPROGRAMA tIDENTIFICADOR ';' declaracion_variables declaracion_acciones bloque_instrucciones
 +
*Acciones a realizar
 +
#Dar de alta el identificador del programa para no volver a usarlo
 +
#Después de la última instrucción eliminamos items de la tabla de símbolos
 +
#Para crear el XML del programa, cada vez que hay un identificador creo un tag diciendo lo que es y lo cierro al final de su ámbito
 +
 +
<source lang=cpp>
 +
programa:
 +
    tPROGRAMA tIDENTIFICADOR ';'
 +
    {
 +
      nivel = 0;
 +
      inicializar_tabla (tabsim);
 +
      /*El identificador del programa
 +
      Es el primer símbolo y por lo tanto seguro
 +
      que no va a exixtir, por lo que no lo buscamos*/
 +
      introducir_programa(tabsim,$2.NId,0);
 +
      AbreTag(xmlin,$2.NId,nivel-1);
 +
    }
 +
 +
    declaracion_variables
 +
    declaracion_acciones
 +
    bloque_instrucciones
 +
    {
 +
      eliminar_variables (tabsim, nivel);
 +
      eliminar_parametros_ocultos(tabsim,nivel+1);
 +
      eliminar_acciones (tabsim, nivel);
 +
      eliminar_programa(tabsim);
 +
      CierraTag(xmlin,$2.NId,nivel-1);
 +
    }
 +
;
 +
</source>
 +
 +
==declaracion_variables==
 +
*produccion optativa (puede haber o no variables en un programa)
 +
*''lista de variables'' que puede tener un programa
 +
*Acciones a realizar
 +
#ninguna ya que no tenemos ninún terminal solo producciones
 +
*Produccion para yacc
 +
[[Archivo:declaracionVariables.png]]
 +
Vemos que puede estar vacía (épsidon) o que puede contener '''lista de declaraciones''' seguido del token  '''punto y coma'''  ''';'''
 +
;Código en yaac
 +
declaracion_variables:
 +
|    lista_declaraciones ';'
 +
;
 +
 +
===lista_declaraciones===
 +
<br><br/>
 +
{{Definicion|'''Una lista''' de elementos  uno o varios elementos}}
 +
*En este caso va a ser una lista de declaraciones: '''una (declaracion) o varias declaraciones (lista_declaraciones)'''
 +
*En yacc siempre usaremos  una recursividad por la izquierda (ver producción)
 +
*Acciones a realizar
 +
#ninguna ya que no tenemos ningún terminal solo producciones
 +
 +
<source lang=cpp>
 +
  lista_declaraciones ';' declaracion
 +
|    declaracion
 +
;
 +
</source>
 +
===declaracion===
 +
<br><br/>
 +
{{Definicion|'''declaracion de una variable''' es un tipo de variable seguido de una serie de identificadores que representan las variables}}
 +
*Una declaracion puede ser de variables simple o un variables compuesta
 +
*La forma de daclarar es decir el tipo de variable y luego una lista (1 o mas) de  identificadores
 +
*Acciones a realizar
 +
#ninguna ya que no tenemos ninún terminal solo producciones
 +
;Producción
 +
[[imagen:declaracion.png]]
 +
;codigo en yacc
 +
  variable_simple lista_identificadores
 +
|variable_compuesta identificadores_variable_compuesta
 +
;
 +
 +
===variable_simple===
 +
===identificadores===
 +
===variable_compuesta===
 +
*Esta producción es un poco complicada ya que puede darse dos casos en la variable compuesta
 +
#Vector
 +
#Matriz
 +
*Esto lo detectaremos si hay un rango (vector) o si hay dos rangos (matriz)
 +
;Producción
 +
[[imagen:rango.png]]
 +
;Acciones
 +
#Comprobaciones
 +
#Almacenar los valores para poderlos llevar a la tabja de símbolos
 +
;Comprobaciones
 +
*Como vemos el rango especifica dos valores
 +
*Aquí hay que hacer comprobaciones, dando error semántico en caso de no ser respetadas
 +
#Que los dos valores del rango sean del mismo tipo
 +
#Que el valor izquierdo sea estrictamente menor que el derecho
 +
#En caso de haber un sólo valor que sea entero en este caso el límite inferior lo tomaremos como 0 (DUDA A CONSULTAR)
 +
;tabla de símbolos
 +
*Necesitamos los valores de límite inferior y superior
 +
*Para ello hemos creado los atributos:
 +
;Código de yacc con las comprobaciones realizadas
 +
 +
====resto_variable_compuesta====
 
===identificadores_variable_compuesta===
 
===identificadores_variable_compuesta===
  

Revisión de 12:15 17 ago 2012

PROGRAMA

  • primera producción
  • Producción obligatoria
  • define de qué consta un programa
programa : tPROGRAMA tIDENTIFICADOR ';' declaracion_variables declaracion_acciones bloque_instrucciones
  • Acciones a realizar
  1. Dar de alta el identificador del programa para no volver a usarlo
  2. Después de la última instrucción eliminamos items de la tabla de símbolos
  3. Para crear el XML del programa, cada vez que hay un identificador creo un tag diciendo lo que es y lo cierro al final de su ámbito
programa:
    tPROGRAMA tIDENTIFICADOR ';'
    {
      nivel = 0;
      inicializar_tabla (tabsim);
      /*El identificador del programa
      Es el primer símbolo y por lo tanto seguro
      que no va a exixtir, por lo que no lo buscamos*/
      introducir_programa(tabsim,$2.NId,0);
      AbreTag(xmlin,$2.NId,nivel-1);
    }
 
    declaracion_variables 
    declaracion_acciones
    bloque_instrucciones
    {
      eliminar_variables (tabsim, nivel);
      eliminar_parametros_ocultos(tabsim,nivel+1);
      eliminar_acciones (tabsim, nivel);
      eliminar_programa(tabsim);
      CierraTag(xmlin,$2.NId,nivel-1);
    }
;

declaracion_variables

  • produccion optativa (puede haber o no variables en un programa)
  • lista de variables que puede tener un programa
  • Acciones a realizar
  1. ninguna ya que no tenemos ninún terminal solo producciones
  • Produccion para yacc
DeclaracionVariables.png

Vemos que puede estar vacía (épsidon) o que puede contener lista de declaraciones seguido del token punto y coma ;

Código en yaac
declaracion_variables:
|    lista_declaraciones ';'
;

lista_declaraciones




Icon define.gif

Definición

Una lista de elementos uno o varios elementos


  • En este caso va a ser una lista de declaraciones: una (declaracion) o varias declaraciones (lista_declaraciones)
  • En yacc siempre usaremos una recursividad por la izquierda (ver producción)
  • Acciones a realizar
  1. ninguna ya que no tenemos ningún terminal solo producciones
   lista_declaraciones ';' declaracion
|    declaracion
;

declaracion




Icon define.gif

Definición

declaracion de una variable es un tipo de variable seguido de una serie de identificadores que representan las variables


  • Una declaracion puede ser de variables simple o un variables compuesta
  • La forma de daclarar es decir el tipo de variable y luego una lista (1 o mas) de identificadores
  • Acciones a realizar
  1. ninguna ya que no tenemos ninún terminal solo producciones
Producción

Declaracion.png

codigo en yacc
 variable_simple lista_identificadores
|variable_compuesta identificadores_variable_compuesta
;

variable_simple

identificadores

variable_compuesta

  • Esta producción es un poco complicada ya que puede darse dos casos en la variable compuesta
  1. Vector
  2. Matriz
  • Esto lo detectaremos si hay un rango (vector) o si hay dos rangos (matriz)
Producción

VariableCompuesta.png

codigo en yacc
variable_compuesta:
tVECTOR '[' rango']' resto_variable_compuesta{$$=$5;}
;
  • Vamos a crear la produuccion resto_variable_compuesta la cual puede o no empeza por rango como veremos
  • Ademas a la produccion resto_variable_compuesta le vamos a asignar un atributo TIPO_VARIABLE_COMPUESTA
typedef enum{
     VECTOR,
     MATRIZ
};TIPO_VARIABLE_COMPUESTA
  • para poder saber si es VECTOR O MATRIZ necesitamos propagar dicho atributo de TIPO_VARIABLE_COMPUESTA, por lo que la proudccuín variable_compuesta también tiene dicho atributo
  1. accion
  • La acción {$$=$5;} preciamente pasa el valor de dicho atributo de la producción ' resto_variable_compuesta a la producción variable_compuesta

rango

  • Esta producción va a aportar información que debemos almacenar en la tabla de simbolos,
  • El problema que ya conocemos es que hasta que no tengamos el identificador de la variable que va a tener este rango no lo podemos hacer, así que hay que porpagar esto con atributos heredados.

PROGRAMA

  • primera producción
  • Producción obligatoria
  • define de qué consta un programa
programa : tPROGRAMA tIDENTIFICADOR ';' declaracion_variables declaracion_acciones bloque_instrucciones
  • Acciones a realizar
  1. Dar de alta el identificador del programa para no volver a usarlo
  2. Después de la última instrucción eliminamos items de la tabla de símbolos
  3. Para crear el XML del programa, cada vez que hay un identificador creo un tag diciendo lo que es y lo cierro al final de su ámbito
programa:
    tPROGRAMA tIDENTIFICADOR ';'
    {
      nivel = 0;
      inicializar_tabla (tabsim);
      /*El identificador del programa
      Es el primer símbolo y por lo tanto seguro
      que no va a exixtir, por lo que no lo buscamos*/
      introducir_programa(tabsim,$2.NId,0);
      AbreTag(xmlin,$2.NId,nivel-1);
    }
 
    declaracion_variables 
    declaracion_acciones
    bloque_instrucciones
    {
      eliminar_variables (tabsim, nivel);
      eliminar_parametros_ocultos(tabsim,nivel+1);
      eliminar_acciones (tabsim, nivel);
      eliminar_programa(tabsim);
      CierraTag(xmlin,$2.NId,nivel-1);
    }
;

declaracion_variables

  • produccion optativa (puede haber o no variables en un programa)
  • lista de variables que puede tener un programa
  • Acciones a realizar
  1. ninguna ya que no tenemos ninún terminal solo producciones
  • Produccion para yacc
DeclaracionVariables.png

Vemos que puede estar vacía (épsidon) o que puede contener lista de declaraciones seguido del token punto y coma ;

Código en yaac
declaracion_variables:
|    lista_declaraciones ';'
;

lista_declaraciones




Icon define.gif

Definición

Una lista de elementos uno o varios elementos


  • En este caso va a ser una lista de declaraciones: una (declaracion) o varias declaraciones (lista_declaraciones)
  • En yacc siempre usaremos una recursividad por la izquierda (ver producción)
  • Acciones a realizar
  1. ninguna ya que no tenemos ningún terminal solo producciones
   lista_declaraciones ';' declaracion
|    declaracion
;

declaracion




Icon define.gif

Definición

declaracion de una variable es un tipo de variable seguido de una serie de identificadores que representan las variables


  • Una declaracion puede ser de variables simple o un variables compuesta
  • La forma de daclarar es decir el tipo de variable y luego una lista (1 o mas) de identificadores
  • Acciones a realizar
  1. ninguna ya que no tenemos ninún terminal solo producciones
Producción

Declaracion.png

codigo en yacc
 variable_simple lista_identificadores
|variable_compuesta identificadores_variable_compuesta
;

variable_simple

identificadores

variable_compuesta

  • Esta producción es un poco complicada ya que puede darse dos casos en la variable compuesta
  1. Vector
  2. Matriz
  • Esto lo detectaremos si hay un rango (vector) o si hay dos rangos (matriz)
Producción

Rango.png

Acciones
  1. Comprobaciones
  2. Almacenar los valores para poderlos llevar a la tabja de símbolos
Comprobaciones
  • Como vemos el rango especifica dos valores
  • Aquí hay que hacer comprobaciones, dando error semántico en caso de no ser respetadas
  1. Que los dos valores del rango sean del mismo tipo
  2. Que el valor izquierdo sea estrictamente menor que el derecho
  3. En caso de haber un sólo valor que sea entero en este caso el límite inferior lo tomaremos como 0 (DUDA A CONSULTAR)
tabla de símbolos
  • Necesitamos los valores de límite inferior y superior
  • Para ello hemos creado los atributos:
Código de yacc con las comprobaciones realizadas

resto_variable_compuesta

identificadores_variable_compuesta

declaracion_acciones

bloque_instrucciones