📄 checker.java
字号:
public Object visitProcDeclaration(ProcDeclaration ast, Object o) {
idTable.enter (ast.I.spelling, ast); // permits recursion
if (ast.duplicated)
reporter.reportError ("identifier \"%\" already declared",
ast.I.spelling, ast.position);
idTable.openScope();
ast.FPS.visit(this, null);
ast.C.visit(this, null);
idTable.closeScope();
return null;
}
public Object visitSequentialDeclaration(SequentialDeclaration ast, Object o) {
ast.D1.visit(this, null);
ast.D2.visit(this, null);
return null;
}
public Object visitTypeDeclaration(TypeDeclaration ast, Object o) {
ast.T = (TypeDenoter) ast.T.visit(this, null);
idTable.enter (ast.I.spelling, ast);
if (ast.duplicated)
reporter.reportError ("identifier \"%\" already declared",
ast.I.spelling, ast.position);
return null;
}
public Object visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, Object o) {
return null;
}
public Object visitVarDeclaration(VarDeclaration ast, Object o) {
ast.T = (TypeDenoter) ast.T.visit(this, null);
idTable.enter (ast.I.spelling, ast);
if (ast.duplicated)
reporter.reportError ("identifier \"%\" already declared",
ast.I.spelling, ast.position);
return null;
}
// Array Aggregates
// Returns the TypeDenoter for the Array Aggregate. Does not use the
// given object.
public Object visitMultipleArrayAggregate(MultipleArrayAggregate ast, Object o) {
TypeDenoter eType = (TypeDenoter) ast.E.visit(this, null);
TypeDenoter elemType = (TypeDenoter) ast.AA.visit(this, null);
ast.elemCount = ast.AA.elemCount + 1;
if (! eType.equals(elemType))
reporter.reportError ("incompatible array-aggregate element", "", ast.E.position);
return elemType;
}
public Object visitSingleArrayAggregate(SingleArrayAggregate ast, Object o) {
TypeDenoter elemType = (TypeDenoter) ast.E.visit(this, null);
ast.elemCount = 1;
return elemType;
}
// Record Aggregates
// Returns the TypeDenoter for the Record Aggregate. Does not use the
// given object.
public Object visitMultipleRecordAggregate(MultipleRecordAggregate ast, Object o) {
TypeDenoter eType = (TypeDenoter) ast.E.visit(this, null);
FieldTypeDenoter rType = (FieldTypeDenoter) ast.RA.visit(this, null);
TypeDenoter fType = checkFieldIdentifier(rType, ast.I);
if (fType != StdEnvironment.errorType)
reporter.reportError ("duplicate field \"%\" in record",
ast.I.spelling, ast.I.position);
ast.type = new MultipleFieldTypeDenoter(ast.I, eType, rType, ast.position);
return ast.type;
}
public Object visitSingleRecordAggregate(SingleRecordAggregate ast, Object o) {
TypeDenoter eType = (TypeDenoter) ast.E.visit(this, null);
ast.type = new SingleFieldTypeDenoter(ast.I, eType, ast.position);
return ast.type;
}
// Formal Parameters
// Always returns null. Does not use the given object.
public Object visitConstFormalParameter(ConstFormalParameter ast, Object o) {
ast.T = (TypeDenoter) ast.T.visit(this, null);
idTable.enter(ast.I.spelling, ast);
if (ast.duplicated)
reporter.reportError ("duplicated formal parameter \"%\"",
ast.I.spelling, ast.position);
return null;
}
public Object visitFuncFormalParameter(FuncFormalParameter ast, Object o) {
idTable.openScope();
ast.FPS.visit(this, null);
idTable.closeScope();
ast.T = (TypeDenoter) ast.T.visit(this, null);
idTable.enter (ast.I.spelling, ast);
if (ast.duplicated)
reporter.reportError ("duplicated formal parameter \"%\"",
ast.I.spelling, ast.position);
return null;
}
public Object visitProcFormalParameter(ProcFormalParameter ast, Object o) {
idTable.openScope();
ast.FPS.visit(this, null);
idTable.closeScope();
idTable.enter (ast.I.spelling, ast);
if (ast.duplicated)
reporter.reportError ("duplicated formal parameter \"%\"",
ast.I.spelling, ast.position);
return null;
}
public Object visitVarFormalParameter(VarFormalParameter ast, Object o) {
ast.T = (TypeDenoter) ast.T.visit(this, null);
idTable.enter (ast.I.spelling, ast);
if (ast.duplicated)
reporter.reportError ("duplicated formal parameter \"%\"",
ast.I.spelling, ast.position);
return null;
}
public Object visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, Object o) {
return null;
}
public Object visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, Object o) {
ast.FP.visit(this, null);
ast.FPS.visit(this, null);
return null;
}
public Object visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, Object o) {
ast.FP.visit(this, null);
return null;
}
// Actual Parameters
// Always returns null. Uses the given FormalParameter.
public Object visitConstActualParameter(ConstActualParameter ast, Object o) {
FormalParameter fp = (FormalParameter) o;
TypeDenoter eType = (TypeDenoter) ast.E.visit(this, null);
if (! (fp instanceof ConstFormalParameter))
reporter.reportError ("const actual parameter not expected here", "",
ast.position);
else if (! eType.equals(((ConstFormalParameter) fp).T))
reporter.reportError ("wrong type for const actual parameter", "",
ast.E.position);
return null;
}
public Object visitFuncActualParameter(FuncActualParameter ast, Object o) {
FormalParameter fp = (FormalParameter) o;
Declaration binding = (Declaration) ast.I.visit(this, null);
if (binding == null)
reportUndeclared (ast.I);
else if (! (binding instanceof FuncDeclaration ||
binding instanceof FuncFormalParameter))
reporter.reportError ("\"%\" is not a function identifier",
ast.I.spelling, ast.I.position);
else if (! (fp instanceof FuncFormalParameter))
reporter.reportError ("func actual parameter not expected here", "",
ast.position);
else {
FormalParameterSequence FPS = null;
TypeDenoter T = null;
if (binding instanceof FuncDeclaration) {
FPS = ((FuncDeclaration) binding).FPS;
T = ((FuncDeclaration) binding).T;
} else {
FPS = ((FuncFormalParameter) binding).FPS;
T = ((FuncFormalParameter) binding).T;
}
if (! FPS.equals(((FuncFormalParameter) fp).FPS))
reporter.reportError ("wrong signature for function \"%\"",
ast.I.spelling, ast.I.position);
else if (! T.equals(((FuncFormalParameter) fp).T))
reporter.reportError ("wrong type for function \"%\"",
ast.I.spelling, ast.I.position);
}
return null;
}
public Object visitProcActualParameter(ProcActualParameter ast, Object o) {
FormalParameter fp = (FormalParameter) o;
Declaration binding = (Declaration) ast.I.visit(this, null);
if (binding == null)
reportUndeclared (ast.I);
else if (! (binding instanceof ProcDeclaration ||
binding instanceof ProcFormalParameter))
reporter.reportError ("\"%\" is not a procedure identifier",
ast.I.spelling, ast.I.position);
else if (! (fp instanceof ProcFormalParameter))
reporter.reportError ("proc actual parameter not expected here", "",
ast.position);
else {
FormalParameterSequence FPS = null;
if (binding instanceof ProcDeclaration)
FPS = ((ProcDeclaration) binding).FPS;
else
FPS = ((ProcFormalParameter) binding).FPS;
if (! FPS.equals(((ProcFormalParameter) fp).FPS))
reporter.reportError ("wrong signature for procedure \"%\"",
ast.I.spelling, ast.I.position);
}
return null;
}
public Object visitVarActualParameter(VarActualParameter ast, Object o) {
FormalParameter fp = (FormalParameter) o;
TypeDenoter vType = (TypeDenoter) ast.V.visit(this, null);
if (! ast.V.variable)
reporter.reportError ("actual parameter is not a variable", "",
ast.V.position);
else if (! (fp instanceof VarFormalParameter))
reporter.reportError ("var actual parameter not expected here", "",
ast.V.position);
else if (! vType.equals(((VarFormalParameter) fp).T))
reporter.reportError ("wrong type for var actual parameter", "",
ast.V.position);
return null;
}
public Object visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, Object o) {
FormalParameterSequence fps = (FormalParameterSequence) o;
if (! (fps instanceof EmptyFormalParameterSequence))
reporter.reportError ("too few actual parameters", "", ast.position);
return null;
}
public Object visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, Object o) {
FormalParameterSequence fps = (FormalParameterSequence) o;
if (! (fps instanceof MultipleFormalParameterSequence))
reporter.reportError ("too many actual parameters", "", ast.position);
else {
ast.AP.visit(this, ((MultipleFormalParameterSequence) fps).FP);
ast.APS.visit(this, ((MultipleFormalParameterSequence) fps).FPS);
}
return null;
}
public Object visitSingleActualParameterSequence(SingleActualParameterSequence ast, Object o) {
FormalParameterSequence fps = (FormalParameterSequence) o;
if (! (fps instanceof SingleFormalParameterSequence))
reporter.reportError ("incorrect number of actual parameters", "", ast.position);
else {
ast.AP.visit(this, ((SingleFormalParameterSequence) fps).FP);
}
return null;
}
// Type Denoters
// Returns the expanded version of the TypeDenoter. Does not
// use the given object.
public Object visitAnyTypeDenoter(AnyTypeDenoter ast, Object o) {
return StdEnvironment.anyType;
}
public Object visitArrayTypeDenoter(ArrayTypeDenoter ast, Object o) {
ast.T = (TypeDenoter) ast.T.visit(this, null);
if ((Integer.valueOf(ast.IL.spelling).intValue()) == 0)
reporter.reportError ("arrays must not be empty", "", ast.IL.position);
return ast;
}
public Object visitBoolTypeDenoter(BoolTypeDenoter ast, Object o) {
return StdEnvironment.booleanType;
}
public Object visitCharTypeDenoter(CharTypeDenoter ast, Object o) {
return StdEnvironment.charType;
}
public Object visitErrorTypeDenoter(ErrorTypeDenoter ast, Object o) {
return StdEnvironment.errorType;
}
public Object visitSimpleTypeDenoter(SimpleTypeDenoter ast, Object o) {
Declaration binding = (Declaration) ast.I.visit(this, null);
if (binding == null) {
reportUndeclared (ast.I);
return StdEnvironment.errorType;
} else if (! (binding instanceof TypeDeclaration)) {
reporter.reportError ("\"%\" is not a type identifier",
ast.I.spelling, ast.I.position);
return StdEnvironment.errorType;
}
return ((TypeDeclaration) binding).T;
}
public Object visitIntTypeDenoter(IntTypeDenoter ast, Object o) {
return StdEnvironment.integerType;
}
public Object visitRecordTypeDenoter(RecordTypeDenoter ast, Object o) {
ast.FT = (FieldTypeDenoter) ast.FT.visit(this, null);
return ast;
}
public Object visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, Object o) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -