From 7fb7cea2f7ce8e66836db21ceda69d1adfa70a68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krau=C3=9F=2C=20Josefine?= Date: Thu, 4 Jul 2024 11:04:33 +0200 Subject: [PATCH] example files for presentation --- {src => Examples}/Fakultaet.java | 0 Examples/FieldAccessAndMethodCalls.java | 43 ++++++++++++++++ src/main/java/Compiler.java | 8 ++- src/main/java/Input.java | 49 ++++++++++++++----- .../Statement/ReturnStatement.java | 3 ++ .../AssignStatementExpression.java | 3 ++ 6 files changed, 93 insertions(+), 13 deletions(-) rename {src => Examples}/Fakultaet.java (100%) create mode 100644 Examples/FieldAccessAndMethodCalls.java diff --git a/src/Fakultaet.java b/Examples/Fakultaet.java similarity index 100% rename from src/Fakultaet.java rename to Examples/Fakultaet.java diff --git a/Examples/FieldAccessAndMethodCalls.java b/Examples/FieldAccessAndMethodCalls.java new file mode 100644 index 0000000..5f22a9c --- /dev/null +++ b/Examples/FieldAccessAndMethodCalls.java @@ -0,0 +1,43 @@ +public class FieldAccessAndMethodCalls { + public static void main(String[] args) { + Class1 c1 = new Class1(); + int i = c1.c2.c3.m3(1).m2().m1(); + print(i); + } +} + +public class Class1{ + int i1; + Class2 c2; + public Class1{ + this.c2 = new Class2(); + } + public int m1(){ + return i1; + } +} + +public class Class2{ + int i2; + Class3 c3; + public Class3{ + this.c3 = new Class3(); + } + public Class1 m2(){ + Class1 c1 = new Class2(); + c1.i1 = i2; + return c1; + } +} + +public class Class3{ + int i3; + public Class3(int i){ + this.i1 = i; + } + public Class2 m3(int i){ + Class2 c2 = new Class2(); + c2.i2 = i; + return c2; + } +} \ No newline at end of file diff --git a/src/main/java/Compiler.java b/src/main/java/Compiler.java index a2c39e1..dfb6104 100644 --- a/src/main/java/Compiler.java +++ b/src/main/java/Compiler.java @@ -22,10 +22,11 @@ public class Compiler { if (args.length < 1) { System.out.println("Usage: java -jar Compiler.jar [--suppress-details]"); - return; + // return; } - String filePath = args[0]; + //String filePath = args[0]; + String filePath = "C:/Users/dh10krj/Downloads/TestClass.java"; boolean suppressDetails = false; @@ -94,16 +95,19 @@ public class Compiler { }catch (Exception e){ System.out.println("A unexpected error occurred in TypeCheck."); System.out.println(e); + return; } if(!suppressDetails) System.out.println("No TypeCheck errors found."); + abstractSyntaxTree.codeGen();//todo remove try { abstractSyntaxTree.codeGen(); }catch (Exception e){ System.out.println("A error occurred during code generation. Your input was not compiled."); System.out.println(e); + return; } System.out.println("Your input was compiled. You can find the output in your current working directory."); } diff --git a/src/main/java/Input.java b/src/main/java/Input.java index 31cf09b..48172fc 100644 --- a/src/main/java/Input.java +++ b/src/main/java/Input.java @@ -1,13 +1,40 @@ -class Example1b { - public int fak(int number){ - if(number < 0){ - return 1; - } - int factorial = 1; - int i = 0; - while(i < number){ - factorial = factorial * i; - } - return factorial; +class FieldAccessAndMethodCalls { + public static void main(String[] args) { + Class1 c1 = new Class1(); + int i = c1.c2.c3.m3(1).m2().m1(); + System.out.println(i); } } + +class Class1{ + int i1; + Class2 c2; + public Class1() { + this.c2 = new Class2(); + } + public int m1(){ + return i1; + } +} + +class Class2{ + int i2; + Class3 c3; + public Class2(){ + this.c3 = new Class3(); + } + public Class1 m2(){ + Class1 c1 = new Class1(); + c1.i1 = i2; + return c1; + } +} + +class Class3{ + int i3; + public Class2 m3(int i){ + Class2 c2 = new Class2(); + c2.i2 = i; + return c2; + } +} \ No newline at end of file diff --git a/src/main/java/abstractSyntaxTree/Statement/ReturnStatement.java b/src/main/java/abstractSyntaxTree/Statement/ReturnStatement.java index bc21ffd..e5a8bff 100644 --- a/src/main/java/abstractSyntaxTree/Statement/ReturnStatement.java +++ b/src/main/java/abstractSyntaxTree/Statement/ReturnStatement.java @@ -5,6 +5,7 @@ import TypeCheck.TypeCheckResult; import TypeCheck.AbstractType; import abstractSyntaxTree.Expression.IExpression; import abstractSyntaxTree.Expression.InstVarExpression; +import abstractSyntaxTree.Expression.LocalVarIdentifier; import abstractSyntaxTree.Parameter.ParameterList; import abstractSyntaxTree.StatementExpression.MethodCallStatementExpression; import org.objectweb.asm.*; @@ -33,6 +34,8 @@ public class ReturnStatement extends AbstractType implements IStatement{ methodCallStatementExpression.thisClass = this.thisClass; else if(expression instanceof InstVarExpression instVarExpression) instVarExpression.thisClass = this.thisClass; + else if(expression instanceof LocalVarIdentifier localVarIdentifier) + localVarIdentifier.thisClass = this.thisClass; TypeCheckResult typedExpression = expression.typeCheck(methodContext, typeContext, localVars); result.type = typedExpression.type; } diff --git a/src/main/java/abstractSyntaxTree/StatementExpression/AssignStatementExpression.java b/src/main/java/abstractSyntaxTree/StatementExpression/AssignStatementExpression.java index 448d87a..7a8f033 100644 --- a/src/main/java/abstractSyntaxTree/StatementExpression/AssignStatementExpression.java +++ b/src/main/java/abstractSyntaxTree/StatementExpression/AssignStatementExpression.java @@ -36,6 +36,7 @@ public class AssignStatementExpression extends AbstractType implements IExpressi TypeCheckResult leftType; if (left instanceof LocalVarIdentifier localVarIdentifier) { + localVarIdentifier.thisClass = thisClass; leftType = new TypeCheckResult(); String identifier = localVarIdentifier.getIdentifier(); leftType.type = localVars.get(identifier); @@ -51,6 +52,8 @@ public class AssignStatementExpression extends AbstractType implements IExpressi } if(right instanceof MethodCallStatementExpression methodCallStatementExpression) methodCallStatementExpression.thisClass = this.thisClass; + if(right instanceof LocalVarIdentifier localVarIdentifierRight) + localVarIdentifierRight.thisClass = this.thisClass; TypeCheckResult rightType = right.typeCheck(methodContext, typeContext, localVars);