method parameters
This commit is contained in:
parent
35fba57efa
commit
08d13a0df7
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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) {
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user