lunes, noviembre 14, 2005

 

Uso de atributos heredados en CUP(parte 2)

Confirmada mi sospecha, usar el código raro... funciona.
Esta vez utilicé una gramatica similar a la declaración de tipos en C/C++;
la cual es:

dec -> dec tipo lista ';'
dec -> tipo lista ';'
tipo -> entero
tipo -> real
lista -> lista ',' ID
lista -> ID

Las reglas semanticas embebidas en la gramatica, originalmente quedan:

dec -> dec tipo {lista.t = tipo.t} lista ';'
dec -> tipo {lista.t = tipo.t} lista ';'
tipo -> entero {tipo.t = entero}
tipo -> real {tipo.t = real}
lista -> {lista1.t = lista.t} lista ',' ID {declare(ID.lexema, lista.t);}
lista -> ID{declare(ID.lexema, lista.t);}

por la regla de copia, se sustituyen las referencias al atr.heredado por referencias al

atributo sintetizado del símbolo de orígen, por lo tanto, las producciones de lista

quedan:

lista -> lista ',' ID {declare(ID.lexema, lista.t);} // usando atr[top-3]
lista -> ID{declare(ID.lexema, lista.t);} // usando atr[top-1]

aca pueden ver el código de cup.
----------------------------------------------------------------
package EjemploH1;

import java.io.*;
import java_cup.runtime.*;

parser code {:

public static void main(String args[]) throws Exception {
try{
//FileReader fis = new FileReader("dec.txt"); // se construye el File reader
parser paspar = new parser(new Yylex(System.in));
paspar.parse();
System.out.println("Proceso terminado");
System.exit(0);
}catch(FileNotFoundException e){
System.out.println("Imposible abrir el erchivo especificado");
System.exit(1);
}
}
:}

action code {:

private void settype(String id, String tipo){
System.out.println("declare(" + id + ", tipo " + tipo + ");");
}

:}

terminal ENTERO, REAL, COMA, PUNTOYCOMA;
terminal String ID;

non terminal cSimbolo dec, tipo, lista;

dec ::= dec tipo lista PUNTOYCOMA;

dec ::= tipo lista PUNTOYCOMA;

tipo ::= ENTERO {:RESULT = new cSimbolo("entero"); :};

tipo ::= REAL {:RESULT = new cSimbolo("real"); :};

lista ::= lista COMA ID:i{:settype(i,((cSimbolo)((java_cup.runtime.Symbol)

CUP$parser$stack.elementAt(CUP$parser$top-3)).value).tipo);:};

lista ::= ID:i {:settype(i,((cSimbolo)((java_cup.runtime.Symbol)

CUP$parser$stack.elementAt(CUP$parser$top-1)).value).tipo);:};


----------------------------------------------------------------

Aqui un ejemplo de corrida:

----------------------------------------------------------------
entero lunes, martes, miercoles; real madrid, fantasia, cuento;
declare(lunes, tipo entero);
declare(martes, tipo entero);
declare(miercoles, tipo entero);
declare(madrid, tipo real);
declare(fantasia, tipo real);
declare(cuento, tipo real);
^Z
Proceso terminado
Press any key to continue...
----------------------------------------------------------------

y por si las dudas, el código de jFlex:
----------------------------------------------------------------
package EjemploH1;

import java_cup.runtime.Symbol;

/**
* Class YyLex, creada mediante jFlex a partir de minimal. lex.
* @author Gerson Lara
* @URL http://www2.cs.tum.edu/projects/cup/minimal.tar.gz
*/
%%
%cup
%ignorecase
%%
";" { return new Symbol(sym.PUNTOYCOMA); }
"entero" { return new Symbol(sym.ENTERO); }
"real" { return new Symbol(sym.REAL); }
"," { return new Symbol(sym.COMA); }
[A-Za-z]+ { return new Symbol(sym.ID, yytext()); }
[ \t\r\n\f] { /* ignore white space. */ }
. { System.err.println("Illegal character: "+yytext()); }

----------------------------------------------------------------

Comments:
Buenas fijate que estaba viendo esto y sucede que vos tenes creada una clase que es cSimbolo que no decis nada de que es o como es que la estas manejando directamente la verdad me gustaria mucho tener acceso a esta clse si todavia la tuvieras por ahi y no te molestara pasarmela te lo agradeceria mucho cualquier cosa te agradezco que me podas escribir. Buena Onda por explicar.
 
mira agradezco tu respuesta y fijate que se me olvido contarte que lo hice funcionar sin esa clase que tenes vos ahi. Gracias. y dentro de algunos dias voy a publicar el codigo en mi blog del ejemplo sin la clase que uds usaron ahi, si no hay ningun inconveniente por supuesto gracias.
 
Publicar un comentario

<< Home

This page is powered by Blogger. Isn't yours?