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()); }
----------------------------------------------------------------
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:
<< Home
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