mirror of
https://github.com/JonathanFleischmann/CompilerULTIMATE.git
synced 2024-12-27 08:18:03 +00:00
Refactored TypedAST and changed visibility of methods
This commit is contained in:
parent
371480a790
commit
a80a828dbf
@ -27,7 +27,7 @@ public class TypedAssignment implements TypedStatement {
|
|||||||
typeCheck(typedProgram);
|
typeCheck(typedProgram);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedAssignment(TypedProgram typedProgram, Assignment untyped) {
|
private void convertToTypedAssignment(TypedProgram typedProgram, Assignment untyped) {
|
||||||
value = convertExpression(typedProgram, untyped.value());
|
value = convertExpression(typedProgram, untyped.value());
|
||||||
location = new TypedFieldVarAccess(typedProgram, untyped.location());
|
location = new TypedFieldVarAccess(typedProgram, untyped.location());
|
||||||
}
|
}
|
||||||
@ -36,7 +36,7 @@ public class TypedAssignment implements TypedStatement {
|
|||||||
public Type typeCheck(TypedProgram typedProgram) {
|
public Type typeCheck(TypedProgram typedProgram) {
|
||||||
TypedClass currentClass = typedProgram.getCurrentClass();
|
TypedClass currentClass = typedProgram.getCurrentClass();
|
||||||
|
|
||||||
if (currentClass.isCurrentMainMethodPresent() && location.getField() && location.getRecursiveOwnerChain() == null) {
|
if (Boolean.TRUE.equals(currentClass.isCurrentMainMethodPresent() && location.getField()) && location.getRecursiveOwnerChain() == null) {
|
||||||
throw new RuntimeException("Main Method, is not allowed to have fields, they are not static");
|
throw new RuntimeException("Main Method, is not allowed to have fields, they are not static");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ public class TypedBinary implements TypedExpression {
|
|||||||
typeCheck(typedProgram);
|
typeCheck(typedProgram);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedBinary(TypedProgram typedProgram, Binary unTypedBinary) {
|
private void convertToTypedBinary(TypedProgram typedProgram, Binary unTypedBinary) {
|
||||||
left = convertExpression(typedProgram, unTypedBinary.left());
|
left = convertExpression(typedProgram, unTypedBinary.left());
|
||||||
right = convertExpression(typedProgram, unTypedBinary.right());
|
right = convertExpression(typedProgram, unTypedBinary.right());
|
||||||
op = unTypedBinary.op();
|
op = unTypedBinary.op();
|
||||||
|
@ -31,7 +31,7 @@ public class TypedBlock implements TypedNode {
|
|||||||
this.stmts = stmts;
|
this.stmts = stmts;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedBlock(TypedProgram typedProgram, Block unTypedBlock) {
|
private void convertToTypedBlock(TypedProgram typedProgram, Block unTypedBlock) {
|
||||||
|
|
||||||
if (unTypedBlock == null) {
|
if (unTypedBlock == null) {
|
||||||
return;
|
return;
|
||||||
|
@ -21,7 +21,7 @@ public class TypedBoolLiteral implements TypedExpression {
|
|||||||
convertToTypedBoolLiteral(unTypedBoolLiteral);
|
convertToTypedBoolLiteral(unTypedBoolLiteral);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedBoolLiteral(BoolLiteral unTypedBoolLiteral) {
|
private void convertToTypedBoolLiteral(BoolLiteral unTypedBoolLiteral) {
|
||||||
value = unTypedBoolLiteral.value();
|
value = unTypedBoolLiteral.value();
|
||||||
type = Type.BOOL;
|
type = Type.BOOL;
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ public class TypedCharLiteral implements TypedExpression {
|
|||||||
convertToCharLiteral(unTypedCharLiteral);
|
convertToCharLiteral(unTypedCharLiteral);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToCharLiteral(CharLiteral unTypedCharLiteral) {
|
private void convertToCharLiteral(CharLiteral unTypedCharLiteral) {
|
||||||
value = unTypedCharLiteral.value();
|
value = unTypedCharLiteral.value();
|
||||||
type = Type.CHAR;
|
type = Type.CHAR;
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ public class TypedClass implements TypedNode {
|
|||||||
typedDeclarations.add(new TypedDeclaration(typedProgram, declaration));
|
typedDeclarations.add(new TypedDeclaration(typedProgram, declaration));
|
||||||
}
|
}
|
||||||
for (Constructor constructor : c.constructors()) {
|
for (Constructor constructor : c.constructors()) {
|
||||||
typedConstructors.add(new TypedConstructor(typedProgram, constructor, this.className));
|
typedConstructors.add(new TypedConstructor(constructor, this.className));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Method method : c.methods()) {
|
for (Method method : c.methods()) {
|
||||||
|
@ -32,28 +32,33 @@ public class TypedConstructor implements TypedNode {
|
|||||||
this.typedParameters = typedParameters;
|
this.typedParameters = typedParameters;
|
||||||
this.typedBlock = typedBlock;
|
this.typedBlock = typedBlock;
|
||||||
}
|
}
|
||||||
public TypedConstructor(TypedProgram typedProgram, Constructor unTypedConstructor, String className) {
|
public TypedConstructor(Constructor unTypedConstructor, String className) {
|
||||||
convertToTypedConstructor(typedProgram, unTypedConstructor, className);
|
convertToTypedConstructor(unTypedConstructor, className);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedConstructor(TypedProgram typedProgram, Constructor unTypedConstructor, String className) {
|
private void convertToTypedConstructor(Constructor unTypedConstructor, String className) {
|
||||||
if(!unTypedConstructor.className().equals(className)) {
|
if(!unTypedConstructor.className().equals(className)) {
|
||||||
throw new RuntimeException("Constructor name "+ unTypedConstructor.className() +" must be the same as class name" + className);
|
throw new RuntimeException("Constructor name "+ unTypedConstructor.className() +" must be the same as class name" + className);
|
||||||
}
|
}
|
||||||
name = unTypedConstructor.className();
|
name = unTypedConstructor.className();
|
||||||
convertToTypedParameter(typedProgram, unTypedConstructor.params());
|
convertToTypedParameter(unTypedConstructor.params());
|
||||||
type = Type.VOID;
|
type = Type.VOID;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void convertToTypedParameter(TypedProgram typedProgram, List<Parameter> params) {
|
private void convertToTypedParameter(List<Parameter> params) {
|
||||||
for (Parameter param : params) {
|
for (Parameter param : params) {
|
||||||
TypedParameter typedParameter = new TypedParameter(typedProgram, param);
|
TypedParameter typedParameter = new TypedParameter(param);
|
||||||
checkIfParameterExists(typedParameter.getParaName());
|
checkIfParameterExists(typedParameter.getParaName());
|
||||||
typedParameters.add(typedParameter);
|
typedParameters.add(typedParameter);
|
||||||
localVariables.add(new TypedLocalVariable(typedParameter.getParaName(), typedParameter.getType()));
|
localVariables.add(new TypedLocalVariable(typedParameter.getParaName(), typedParameter.getType()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void convertToBlock(TypedProgram typedProgram, Constructor unTypedConstructor) {
|
||||||
|
this.typedBlock = new TypedBlock(typedProgram, unTypedConstructor.block());
|
||||||
|
typeCheck(typedProgram);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type typeCheck(TypedProgram typedProgram) {
|
public Type typeCheck(TypedProgram typedProgram) {
|
||||||
type = typedBlock.typeCheck(typedProgram);
|
type = typedBlock.typeCheck(typedProgram);
|
||||||
@ -64,8 +69,6 @@ public class TypedConstructor implements TypedNode {
|
|||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public boolean isLocalVariablePresent(String localVarName) {
|
public boolean isLocalVariablePresent(String localVarName) {
|
||||||
return localVariables.stream().anyMatch(localVariable -> localVariable.getName().equals(localVarName));
|
return localVariables.stream().anyMatch(localVariable -> localVariable.getName().equals(localVarName));
|
||||||
}
|
}
|
||||||
@ -88,11 +91,6 @@ public class TypedConstructor implements TypedNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToBlock(TypedProgram typedProgram, Constructor unTypedConstructor) {
|
|
||||||
this.typedBlock = new TypedBlock(typedProgram, unTypedConstructor.block());
|
|
||||||
typeCheck(typedProgram);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void deleteLocalVariableInConstructor(String localVarName) {
|
public void deleteLocalVariableInConstructor(String localVarName) {
|
||||||
localVariables.removeIf(localVariable -> localVariable.getName().equals(localVarName));
|
localVariables.removeIf(localVariable -> localVariable.getName().equals(localVarName));
|
||||||
}
|
}
|
||||||
|
@ -19,22 +19,20 @@ public final class TypedDeclaration implements TypedNode {
|
|||||||
|
|
||||||
public TypedDeclaration(TypedProgram typedProgram, Declaration declaration) {
|
public TypedDeclaration(TypedProgram typedProgram, Declaration declaration) {
|
||||||
convertToTypedDeclaration(typedProgram, declaration);
|
convertToTypedDeclaration(typedProgram, declaration);
|
||||||
|
typeCheck(typedProgram);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedDeclaration(TypedProgram typedProgram, Declaration declaration) {
|
private void convertToTypedDeclaration(TypedProgram typedProgram, Declaration declaration) {
|
||||||
name = declaration.name();
|
name = declaration.name();
|
||||||
type = declaration.type();
|
type = declaration.type();
|
||||||
typeCheck(typedProgram);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type typeCheck(TypedProgram typedProgram) {
|
public Type typeCheck(TypedProgram typedProgram) {
|
||||||
TypedClass currentClass = typedProgram.getCurrentClass();
|
TypedClass currentClass = typedProgram.getCurrentClass();
|
||||||
|
|
||||||
if (type.getReference() != null && !currentClass.getClassName().equals(type.getReference())) {
|
if (type.getReference() != null && !currentClass.getClassName().equals(type.getReference()) && !typedProgram.isTypedClassPresent(type.getReference())) {
|
||||||
if (!typedProgram.isTypedClassPresent(type.getReference())) {
|
|
||||||
throw new RuntimeException("Type " + type.getReference() + " not found");
|
throw new RuntimeException("Type " + type.getReference() + " not found");
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentClass.isThereField(name)) {
|
if (currentClass.isThereField(name)) {
|
||||||
|
@ -21,7 +21,7 @@ public class TypedDoWhile implements TypedStatement {
|
|||||||
typeCheck(typedProgram);
|
typeCheck(typedProgram);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedDoWhile(TypedProgram typedProgram, DoWhile unTypedDoWhile) {
|
private void convertToTypedDoWhile(TypedProgram typedProgram, DoWhile unTypedDoWhile) {
|
||||||
typedBlock = new TypedBlock(typedProgram, unTypedDoWhile.block());
|
typedBlock = new TypedBlock(typedProgram, unTypedDoWhile.block());
|
||||||
cond = convertExpression(typedProgram, unTypedDoWhile.cond());
|
cond = convertExpression(typedProgram, unTypedDoWhile.cond());
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ public class TypedFieldVarAccess implements TypedExpression {
|
|||||||
typeCheck(typedProgram);
|
typeCheck(typedProgram);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedFieldVarAccess(TypedProgram typedProgram, FieldVarAccess unTypedFieldVarAccess) {
|
private void convertToTypedFieldVarAccess(TypedProgram typedProgram, FieldVarAccess unTypedFieldVarAccess) {
|
||||||
field = unTypedFieldVarAccess.field();
|
field = unTypedFieldVarAccess.field();
|
||||||
recursiveOwnerChain = convertExpression(typedProgram, unTypedFieldVarAccess.recursiveOwnerChain());
|
recursiveOwnerChain = convertExpression(typedProgram, unTypedFieldVarAccess.recursiveOwnerChain());
|
||||||
name = unTypedFieldVarAccess.id();
|
name = unTypedFieldVarAccess.id();
|
||||||
|
@ -25,7 +25,7 @@ public class TypedFor implements TypedStatement {
|
|||||||
typeCheck(typedProgram);
|
typeCheck(typedProgram);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedFor(TypedProgram typedProgram, For unTypedFor) {
|
private void convertToTypedFor(TypedProgram typedProgram, For unTypedFor) {
|
||||||
assign = new TypedAssignment(typedProgram, unTypedFor.assign());
|
assign = new TypedAssignment(typedProgram, unTypedFor.assign());
|
||||||
cond = convertExpression(typedProgram, unTypedFor.cond());
|
cond = convertExpression(typedProgram, unTypedFor.cond());
|
||||||
inc = new TypedAssignment(typedProgram, unTypedFor.inc());
|
inc = new TypedAssignment(typedProgram, unTypedFor.inc());
|
||||||
|
@ -24,7 +24,7 @@ public class TypedIfElse implements TypedStatement {
|
|||||||
typeCheck(typedProgram);
|
typeCheck(typedProgram);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedIfElse(TypedProgram typedProgram, IfElse unTypedIfElse) {
|
private void convertToTypedIfElse(TypedProgram typedProgram, IfElse unTypedIfElse) {
|
||||||
ifTypedBlock = new TypedBlock(typedProgram, unTypedIfElse.ifBlock());
|
ifTypedBlock = new TypedBlock(typedProgram, unTypedIfElse.ifBlock());
|
||||||
elseTypedBlock = new TypedBlock(typedProgram, unTypedIfElse.elseBlock());
|
elseTypedBlock = new TypedBlock(typedProgram, unTypedIfElse.elseBlock());
|
||||||
typedCon = convertExpression(typedProgram, unTypedIfElse.cond());
|
typedCon = convertExpression(typedProgram, unTypedIfElse.cond());
|
||||||
|
@ -20,7 +20,7 @@ public class TypedIntLiteral implements TypedExpression {
|
|||||||
convertToTypedIntLiteral(unTypedIntLiteral);
|
convertToTypedIntLiteral(unTypedIntLiteral);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedIntLiteral(IntLiteral unTypedIntLiteral) {
|
private void convertToTypedIntLiteral(IntLiteral unTypedIntLiteral) {
|
||||||
value = unTypedIntLiteral.value();
|
value = unTypedIntLiteral.value();
|
||||||
type = Type.INT;
|
type = Type.INT;
|
||||||
}
|
}
|
||||||
|
@ -17,13 +17,13 @@ public final class TypedLocalVariable implements TypedNode {
|
|||||||
private Type type;
|
private Type type;
|
||||||
|
|
||||||
public TypedLocalVariable(TypedProgram typedProgram, Declaration declaration) {
|
public TypedLocalVariable(TypedProgram typedProgram, Declaration declaration) {
|
||||||
convertToTypedLocalVariable(typedProgram, declaration);
|
convertToTypedLocalVariable(declaration);
|
||||||
|
typeCheck(typedProgram);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedLocalVariable(TypedProgram typedProgram, Declaration declaration) {
|
private void convertToTypedLocalVariable(Declaration declaration) {
|
||||||
name = declaration.name();
|
name = declaration.name();
|
||||||
type = declaration.type();
|
type = declaration.type();
|
||||||
typeCheck(typedProgram);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -26,18 +26,24 @@ public class TypedMethod implements TypedNode {
|
|||||||
convertToTypedMethod(typedProgram, unTypedMethod);
|
convertToTypedMethod(typedProgram, unTypedMethod);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedMethod(TypedProgram typedProgram, Method unTypedMethod) {
|
private void convertToTypedMethod(TypedProgram typedProgram, Method unTypedMethod) {
|
||||||
TypedClass currentClass = typedProgram.getCurrentClass();
|
TypedClass currentClass = typedProgram.getCurrentClass();
|
||||||
|
|
||||||
name = unTypedMethod.methodName();
|
name = unTypedMethod.methodName();
|
||||||
returnType = unTypedMethod.type();
|
returnType = unTypedMethod.type();
|
||||||
convertToTypedParameter(typedProgram, unTypedMethod.params());
|
convertToTypedParameter(unTypedMethod.params());
|
||||||
currentClass.checkMethodExists(this);
|
currentClass.checkMethodExists(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void convertToTypedParameter(TypedProgram typedProgram, List<Parameter> params) {
|
public void convertToTypedBlock(TypedProgram typedProgram, Method unTypedMethod) {
|
||||||
|
typedBlock = new TypedBlock(typedProgram, unTypedMethod.block());
|
||||||
|
typeCheck(typedProgram);
|
||||||
|
localVariables.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void convertToTypedParameter(List<Parameter> params) {
|
||||||
for (Parameter param : params) {
|
for (Parameter param : params) {
|
||||||
TypedParameter typedParameter = new TypedParameter(typedProgram, param);
|
TypedParameter typedParameter = new TypedParameter(param);
|
||||||
checkIfParameterExists(typedParameter.getParaName());
|
checkIfParameterExists(typedParameter.getParaName());
|
||||||
typedParameters.add(typedParameter);
|
typedParameters.add(typedParameter);
|
||||||
localVariables.add(new TypedLocalVariable(typedParameter.getParaName(), typedParameter.getType()));
|
localVariables.add(new TypedLocalVariable(typedParameter.getParaName(), typedParameter.getType()));
|
||||||
@ -51,12 +57,6 @@ public class TypedMethod implements TypedNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void convertToTypedBlock(TypedProgram typedProgram, Method unTypedMethod) {
|
|
||||||
typedBlock = new TypedBlock(typedProgram, unTypedMethod.block());
|
|
||||||
typeCheck(typedProgram);
|
|
||||||
localVariables.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isLocalVariablePresent(String localVarName) {
|
public boolean isLocalVariablePresent(String localVarName) {
|
||||||
return localVariables.stream().anyMatch(localVariable -> localVariable.getName().equals(localVarName));
|
return localVariables.stream().anyMatch(localVariable -> localVariable.getName().equals(localVarName));
|
||||||
}
|
}
|
||||||
|
@ -28,9 +28,8 @@ public class TypedMethodCall implements TypedExpression, TypedStatement {
|
|||||||
typeCheck(typedProgram);
|
typeCheck(typedProgram);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedMethodCall(TypedProgram typedProgram, MethodCall unTypedMethodCall) {
|
private void convertToTypedMethodCall(TypedProgram typedProgram, MethodCall unTypedMethodCall) {
|
||||||
recipient = new TypedFieldVarAccess(typedProgram, unTypedMethodCall.recipient());
|
recipient = new TypedFieldVarAccess(typedProgram, unTypedMethodCall.recipient());
|
||||||
//recipient.typeCheck(typedProgram);
|
|
||||||
for (Expression arg : unTypedMethodCall.args()) {
|
for (Expression arg : unTypedMethodCall.args()) {
|
||||||
args.add(convertExpression(typedProgram, arg));
|
args.add(convertExpression(typedProgram, arg));
|
||||||
}
|
}
|
||||||
@ -40,6 +39,7 @@ public class TypedMethodCall implements TypedExpression, TypedStatement {
|
|||||||
public Type typeCheck(TypedProgram typedProgram) {
|
public Type typeCheck(TypedProgram typedProgram) {
|
||||||
TypedClass currentClass = typedProgram.getCurrentClass();
|
TypedClass currentClass = typedProgram.getCurrentClass();
|
||||||
String ownerChainName = null;
|
String ownerChainName = null;
|
||||||
|
|
||||||
if (currentClass.isCurrentMainMethodPresent() && recipient.getRecursiveOwnerChain() == null) {
|
if (currentClass.isCurrentMainMethodPresent() && recipient.getRecursiveOwnerChain() == null) {
|
||||||
throw new RuntimeException("Main Method, is not allowed to have methods, they are not static");
|
throw new RuntimeException("Main Method, is not allowed to have methods, they are not static");
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ public class TypedNew implements TypedExpression, TypedStatement {
|
|||||||
typeCheck(typedProgram);
|
typeCheck(typedProgram);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedNew(TypedProgram typedProgram, New unTypedNew) {
|
private void convertToTypedNew(TypedProgram typedProgram, New unTypedNew) {
|
||||||
type = unTypedNew.type();
|
type = unTypedNew.type();
|
||||||
for (Expression arg : unTypedNew.args()) {
|
for (Expression arg : unTypedNew.args()) {
|
||||||
args.add(convertExpression(typedProgram, arg));
|
args.add(convertExpression(typedProgram, arg));
|
||||||
@ -32,8 +32,6 @@ public class TypedNew implements TypedExpression, TypedStatement {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type typeCheck(TypedProgram typedProgram) {
|
public Type typeCheck(TypedProgram typedProgram) {
|
||||||
TypedClass currentClass = typedProgram.getCurrentClass();
|
|
||||||
|
|
||||||
if (typedProgram.isTypedClassPresent(type.getReference())) {
|
if (typedProgram.isTypedClassPresent(type.getReference())) {
|
||||||
return Type.REFERENCE(type.getReference());
|
return Type.REFERENCE(type.getReference());
|
||||||
}
|
}
|
||||||
|
@ -12,25 +12,14 @@ public class TypedParameter implements TypedNode {
|
|||||||
private String paraName;
|
private String paraName;
|
||||||
private Type type;
|
private Type type;
|
||||||
|
|
||||||
public TypedParameter(TypedProgram typedProgram, Parameter unTypedParameter) {
|
public TypedParameter(Parameter unTypedParameter) {
|
||||||
convertToTypedParameter(typedProgram, unTypedParameter);
|
convertToTypedParameter(unTypedParameter);
|
||||||
}
|
}
|
||||||
|
private void convertToTypedParameter(Parameter unTypedParameter) {
|
||||||
public void convertToTypedParameter(TypedProgram typedProgram, Parameter unTypedParameter) {
|
|
||||||
paraName = unTypedParameter.name();
|
paraName = unTypedParameter.name();
|
||||||
type = unTypedParameter.type();
|
type = unTypedParameter.type();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if (obj instanceof TypedParameter) {
|
|
||||||
TypedParameter other = (TypedParameter) obj;
|
|
||||||
return paraName.equals(other.paraName) && type.equals(other.type);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Type typeCheck(TypedProgram typedProgram) {
|
public Type typeCheck(TypedProgram typedProgram) {
|
||||||
|
|
||||||
@ -47,5 +36,14 @@ public class TypedParameter implements TypedNode {
|
|||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (obj instanceof TypedParameter) {
|
||||||
|
TypedParameter other = (TypedParameter) obj;
|
||||||
|
return paraName.equals(other.paraName) && type.equals(other.type);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -60,11 +60,11 @@ public class TypedProgram {
|
|||||||
return typedClasses.stream().anyMatch(clas -> clas.getClassName().equals(className));
|
return typedClasses.stream().anyMatch(clas -> clas.getClassName().equals(className));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void enterCurrentClass(TypedClass clas) {
|
private void enterCurrentClass(TypedClass clas) {
|
||||||
currentClass = clas;
|
currentClass = clas;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void exitCurrentClass() {
|
private void exitCurrentClass() {
|
||||||
currentClass = null;
|
currentClass = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ public class TypedReturn implements TypedStatement {
|
|||||||
typeCheck(typedProgram);
|
typeCheck(typedProgram);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedReturn(TypedProgram typedProgram, Return unTypedReturn) {
|
private void convertToTypedReturn(TypedProgram typedProgram, Return unTypedReturn) {
|
||||||
ret = convertExpression(typedProgram, unTypedReturn.ret());
|
ret = convertExpression(typedProgram, unTypedReturn.ret());
|
||||||
if (ret == null) {
|
if (ret == null) {
|
||||||
type = Type.VOID;
|
type = Type.VOID;
|
||||||
@ -39,8 +39,7 @@ public class TypedReturn implements TypedStatement {
|
|||||||
TypedClass currentClass = typedProgram.getCurrentClass();
|
TypedClass currentClass = typedProgram.getCurrentClass();
|
||||||
TypedMethod currentMethod = currentClass.getCurrentMethod();
|
TypedMethod currentMethod = currentClass.getCurrentMethod();
|
||||||
|
|
||||||
if (currentClass.isCurrentMethodPresent()) {
|
if (currentClass.isCurrentMethodPresent() && currentMethod.getReturnType().getKind() != this.type.getKind()) {
|
||||||
if (currentMethod.getReturnType().getKind() != this.type.getKind()) {
|
|
||||||
StringBuilder exp = new StringBuilder();
|
StringBuilder exp = new StringBuilder();
|
||||||
exp.append("\nMismatched return type: ");
|
exp.append("\nMismatched return type: ");
|
||||||
exp.append("\nExpected: ").append(currentMethod.getReturnType().getKind());
|
exp.append("\nExpected: ").append(currentMethod.getReturnType().getKind());
|
||||||
@ -48,7 +47,7 @@ public class TypedReturn implements TypedStatement {
|
|||||||
exp.append("\nMethod name: ").append(currentMethod.getName());
|
exp.append("\nMethod name: ").append(currentMethod.getName());
|
||||||
throw new RuntimeException(exp.toString());
|
throw new RuntimeException(exp.toString());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ public class TypedUnary implements TypedExpression {
|
|||||||
typeCheck(typedProgram);
|
typeCheck(typedProgram);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedUnary(TypedProgram typedProgram, Unary unTypedUnary) {
|
private void convertToTypedUnary(TypedProgram typedProgram, Unary unTypedUnary) {
|
||||||
op = unTypedUnary.op();
|
op = unTypedUnary.op();
|
||||||
right = convertExpression(typedProgram, unTypedUnary.right());
|
right = convertExpression(typedProgram, unTypedUnary.right());
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ public class TypedWhile implements TypedStatement {
|
|||||||
typeCheck(typedProgram);
|
typeCheck(typedProgram);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void convertToTypedWhile(TypedProgram typedProgram, While unTypedWhile) {
|
private void convertToTypedWhile(TypedProgram typedProgram, While unTypedWhile) {
|
||||||
cond = convertExpression(typedProgram, unTypedWhile.cond());
|
cond = convertExpression(typedProgram, unTypedWhile.cond());
|
||||||
typedBlock = new TypedBlock(typedProgram, unTypedWhile.block());
|
typedBlock = new TypedBlock(typedProgram, unTypedWhile.block());
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user