1.
a) Contagem das regras começa de 1:
shift shift reduce 7 shift shift reduce 7 shift reduce 4 shift reduce 7 shift shift reduce 5 reduce 2 shift reduce 7 shift shift shift shift shift reduce 6 reduce 3 shift reduce 1 accept
A sequência de configurações até o accept (não era necessária na resposta):
<<EOF>>,0 | class id extends id { id id ; id id ( ) { } } <<EOF>>,0 class,1 | id extends id { id id ; id id ( ) { } } <<EOF>>,0 class,1 id,2 | extends id { id id ; id id ( ) { } } <<EOF>>,0 class,1 TIPO,3 | extends id { id id ; id id ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 | id { id id ; id id ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 id,2 | { id id ; id id ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 | { id id ; id id ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 | id id ; id id ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 | id id ; id id ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 id,2 | id ; id id ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 TIPO,8 | id ; id id ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 TIPO,8 id,12 | ; id id ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 TIPO,8 id,12 ;,13 | id id ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 CAMPO,11 | id id ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 | id id ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 id,2 | id ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 TIPO,8 | id ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 TIPO,8 id,12 | ( ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 TIPO,8 id,12 (,14 | ) { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 TIPO,8 id,12 (,14 ),15 | { } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 TIPO,8 id,12 (,14 ),15 {,16 | } } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 TIPO,8 id,12 (,14 ),15 {,16 },17 | } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 METODO,9 | } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 | } <<EOF>>,0 class,1 TIPO,3 extends,4 TIPO,5 {,6 MEMBROS,7 },10 | <<EOF>>,0 CLASSE,null |
b) O nó do autômato:
CLASSE -> class TIPO extends TIPO { MEMBROS . } MEMBROS -> MEMBROS . CAMPO MEMBROS -> MEMBROS . METODO CAMPO -> . TIPO id ; METODO -> . TIPO id ( ) { } TIPO -> . id
Transição em } para:
}
CLASSE -> class TIPO extends TIPO { MEMBROS } .
Transição em CAMPO para:
CAMPO
MEMBROS -> MEMBROS CAMPO .
Transição em METODO para:
METODO
MEMBROS -> MEMBROS METODO .
Transição em TIPO para:
TIPO
CAMPO -> TIPO . id ; METODO -> TIPO . id ( ) { }
Transição em id para:
id
TIPO -> id .
2.
a)
boolean subClasseDe(Classe sup) { // Toda classe é subclasse dela mesma if(this == sup) return true; // Sou a raiz da árvore, então não sou // subclase de ninguém exceto eu mesmo if(superClasse == null) return false; // Sou subclasse de sup se minha superclasse // é subclasse de sup (transitividade) return superClasse.subClasseDe(sup); }
b)
Classe tipoExp(Env<Classe> tenv) { Classe tobj = objetio.tipoExp(tenv); Metodo m = tobj.metodos.get(metodo); if(m.tipoParams.size() != args.size()) throw new RuntimeException("erro de tipagem"); for(int i = 0; i < args.size(); i++) { Classe tparam = m.tipoParams.get(i); Classe targ = args.get(i).tipoExp(tenv); if(!targ.subClasseDe(tparam)) throw new RuntimeException("erro de tipagem"); } return m.tipoRet; }
c)
void checaTipo(Classe tipoThis) { Env<Classe> tenv = new SymbolTable<Classe>(); tenv.associa("this", tipoThis); for(int i = 0; i < nomeParams.size(); i++) { tenv.associa(nomeParams.get(i), tipoParams.get(i)); } Classe tret = null; for(Exp exp : corpo) { tret = exp.tipoExp(tenv); } if(!tret.subClasseDe(tipoRet)) throw new RuntimeException("erro de tipagem"); }