lunes, 18 de octubre de 2010

Definicion Dirigida por la Sintaxis de generacion de codigo de 3 direcciones

Pues ahi recordando viejos tiempos, encontre este codigo y ps ya que hace ratos que me fue util y que cree este archivo y lo acabo de encontrar, espero que sea util para las nuevas generaciones.

Como puse hace años cuando lo publique, esta es solo una solucion, a cada quien se le puede ocurrir mas soluciones para el mismo problema, Asi que abran sus mentes, y si lo llegan a usar hay les encargo los creditos respectivos a este sitio xD.

/El uso de los nombres de las variables en este codigo queda a criterio de cada persona. jaja.



E::= E * E {: write(t,cont,=,E.cad,'*',E.cad);
E.cad = concat(t,cont);
cont = cont + 1;
:}


E::= E + E {: write(t,cont,=,E.cad,'+',E.cad);
E.cad = concat(t,cont);
cont = cont + 1;
:}

E::= ID {:write('t',cont,'= ptr + ',Buscar_pos_tabla(ID));
write('t',cont+1='pila[ t',cont,']');
E.cad = concat('t',cont+1);
cont=cont+2;
:}

E::= NUM {:E.cad = num; :}

E::= ID {: x.nom = ID
write('t',cont,'= ptr +',Buscar_pos_tabla(ID));
EliaBD_var = concat('t',cont);
cont = cont + 1; :} X {: write('t',cont,'=',X.cad,'+',EliaBD_var)
write(‘t’,cont+1,=,ID,’[ t‘,cont,’]’) ;
E.cad=concat(‘t’,cont+1);
cont=cont+2
:}




PROCEDIMIENTO ::= PROC ID ( l_p ) VARIABLES { Sentencias }


l_p ::= lista_paramentros
l_p ::= epsilon

lista_parametros::= lista_parametros , parametro
lista_parametros::= parametro

parametro::= TIPO ID


VARIABLES::= VARIABLES var
VARIABLES::= var


var::= lista_id : TIPO


lista_id ::= lista_id , ID
lista_id ::= ID




Sentencias ::= Sentencias sent
Sentencias ::= sent



sent::= 'if' {:limpiar_pila_decondiciones();:} '(' COND ')' 'then'{:imprimir_etiquitas_verdaderas();:}
'{' Sentecias {:write('goto L',cont_etiq);:}
'}' {:imprimir_etiquitas_falsas();
write('L',cont_etiq);
:}



sent::= ID {: x.nom = ID;
white('t',cont,'= ptr +',Buscar_pos_tabla(ID));
EliaBD_var = concat(t,cont);
cont = cont + 1; :} X = E {: write(t,cont,=,x.cad,'+',EliaBD_var);
write('pila[t',cont,'] =',E.cad);
cont = cont+1;
:}



sent::= ID {: white(t,cont,'= ptr +',Buscar_pos_tabla(ID));
EliaBD_var = concat(t,cont);
cont = cont + 1; :} = E {: write(t,cont,=,x.cad,'+',EliaBD_var);
write('pila[t',cont,'] =',E.cad);
:}



X::= X {:Rango.pos = X.pos; Rango.non = X.nom:} '[' RANGO ']' {: if( X.pos == 1)
{
Write('t', cont, '=',X.cad, '- 1');
write('t', cont + 1, '= t',cont,'*',[tamaño_fil(Rango.nom, Rango.pos)*tamaño_col(Rango.nom, Rango.pos)]);
write('t', cont + 2, '= t',cont+1,'+', Rango.cad);
X.cad=concat('t',cont+2);
cont=cont+3;
}else if(X.pos==2) {/*POR SI VIENE DE TRES BLOQUES = MAT[][][]*/}
else {/*POR SI VIENE DE MAS DE TRES BLOQUES = MAT[][][][].......*/}
X.nom=Rango.nom;
X.pos=Rango.pos+1;
:}

x::= {:Rango.nom=X.nom; Rango.pos=0;:}'[' Rango ']' {: X.cad=Rango.cad;
X.nom=Rango.nom;
X.pos=Rango.pos+1;
:}

Rango ::= Rango , E {: write('t',cont,'=', E.cad, '- 1');
write('t',cont+1,'= t',cont,'*',tamaño_fil(Rango.nom, Rango.pos));
write('t',cont+2,'= t',cont+1,'+',Rango.cad);
Rango.cad=concat('t',cont+2);
Rango.nom=Rango.nom;
Rango.pos=Rango.pos;
cont=cont+3;
:}

Rango ::= E {:write('t',cont,'=',E.cad);
Rango.cad = concat('t',cont);
Rango.nom = Rango.nom // de heredado a sintetizado
Rango.pos = Rango.pos // de heredado a sintetizado
cont=cont+1;
:}


/*

Las funciones tamaño_fil(String x, int y1), tamaña_col(String x, int y1)

el String x, nos dice cual es el nombre de matriz que buscamos en la tabla de simbolos, y
y1 nos dice la posicion real en la que estamos en la matriz, por ejemplo:

MAT[/*ESTAMOS ACA*/][] el valor de y1 es 0 (cero)
MAT[][/*ESTAMOS ACA*/] el valor de y1 es 1 (uno)

*/





COND ::= COND or {:write_todos_los_falsos(NIVEL);
sacar_todos_los_falsos(NIVEL); :} COND


COND ::= COND and {:write_ultimo_verdadero(NIVEL);
sacar_ultimo_verdadero(NIVEL); :} COND


COND ::= '('{:NIVEL = NIVEL + 1;:} COND {:guardar_verdadero(AGRUPAR_VERDADERAS(NIVEL),NIVEL-1);
guardar_falso(AGRUPAR_FALSAS(NIVEL),NIVEL-1);
NIVEL = NIVEL - 1 :} ')'


COND ::= NOT'('{:NIVEL = NIVEL + 1;:} COND {:guardar_verdadero(AGRUPAR_FALSAS(NIVEL),NIVEL-1);
guardar_falso(AGRUPAR_VERDADERAS(NIVEL),NIVEL-1);
NIVEL = NIVEL - 1 :} ')'


COND ::= E op E {: write('if(',E.cad, op.cad, E.cad,') goto L',cont_etiq);
guardar_verdadero('L',cont_etiq,NIVEL);
write('goto L',cont_etiq+1);
guardar_falso('L',cont_etiq+1,NIVEL);
:}


op :: = '<' {:op.cad = '<' :}
op :: = '=' {:op.cad = '=' :}
op :: = '>' {:op.cad = '>' :}
op :: = '=>' {:op.cad = '=>' :}

No hay comentarios: