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