Diferencia entre revisiones de «Usuario:ManuelRomero/preferencias/declaracionAccion»
De WikiEducator
(Página creada con '==declaracion_acciones== ;Producción image:DeclaracionAcciones.png ;Atributos ;Acción Código Yacc <source lang=c> declaracion_acciones: | declaracion_acciones declar…') |
(→declaracion_acciones) |
||
(Una revisión intermedia por el mismo usuario no mostrado) | |||
Línea 1: | Línea 1: | ||
− | + | {{:Usuario:ManuelRomero/compiladores/AS/nav}} | |
+ | <br> | ||
+ | =declaracion_acciones= | ||
;Producción | ;Producción | ||
[[image:DeclaracionAcciones.png]] | [[image:DeclaracionAcciones.png]] | ||
Línea 10: | Línea 12: | ||
; | ; | ||
</source> | </source> | ||
+ | |||
==declaracion_accion== | ==declaracion_accion== | ||
;Producción | ;Producción | ||
Línea 81: | Línea 84: | ||
</source> | </source> | ||
− | ==== | + | ==parametros_formales== |
+ | ;Producción | ||
+ | [[image:ParametrosFormales.png]] | ||
+ | ;Atributos | ||
+ | ;Acción | ||
+ | Código Yacc | ||
+ | <source lang=c> | ||
+ | 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; | ||
+ | } | ||
+ | |||
+ | ; | ||
+ | </source> | ||
+ | |||
+ | ==resto_parametros_formales== | ||
;Producción | ;Producción | ||
− | [[image: | + | [[image:RestoParametrosFormales.png]] |
;Atributos | ;Atributos | ||
;Acción | ;Acción | ||
Código Yacc | Código Yacc | ||
<source lang=c> | <source lang=c> | ||
+ | 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 (&($$)); | ||
+ | |||
+ | } | ||
+ | ; | ||
+ | </source> | ||
+ | |||
+ | ==lista_parametros== | ||
+ | ;Producción | ||
+ | [[image:ListaParametros.png]] | ||
+ | ;Atributos | ||
+ | ;Acción | ||
+ | Código Yacc | ||
+ | <source lang=c> | ||
+ | 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); | ||
+ | |||
+ | } | ||
+ | ; | ||
+ | </source> | ||
+ | |||
+ | ==parametros== | ||
+ | ;Producción | ||
+ | [[image:Parametros.png]] | ||
+ | ;Atributos | ||
+ | ;Acción | ||
+ | Código Yacc | ||
+ | <source lang=c> | ||
+ | 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;} | ||
+ | |||
+ | ; | ||
+ | |||
+ | </source> | ||
+ | |||
+ | ==clase_parametros== | ||
+ | ;Producción | ||
+ | [[image:ClaseParametros.png]] | ||
+ | ;Atributos | ||
+ | ;Acción | ||
+ | Código Yacc | ||
+ | <source lang=c> | ||
+ | clase_parametros: | ||
+ | tVAL{ | ||
+ | DEBUGA ("clase_parametros: tVAL",DACCION,debug); | ||
+ | $$=VAL;} | ||
+ | | tREF { | ||
+ | DEBUGA ("clase_parametros: tREF",DACCION,debug); | ||
+ | $$=REF;} | ||
+ | ; | ||
+ | </source> | ||
+ | |||
+ | ==identificadores_p== | ||
+ | ;Producción | ||
+ | [[image:IdentificadoresP.png]] | ||
+ | ;Atributos | ||
+ | ;Acción | ||
+ | Código Yacc | ||
+ | <source lang=c> | ||
+ | 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); | ||
+ | } | ||
+ | ; | ||
+ | </source> | ||
+ | |||
+ | ==identificadores_p_v== | ||
+ | ;Producción | ||
+ | [[image:IdentificadoresPV.png]] | ||
+ | ;Atributos | ||
+ | ;Acción | ||
+ | Código Yacc | ||
+ | <source lang=c> | ||
+ | |||
+ | 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); | ||
+ | } | ||
+ | ; | ||
+ | |||
+ | |||
+ | |||
+ | |||
</source> | </source> |
Última revisión de 16:01 19 ago 2012
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); } ;