method parameters

This commit is contained in:
Krauß, Josefine 2024-05-31 09:39:17 +02:00
parent 35fba57efa
commit 08d13a0df7
8 changed files with 41 additions and 28 deletions

View File

@ -26,7 +26,15 @@ public class FieldDecl extends AbstractType implements Node {
TypeCheckResult result = new TypeCheckResult(); TypeCheckResult result = new TypeCheckResult();
TypeCheckHelper.typeExists(this.type, typeContext.keySet().stream().toList()); List<String> typesList= new ArrayList<>();
for (HashMap<String, String> innerMap : typeContext.values()) {
for (String value : innerMap.values()) {
typesList.add(value);
}
}
TypeCheckHelper.typeExists(this.type, typesList);
result.type = this.type; result.type = this.type;
setTypeCheckResult(result); setTypeCheckResult(result);

View File

@ -17,12 +17,12 @@ public class BinaryExpression extends AbstractType implements IExpression{
public IExpression right; public IExpression right;
@Override @Override
public TypeCheckResult typeCheck() throws Exception { public TypeCheckResult typeCheck(HashMap<String, HashMap<String, HashMap<String, ParameterList>>> methodContext, HashMap<String, HashMap<String, String>> typeContext, HashMap<String, String> localVars) throws Exception {
TypeCheckHelper helper = new TypeCheckHelper(); TypeCheckHelper helper = new TypeCheckHelper();
TypeCheckResult result = new TypeCheckResult(); TypeCheckResult result = new TypeCheckResult();
TypeCheckResult leftType = left.typeCheck(); TypeCheckResult leftType = left.typeCheck(methodContext, typeContext, localVars);
TypeCheckResult rightType = right.typeCheck(); TypeCheckResult rightType = right.typeCheck(methodContext, typeContext, localVars);
switch (operator) { switch (operator) {
@ -59,12 +59,6 @@ public class BinaryExpression extends AbstractType implements IExpression{
return result; return result;
} }
@Override
public TypeCheckResult typeCheck(HashMap<String, HashMap<String, HashMap<String, ParameterList>>> methodContext, HashMap<String, HashMap<String, String>> typeContext, HashMap<String, String> localVars) throws Exception {
return null;
}
@Override @Override
public void codeGen(MethodVisitor mv) throws Exception { public void codeGen(MethodVisitor mv) throws Exception {
// Label for the jump instruction // Label for the jump instruction

View File

@ -24,8 +24,11 @@ public class InstVarExpression implements IExpression{
@Override @Override
public TypeCheckResult typeCheck(HashMap<String, HashMap<String, HashMap<String, ParameterList>>> methodContext, HashMap<String, HashMap<String, String>> typeContext, HashMap<String, String> localVars) throws Exception { public TypeCheckResult typeCheck(HashMap<String, HashMap<String, HashMap<String, ParameterList>>> methodContext, HashMap<String, HashMap<String, String>> typeContext, HashMap<String, String> localVars) throws Exception {
//todo //todo ///////////////////
return null; String varType = typeContext.get(classRef.name).get(fieldName);
TypeCheckResult result = new TypeCheckResult();
result.type = varType;
return result;
} }
@Override @Override

View File

@ -2,8 +2,11 @@ package abstractSyntaxTree.Expression;
import TypeCheck.TypeCheckHelper; import TypeCheck.TypeCheckHelper;
import TypeCheck.TypeCheckResult; import TypeCheck.TypeCheckResult;
import abstractSyntaxTree.Parameter.ParameterList;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
import java.util.HashMap;
public class LocalVarIdentifier implements IExpression{ public class LocalVarIdentifier implements IExpression{
String identifier; String identifier;
@ -16,7 +19,7 @@ public class LocalVarIdentifier implements IExpression{
} }
@Override @Override
public TypeCheckResult typeCheck() throws Exception { public TypeCheckResult typeCheck(HashMap<String, HashMap<String, HashMap<String, ParameterList>>> methodContext, HashMap<String, HashMap<String, String>> typeContext, HashMap<String, String> localVars) throws Exception {
return null; return null;
} }

View File

@ -4,9 +4,11 @@ import TypeCheck.AbstractType;
import TypeCheck.TypeCheckHelper; import TypeCheck.TypeCheckHelper;
import TypeCheck.TypeCheckResult; import TypeCheck.TypeCheckResult;
import abstractSyntaxTree.Datatype.IDatatype; import abstractSyntaxTree.Datatype.IDatatype;
import abstractSyntaxTree.Parameter.ParameterList;
import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
import java.util.HashMap;
import java.util.Objects; import java.util.Objects;
public class UnaryExpression extends AbstractType implements IExpression{ public class UnaryExpression extends AbstractType implements IExpression{
@ -16,8 +18,9 @@ public class UnaryExpression extends AbstractType implements IExpression{
this.operator = operator; this.operator = operator;
this.operand = operand; this.operand = operand;
} }
@Override @Override
public TypeCheckResult typeCheck() throws Exception { public TypeCheckResult typeCheck(HashMap<String, HashMap<String, HashMap<String, ParameterList>>> methodContext, HashMap<String, HashMap<String, String>> typeContext, HashMap<String, String> localVars) throws Exception {
TypeCheckResult result = new TypeCheckResult(); TypeCheckResult result = new TypeCheckResult();
TypeCheckResult operandTypeCheckResult = operand.typeCheck(); TypeCheckResult operandTypeCheckResult = operand.typeCheck();

View File

@ -36,7 +36,9 @@ public class Program implements Node {
// build type context // build type context
HashMap<String, String> classVars = new HashMap<>(); HashMap<String, String> classVars = new HashMap<>();
for (FieldDecl fieldDecl: oneClass.fieldDecls){ for (FieldDecl fieldDecl: oneClass.fieldDecls){
classVars.put(fieldDecl.type, fieldDecl.identifier); if(fieldDecl.type == "boolean")
fieldDecl.type = "bool";
classVars.put(fieldDecl.identifier, fieldDecl.type);
} }
typeContext.put(oneClass.name, classVars); typeContext.put(oneClass.name, classVars);

View File

@ -23,7 +23,7 @@ public class ReturnStatement extends AbstractType implements IStatement{
if (expression == null) { if (expression == null) {
result.type = "void"; result.type = "void";
} else { } else {
TypeCheckResult typedExpression = expression.typeCheck(); TypeCheckResult typedExpression = expression.typeCheck(methodContext, typeContext, localVars);
result.type = typedExpression.type; result.type = typedExpression.type;
} }
@ -39,7 +39,7 @@ public class ReturnStatement extends AbstractType implements IStatement{
if (expression != null) { if (expression != null) {
expression.codeGen(mv); expression.codeGen(mv);
//Get the Type of the expression //Get the Type of the expression
String type = expression.typeCheck().type; String type = expression.typeCheck(null, null, null).type;
if (type.equals("int") || type.equals("bool") || type.equals("char")) { if (type.equals("int") || type.equals("bool") || type.equals("char")) {
mv.visitInsn(Opcodes.IRETURN); mv.visitInsn(Opcodes.IRETURN);

View File

@ -37,23 +37,23 @@ public class AssignStatementExpression extends AbstractType implements IExpressi
String identifier = localVarIdentifier.getIdentifier(); String identifier = localVarIdentifier.getIdentifier();
leftType.type = localVars.get(identifier); leftType.type = localVars.get(identifier);
}else{ }else{
//leftType = left.typeCheck(); leftType = left.typeCheck(methodContext, typeContext, localVars);
} }
// TypeCheckResult rightType = right.typeCheck(); TypeCheckResult rightType = right.typeCheck(methodContext, typeContext, localVars);
//
// String upperbound = helper.upperBound(leftType.type, rightType.type); String upperbound = helper.upperBound(leftType.type, rightType.type);
// if (Objects.equals(upperbound, leftType.type)) { if (Objects.equals(upperbound, leftType.type)) {
// result.type = leftType.type; result.type = leftType.type;
// } }
// setTypeCheckResult(result); setTypeCheckResult(result);
return result; return result;
} }
@Override @Override
public void codeGen(MethodVisitor mv, HashMap<String, String> localVars) throws Exception { public void codeGen(MethodVisitor mv, HashMap<String, String> localVars) throws Exception {
if (left instanceof VarRefExpression varRef) { // if (left instanceof VarRefExpression varRef) {
//
} // }
} }