Usuario:ManuelRomero/preferencias/declaracionAccion

De WikiEducator
Saltar a: navegación, buscar



declaracion_acciones

Producción

DeclaracionAcciones.png

Atributos
Acción

Código Yacc

 declaracion_acciones:
|    declaracion_acciones  declaracion_accion
;

declaracion_accion

Producción

DeclaracionAccion.png

Atributos
Acción

Código Yacc

declaracion_accion:
     cabecera_accion ';'
     declaracion_variables
     declaracion_acciones     
     bloque_instrucciones{
       eliminar_variables (tabsim, nivel);
       eliminar_parametros_ocultos (tabsim, nivel+1);
       eliminar_acciones (tabsim, nivel);
       ocultar_parametros (tabsim, nivel);
       --nivel; 
       CierraTag(xmlin,$1,nivel);
     }
;

cabecera_accion

Producción

CabeceraAccion.png

Atributos
Acción
Esta producción es un poco complicada, analizamos:
  • En cuanto tengo el identificador de la acción la doy de alta (verificando que no existe el id) en la tabla de símbolos
    • De esta forma evitamos insertar parámetros con el mismo nombre que la acción
    • Al dar de alta el identificador, guardo la referencia de ese elemento de la tabla de simbolo
           $<id.PSimbolo>$= introducir_accion(tabsim,$2.NId,nivel,0);
  • Al tener los parámetros en el atributo de parametros_formales los asigno a la acción en la tabla de simbolos
             $<id.PSimbolo>3->parametros=$4;
Código Yacc
cabecera_accion:
     tACCION tIDENTIFICADOR{
     //Doy de alta la accion para evitar introducir parámetros con el nombre de la accion
       if (($2.PSimbolo == NULL) || ($2.PSimbolo->nivel !=nivel)){
 
           $<id.PSimbolo>$= introducir_accion(tabsim,$2.NId,nivel,0);
         /*MRM*/
       } 
       else{
           $<id.PSimbolo>$=NULL;
           char msg[100];
           sprintf(msg,"Identificador de accion <%s>, ya definido",$2.NId);
           error_semantico(msg);
           //Aunque ya este´definida, la incluyo  ???????
           CuentaErrores();
 
       }
       }   
 
       parametros_formales
     {/*Aqui es donde completare los datos de la acción*/
       /* incrementar el nivel*/
       /* Se refiere a esta parte del código por ser intermedio*/
       SIMBOLO  *accion;
       DEBUGA("cabecera_accion: tACCION tIDENTIFICADOR parametros_fromales",DACCION,debug);
    //   $<id.PSimbolo>$==NULL;
          if ($<id.PSimbolo>3!= NULL)
             $<id.PSimbolo>3->parametros=$4;
         DEBUGA("2",DACCION,debug);
         /*MRM ==> La instrucción anterior da vialación de código*/
       AbreTag(xmlin,$2.NId,nivel);
       nivel++; 
     }
;

parametros_formales

Producción

ParametrosFormales.png

Atributos
Acción

Código Yacc

parametros_formales:
   {/*Si  no hay creo la lista vacia*/
    DEBUGA("parametros_formales: ->antes de crear_vacia",DACCION,debug);
    crear_vacia (&($$));
    DEBUGA("parametros_formales: ->despues de crear_vacia",DACCION,debug);
 
   }
 
|
 
   '(' resto_parametros_formales
   {
       DEBUGA("parametros_formales:'(' resto_parametros_formales",DACCION,debug);
 
   $$=$2;
   }
 
;

resto_parametros_formales

Producción

RestoParametrosFormales.png

Atributos
Acción

Código Yacc

resto_parametros_formales:
    lista_parametros')'
   {
      DEBUGA("resto_parametros_formales: lista_parametros ')' ",DACCION,debug);
 
     $$=$1;
   }
|')' 
   {/*Para permitir poner parentesis sin parametros*/
    DEBUGA("resto_parametros_formales: ')' ",DACCION,debug);
 
    crear_vacia (&($$));
 
   }
;

lista_parametros

Producción

ListaParametros.png

Atributos
Acción

Código Yacc

lista_parametros:
     lista_parametros ';' parametros
     {
      DEBUGA("lista_parametros: lista_parametros ';' parametros  ->antes de concatenar",DACCION,debug);
 
 
      concatenar(&($$),$3);
     DEBUGA("lista_parametros: lista_parametros ';' parametros  ->despues de concatenar",DACCION,debug);
     }
|    parametros 
     {
     DEBUGA("lista_parametros: parametros ",DACCION,debug);
 
      $$=$1;
      DEBUGA("xxx",DACCION,debug);
 
     }
;

parametros

Producción

Parametros.png

Atributos
Acción

Código Yacc

parametros:
     clase_parametros variable_simple identificadores_p{
           DEBUGA("parametros:clase_parametros variable_simple identificadores_p",DACCION,debug);
                                                        $$=$3;}
    |clase_parametros variable_compuesta identificadores_p_v{$$=$3;}
 
;

clase_parametros

Producción

ClaseParametros.png

Atributos
Acción

Código Yacc

clase_parametros:
     tVAL{
     DEBUGA ("clase_parametros: tVAL",DACCION,debug);
      $$=VAL;}   
|    tREF {
     DEBUGA ("clase_parametros: tREF",DACCION,debug);
        $$=REF;}
;

identificadores_p

Producción

IdentificadoresP.png

Atributos
Acción

Código Yacc

identificadores_p:
     tIDENTIFICADOR{
         SIMBOLO * p;
        if (($1.PSimbolo==NULL)||$1.PSimbolo->nivel!=nivel){
            DEBUGA ("identificadores_p: tIDENTIFICADOR ->con id ok",DACCION,debug);
            p= introducir_parametro(tabsim,$1.NId,$<tipo>0,$<clase>-1,nivel,0);
            crear_unitaria(&($$),p);
 
        }
        else{
             char msg[100];
             sprintf(msg,"Identificador %s ya utilizado",$1.NId);
             /*/Aunque ya esté usado ese identificador, lo incluyo en XML*/
             error_semantico(msg);
             CuentaErrores();
        }
       AbreTag(xmlin,$1.NId,nivel);
       CierraTag(xmlin,$1.NId,nivel);   
     }
|    identificadores_p ',' tIDENTIFICADOR{
        SIMBOLO * p;
        if (($3.PSimbolo==NULL)||$3.PSimbolo->nivel!=nivel){
            p=introducir_parametro(tabsim,$3.NId,$<tipo>0,$<clase>-1,nivel,0);
            anadir_derecha(p,&($$));
        }
        else{
             char msg[100];
             sprintf(msg,"Identificador %s ya utilizado",$3.NId);
             /*/Aunque ya esté usado ese identificador, lo incluyo en XML*/
             error_semantico(msg);
             CuentaErrores();
        }
       AbreTag(xmlin,$3.NId,nivel);
       CierraTag(xmlin,$3.NId,nivel);   
     }
;

identificadores_p_v

Producción

IdentificadoresPV.png

Atributos
Acción

Código Yacc

identificadores_p_v:
     tIDENTIFICADOR{
         SIMBOLO * p;
        if (($1.PSimbolo==NULL)||$1.PSimbolo->nivel!=nivel){    
            p= introducir_parametro_vector(tabsim,$1.NId,$<vector>0,$<clase>-1,nivel,0);
            crear_unitaria(&($$),p);
        }
        else{
             char msg[100];
             sprintf(msg,"Identificador %s ya utilizado",$1.NId);
             /*/Aunque ya esté usado ese identificador, lo incluyo en XML*/
             error_semantico(msg);
             CuentaErrores();
        }
       AbreTag(xmlin,$1.NId,nivel);
       CierraTag(xmlin,$1.NId,nivel);   
     }
|    identificadores_p_v ',' tIDENTIFICADOR{
        SIMBOLO *p;
        if (($3.PSimbolo==NULL)||$3.PSimbolo->nivel!=nivel){
            p=introducir_parametro_vector(tabsim,$3.NId,$<vector>0, $<clase>-1,nivel,0);
            anadir_derecha(p,&($$));
        }
        else{
             char msg[100];
             sprintf(msg,"Identificador %s ya utilizado",$3.NId);
             /*/Aunque ya esté usado ese identificador, lo incluyo en XML*/
             error_semantico(msg);
             CuentaErrores();
        }
       AbreTag(xmlin,$3.NId,nivel);
       CierraTag(xmlin,$3.NId,nivel);   
     }
;