Usuario:ManuelRomero/preferencias/declaracionAccion
De WikiEducator
declaracion_acciones
- Producción
- Atributos
- Acción
Código Yacc
declaracion_acciones: | declaracion_acciones declaracion_accion ;
declaracion_accion
- Producción
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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); } ;