You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.6 KiB
56 lines
1.6 KiB
package chocopy.pa2;
|
|
|
|
import chocopy.common.analysis.AbstractNodeAnalyzer;
|
|
import chocopy.common.analysis.SymbolTable;
|
|
import chocopy.common.analysis.types.Type;
|
|
import chocopy.common.analysis.types.ValueType;
|
|
import chocopy.common.astnodes.*;
|
|
|
|
/** Analyzes declarations to create a top-level symbol table. */
|
|
public class DeclarationAnalyzer extends AbstractNodeAnalyzer<Type> {
|
|
|
|
/** Current symbol table. Changes with new declarative region. */
|
|
private final SymbolTable<Type> sym = new SymbolTable<>();
|
|
/** Global symbol table. */
|
|
private final SymbolTable<Type> globals = sym;
|
|
/** Receiver for semantic error messages. */
|
|
private final Errors errors;
|
|
|
|
/** A new declaration analyzer sending errors to ERRORS0. */
|
|
public DeclarationAnalyzer(Errors errors0) {
|
|
errors = errors0;
|
|
}
|
|
|
|
public SymbolTable<Type> getGlobals() {
|
|
return globals;
|
|
}
|
|
|
|
@Override
|
|
public Type analyze(Program program) {
|
|
for (Declaration decl : program.declarations) {
|
|
Identifier id = decl.getIdentifier();
|
|
String name = id.name;
|
|
|
|
Type type = decl.dispatch(this);
|
|
|
|
if (type == null) {
|
|
continue;
|
|
}
|
|
|
|
if (sym.declares(name)) {
|
|
errors.semError(
|
|
id, "Duplicate declaration of identifier in same " + "scope: %s", name);
|
|
} else {
|
|
sym.put(name, type);
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public Type analyze(VarDef varDef) {
|
|
return ValueType.annotationToValueType(varDef.var.type);
|
|
}
|
|
}
|