Resolução da Primeira Prova da Turma de Terça

 

1.

EnumType enumType() {

  nextToken();

  if ( token != Symbol.LEFTPAR )

     error();

  else

     nextToken();

  if ( token != Symbol.IDENT )

     error();

  // a rigor, poderia usar apenas a tabela hash

  Vector v = new Vector();

  Hashtable ht = new Hashtable();

  v.addElement(stringValue);

  ht.put(stringValue, "");

  nextToken();

  while ( token == Symbol.COMMA ) {

     nextToken();

     if ( token != Symbol.IDENT )

        error();

     v.addElement(stringValue);

     if ( ht.put(stringValue, "") != null )

        error("Constante duplicada");

     nextToken();

  }

  if ( token != Symbol.RIGHTPAR )

     error();

  else

     nextToken();

  return new EnumType(v);

}

 

 

class EnumType extends Type {

   public EnumType( Vector v ) { this.v = v; }

   public void gen() {

         /* produz uma virgula no final: "enum( azul, vermelho, verde, )",

            o que admitimos ser legal */

      System.out.println("enum ( ");

      Enumeration e = v.elements();

      while ( e.hasMoreElements() )

         System.out.println( (String ) e.nextElement() + ", " );

      System.out.println(")");

   }

}

   private Vector v;

} 

 

2.

void p() {

   if ( token == 'a' || token == 'b' )

      A();

   else

      B();

}

 

void a() {

   if ( token == 'a' ) {

      nextToken();

      C();

   }

   else

      if ( token == 'b' ) {

         nextToken();

         D();

      }

      else

         error();

}

 

void b() {

   if ( token >= '0' && token <= '9' )

      nextToken();

   else

      error();

}

 

void c() {

   B();

   while ( token >= '0' && token <= '9' )

      B();

}

 

void d() {

   B();

   if ( token == 'c' )

      nextToken();

   B();

}

 

 

3.

// o exercicio nao pedia o corpo dos métodos

class SymbolTable {

   public Object putInClass( String name, Object value ) {

      return classTable.put(name, value);

   }

   public Object getInClass( String name ) {

      return classTable.get(name);

   }

   public Object putInInstVar( String name, Object value ) {

      return instanceVariableTable.put(name, value);

   }

   public Object getInInstVar( String name ) {

      return instanceVariableTable.get(name);

   }

   public Object putInLocalVar( String name, Object value ) {

      return localVariableTable.put(name, value);

   }

   public Object getInLocalVar( String name ) {

      return localVariableTable.get(name);

   }

  

   private classTable, instanceVariableTable, localVariableTable;

}

 

4 e 5. Deixados como exercício