diff --git a/Source/TypeCheck/TypeCheckHelper.java b/Source/TypeCheck/TypeCheckHelper.java index e5a3a65..bd4aa58 100644 --- a/Source/TypeCheck/TypeCheckHelper.java +++ b/Source/TypeCheck/TypeCheckHelper.java @@ -1,5 +1,6 @@ package TypeCheck; +import java.util.List; import java.util.Objects; public class TypeCheckHelper { @@ -20,4 +21,12 @@ public class TypeCheckHelper { } return result; } + public static boolean typeExists(String type, List typeslist) { + + if(type.equals("int") || type.equals("bool") || type.equals("char")){ + return true; + } + return typeslist.contains(type); + } + } diff --git a/Source/abstractSyntaxTree/Class/FieldDecl.java b/Source/abstractSyntaxTree/Class/FieldDecl.java index 7524350..f22e2f6 100644 --- a/Source/abstractSyntaxTree/Class/FieldDecl.java +++ b/Source/abstractSyntaxTree/Class/FieldDecl.java @@ -1,14 +1,20 @@ package abstractSyntaxTree.Class; +import TypeCheck.AbstractType; +import TypeCheck.TypeCheckHelper; import TypeCheck.TypeCheckResult; +import abstractSyntaxTree.Program; import java.util.ArrayList; import java.util.List; -public class FieldDecl implements IClass { - private String type; +public class FieldDecl extends AbstractType implements IClass{ + private Program program; private String identifier; + public FieldDecl(Program program){ + this.program = program; + } public TypeCheckResult typeCheck(List classFieldsIdentifier) throws Exception { TypeCheckResult result = new TypeCheckResult(); if (classFieldsIdentifier.contains(this.identifier)){ @@ -16,8 +22,11 @@ public class FieldDecl implements IClass { } else { classFieldsIdentifier.add(this); } - result.type = this.type; + //TypeCheckHelper.typeExists(type, ) // need all types of classes + setTypeCheckResult(result); return result; + + //write field table } } diff --git a/Source/abstractSyntaxTree/Class/MethodDecl.java b/Source/abstractSyntaxTree/Class/MethodDecl.java index 3ae18c4..89f9fad 100644 --- a/Source/abstractSyntaxTree/Class/MethodDecl.java +++ b/Source/abstractSyntaxTree/Class/MethodDecl.java @@ -1,12 +1,24 @@ package abstractSyntaxTree.Class; import TypeCheck.TypeCheckResult; +import abstractSyntaxTree.Program; +import java.util.HashMap; import java.util.List; public class MethodDecl implements IClass { + + private Program program; + + private HashMap localVars; + + public MethodDecl(Program program){ + this.program = program; + } public TypeCheckResult typeCheck(List fieldsOrMethods) throws Exception { return null; +// write localvars + // write method table } } diff --git a/Source/abstractSyntaxTree/Datatype/RefType.java b/Source/abstractSyntaxTree/Datatype/RefType.java index 8c3d64e..59781a6 100644 --- a/Source/abstractSyntaxTree/Datatype/RefType.java +++ b/Source/abstractSyntaxTree/Datatype/RefType.java @@ -4,14 +4,28 @@ import TypeCheck.AbstractType; import TypeCheck.TypeCheckResult; import abstractSyntaxTree.Class.FieldDecl; import abstractSyntaxTree.Class.MethodDecl; +import abstractSyntaxTree.Program; import jdk.jshell.spi.ExecutionControl; -import org.objectweb.asm.MethodVisitor; +import java.util.HashMap; import java.util.List; public class RefType extends AbstractType implements IDatatype { + + String name; public List fieldDecls; + + private HashMap fieldsTable; // type, identifier public List methodDecls; + private HashMap methodsTable; // return type, method name without parameter + private Program program; + + private boolean hasMain; + + + public RefType(Program program){ + this.program = program; + } public RefType(List fieldDecls, List methodDecls){ this.fieldDecls = fieldDecls; this.methodDecls = methodDecls; diff --git a/Source/abstractSyntaxTree/Program.java b/Source/abstractSyntaxTree/Program.java index a590977..c7c8469 100644 --- a/Source/abstractSyntaxTree/Program.java +++ b/Source/abstractSyntaxTree/Program.java @@ -3,13 +3,24 @@ package abstractSyntaxTree; import TypeCheck.TypeCheckResult; import abstractSyntaxTree.Datatype.RefType; +import java.util.HashMap; import java.util.List; public class Program { public List classes; + public HashMap> classTypeIndentifierTable; // (class, (type, identifier)) + public TypeCheckResult typeCheck() throws Exception{ + for(RefType oneClass : classes){ + oneClass.typeCheck(); + } return null; } + public void codeGen() throws Exception{ + for(RefType oneClass : classes){ + oneClass.codeGen(); + } + } } diff --git a/Source/abstractSyntaxTree/Statement/BlockStatement.java b/Source/abstractSyntaxTree/Statement/BlockStatement.java index 3fb36e4..be04bbc 100644 --- a/Source/abstractSyntaxTree/Statement/BlockStatement.java +++ b/Source/abstractSyntaxTree/Statement/BlockStatement.java @@ -5,13 +5,17 @@ import TypeCheck.AbstractType; import abstractSyntaxTree.Expression.IExpression; import org.objectweb.asm.MethodVisitor; +import java.util.HashMap; import java.util.List; public class BlockStatement extends AbstractType implements IStatement{ //We will need a parameter which holds the symbol table + HashMap localVars; + HashMap typeIndentifierTable; // from program List statements; - public BlockStatement(List statements){ + public BlockStatement(List statements, HashMap localVars, HashMap typeIndentifierTable){ + this.statements = statements; } @Override diff --git a/Source/abstractSyntaxTree/Statement/IStatement.java b/Source/abstractSyntaxTree/Statement/IStatement.java index 65a2cb0..dd75e23 100644 --- a/Source/abstractSyntaxTree/Statement/IStatement.java +++ b/Source/abstractSyntaxTree/Statement/IStatement.java @@ -5,6 +5,8 @@ import org.objectweb.asm.MethodVisitor; public interface IStatement { + + TypeCheckResult typeCheck() throws Exception; void CodeGen(MethodVisitor mv) throws Exception;