From d6b4b41d3c9c78bf57b9635e465ce51fb774f79c Mon Sep 17 00:00:00 2001 From: 404Simon Date: Wed, 20 Mar 2024 14:26:31 +0100 Subject: [PATCH] all done --- .idea/.gitignore | 2 + .idea/copilot/chatSessions/00000000000.xd | Bin 5481 -> 11162 bytes .idea/copilot/chatSessions/xd.lck | 4 +- src/main/java/de/dhbw/horb/ASTGenerator.java | 45 +++++--------- .../java/de/dhbw/horb/BlockGenerator.java | 21 +++++++ .../java/de/dhbw/horb/StatementGenerator.java | 21 ++++--- src/main/java/de/dhbw/horb/ast/Type.java | 11 +++- src/test/java/de/dhbw/horb/CompilerTest.java | 9 ++- .../de/dhbw/horb/ExpressionGeneratorTest.java | 5 +- .../de/dhbw/horb/StatementGeneratorTest.java | 55 +++++++++++++++--- 10 files changed, 115 insertions(+), 58 deletions(-) create mode 100644 src/main/java/de/dhbw/horb/BlockGenerator.java diff --git a/.idea/.gitignore b/.idea/.gitignore index 13566b8..a9d7db9 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -6,3 +6,5 @@ # Datasource local storage ignored files /dataSources/ /dataSources.local.xml +# GitHub Copilot persisted chat sessions +/copilot/chatSessions diff --git a/.idea/copilot/chatSessions/00000000000.xd b/.idea/copilot/chatSessions/00000000000.xd index 16799c98aef0de333961e985b69eda42c8fa9864..a3122a87dda27732c9b08a57f43c1879008e9622 100644 GIT binary patch literal 11162 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�B@UpLEi zQR8b;d7U6rQ{gq~yS_!H4Vz_Zw#c;6F4Lx&*CoE@RWe=ttW1}5$#m%pH>LWP=iZiR zYqw07i86htSEkE%$@F3Nmc;kS0-1hktxO-?^^R1&V&30N^fAr55?%SgyM9!FG>9{t zVpbW>8?GAOFx)o$gW(5BWQ%5qh94XL)$q%S$kzQbM8j_lpBetwm}e|BmKo<6tBoe( z65}JrRmKg*&Bo`AcB9L<-T0!B7zd2|j7N;8jTdQ3Jqdc2!TCl==D|M`pzB0k8W;@D zn*d$QJWbI4+Y0TQ(%QeJjJ`Jl5O_|xx(TYmsS~8jz z`6UGzO(5fSh4$$h!jHtJl+k2J$#`Qr$d|eT00w1nzA;Us3)3O9jVTO{BEGQ1l<~SW zUNc49VcliNOd;&MS&o9j=&*n%{Nyd|I)P3jSeeSYr(62QbVF=P=?=HrtPj?&vOej| z^jZKGb#}~Dq1)Lq(~E&S(^)EQ7<3dj{YV9O{ag~lp8v#r%lyFnV-(7s|IYkhOa*6G ztE#K2S5|ja_f?N3p=~A9v-*40zgaMA!HNa01qT`z f7XBjBE(?F1ycQ{oe$jSW_@9zpxPQ8<`{@4w3T2sP delta 7 OcmbOg{!(j0rYHaoa|1H~ diff --git a/.idea/copilot/chatSessions/xd.lck b/.idea/copilot/chatSessions/xd.lck index 88b7cff..744d48d 100644 --- a/.idea/copilot/chatSessions/xd.lck +++ b/.idea/copilot/chatSessions/xd.lck @@ -1,4 +1,4 @@ -Private property of Exodus: 36669@Simon-Lenovo-Ubuntu +Private property of Exodus: 41264@Simon-Lenovo-Ubuntu jetbrains.exodus.io.LockingManager.lock(LockingManager.kt:88) jetbrains.exodus.io.LockingManager.lock(LockingManager.kt:39) @@ -33,7 +33,7 @@ com.intellij.util.messages.impl.MessageBusImplKt.deliverMessage(MessageBusImpl.k com.intellij.util.messages.impl.MessageBusImplKt.pumpWaiting(MessageBusImpl.kt:402) com.intellij.util.messages.impl.MessageBusImplKt.access$pumpWaiting(MessageBusImpl.kt:1) com.intellij.util.messages.impl.MessagePublisher.invoke(MessageBusImpl.kt:461) -jdk.proxy7/jdk.proxy7.$Proxy158.onCopilotStatus(Unknown Source) +jdk.proxy6/jdk.proxy6.$Proxy166.onCopilotStatus(Unknown Source) com.github.copilot.status.CopilotStatusService.notifyApplication(CopilotStatusService.java:76) com.github.copilot.status.CopilotStatusService.notifyApplication(CopilotStatusService.java:64) com.github.copilot.github.GitHubAuthStartupActivity.handleAuthNotifications(GitHubAuthStartupActivity.java:54) diff --git a/src/main/java/de/dhbw/horb/ASTGenerator.java b/src/main/java/de/dhbw/horb/ASTGenerator.java index 90eb5df..ca13d9b 100644 --- a/src/main/java/de/dhbw/horb/ASTGenerator.java +++ b/src/main/java/de/dhbw/horb/ASTGenerator.java @@ -1,47 +1,28 @@ package de.dhbw.horb; import de.dhbw.horb.antlr.DecafParser; -import de.dhbw.horb.ast.Function; -import de.dhbw.horb.ast.Program; -import de.dhbw.horb.ast.Type; -import de.dhbw.horb.ast.Variable; +import de.dhbw.horb.ast.*; import java.util.ArrayList; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; public class ASTGenerator { - public static Program generateAST(DecafParser.ProgramContext parseTree){ - List variables = new ArrayList<>(); - for(DecafParser.VarContext varCtx : parseTree.var()){ - variables.add(generateVariable(varCtx)); - } - List funcs = new ArrayList<>(); - for(DecafParser.FuncContext fctx : parseTree.func()){ - funcs.add(generateFunc(fctx)); - } + public static Program generateAST(DecafParser.ProgramContext parseTree) { + List variables = parseTree.var().stream().map(var -> new Variable(var.id().getText(), Type.mapType(var.type().getText()))).toList(); + List funcs = parseTree.func().stream().map(ASTGenerator::generateFunc).toList(); return new Program(variables, funcs); } - public static Variable generateVariable(DecafParser.VarContext ctx) { - return new Variable(ctx.id().getText(), getType(ctx.type())); - } - - public static Variable generateVariable(DecafParser.ParamContext ctx) { - return new Variable(ctx.id().getText(), getType(ctx.type())); - } - public static Function generateFunc(DecafParser.FuncContext ctx) { - throw new RuntimeException("TODO"); - } - - public static Type getType(DecafParser.TypeContext ctx){ - if(ctx.INT() != null) - return Type.INT; - if(ctx.BOOL() != null) - return Type.BOOL; - if(ctx.VOID() != null) - return Type.VOID; - throw new RuntimeException(); + Type t = Type.mapType(ctx.type().getText()); + String id = ctx.id().getText(); + List params = Optional.ofNullable(ctx.params()) + .map(p -> p.param().stream().map(param -> new Variable(param.getText(), Type.mapType(param.type().getText()))).collect(Collectors.toList())) + .orElseGet(ArrayList::new); + Block block = new BlockGenerator().visit(ctx.block()); + return new Function(t, id, params, block); } } diff --git a/src/main/java/de/dhbw/horb/BlockGenerator.java b/src/main/java/de/dhbw/horb/BlockGenerator.java new file mode 100644 index 0000000..6119b77 --- /dev/null +++ b/src/main/java/de/dhbw/horb/BlockGenerator.java @@ -0,0 +1,21 @@ +package de.dhbw.horb; + +import de.dhbw.horb.antlr.DecafBaseVisitor; +import de.dhbw.horb.antlr.DecafParser; +import de.dhbw.horb.ast.Block; +import de.dhbw.horb.ast.Statement; +import de.dhbw.horb.ast.Type; +import de.dhbw.horb.ast.Variable; + +import java.util.List; + +public class BlockGenerator extends DecafBaseVisitor { + + @Override + public Block visitBlock(DecafParser.BlockContext ctx) { + List vars = ctx.var().stream().map(var -> new Variable(var.id().getText(), Type.mapType(var.type().getText()))).toList(); + List stmts = ctx.stmt().stream().map(stmt -> new StatementGenerator().visit(stmt)).toList(); + return new Block(vars, stmts); + } + +} diff --git a/src/main/java/de/dhbw/horb/StatementGenerator.java b/src/main/java/de/dhbw/horb/StatementGenerator.java index 48ca10e..3679c62 100644 --- a/src/main/java/de/dhbw/horb/StatementGenerator.java +++ b/src/main/java/de/dhbw/horb/StatementGenerator.java @@ -2,42 +2,47 @@ package de.dhbw.horb; import de.dhbw.horb.antlr.DecafBaseVisitor; import de.dhbw.horb.antlr.DecafParser; -import de.dhbw.horb.ast.Statement; +import de.dhbw.horb.ast.*; + +import java.util.ArrayList; public class StatementGenerator extends DecafBaseVisitor { @Override public Statement visitAssign(DecafParser.AssignContext ctx) { - throw new RuntimeException("TODO"); + return new Assignment(new Location(ctx.loc().getText()), new ExpressionGenerator().visit(ctx.expr())); } @Override public Statement visitIf(DecafParser.IfContext ctx) { - throw new RuntimeException("TODO"); + Block elseBlock = new Block(new ArrayList<>(), new ArrayList<>()); + if (ctx.block().size() > 1) + elseBlock = new BlockGenerator().visit(ctx.block(1)); + return new IfElse(new ExpressionGenerator().visit(ctx.expr()), new BlockGenerator().visit(ctx.block(0)), elseBlock); } @Override public Statement visitWhile(DecafParser.WhileContext ctx) { - throw new RuntimeException("TODO"); + return new While(new ExpressionGenerator().visit(ctx.expr()), new BlockGenerator().visit(ctx.block())); } @Override public Statement visitReturn(DecafParser.ReturnContext ctx) { - throw new RuntimeException("TODO"); + return new Return(new ExpressionGenerator().visit(ctx.expr())); } @Override public Statement visitReturnVoid(DecafParser.ReturnVoidContext ctx) { - throw new RuntimeException("TODO"); + return new ReturnVoid(); } @Override public Statement visitBreak(DecafParser.BreakContext ctx) { - throw new RuntimeException("TODO"); + return new Break(); } @Override public Statement visitContinue(DecafParser.ContinueContext ctx) { - throw new RuntimeException("TODO"); + return new Continue(); } } diff --git a/src/main/java/de/dhbw/horb/ast/Type.java b/src/main/java/de/dhbw/horb/ast/Type.java index 3004d76..ab35d97 100644 --- a/src/main/java/de/dhbw/horb/ast/Type.java +++ b/src/main/java/de/dhbw/horb/ast/Type.java @@ -3,5 +3,14 @@ package de.dhbw.horb.ast; public enum Type { INT, BOOL, - VOID + VOID; + + public static Type mapType(String type){ + return switch (type) { + case "int" -> Type.INT; + case "bool" -> Type.BOOL; + case "void" -> Type.VOID; + default -> throw new RuntimeException("Unknown type: " + type); + }; + } } diff --git a/src/test/java/de/dhbw/horb/CompilerTest.java b/src/test/java/de/dhbw/horb/CompilerTest.java index 79d1049..b89cd8b 100644 --- a/src/test/java/de/dhbw/horb/CompilerTest.java +++ b/src/test/java/de/dhbw/horb/CompilerTest.java @@ -1,5 +1,6 @@ package de.dhbw.horb; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import de.dhbw.horb.ast.Program; @@ -8,14 +9,12 @@ import org.junit.Test; /** * Unit test for simple App. */ -public class CompilerTest -{ +public class CompilerTest { /** * Rigorous Test :-) */ @Test - public void generateASTTest() - { + public void generateASTTest() { String inputString = "def int add(int x, int y)\n" + "{\n" + "return x + y;\n" + @@ -27,6 +26,6 @@ public class CompilerTest "return add(a, 2);\n" + "}"; Program ast = Compiler.generateAST(inputString); - assertTrue( ast.methods().size() == 2 ); + assertEquals(2, ast.methods().size()); } } diff --git a/src/test/java/de/dhbw/horb/ExpressionGeneratorTest.java b/src/test/java/de/dhbw/horb/ExpressionGeneratorTest.java index eaf7de5..6f7b361 100644 --- a/src/test/java/de/dhbw/horb/ExpressionGeneratorTest.java +++ b/src/test/java/de/dhbw/horb/ExpressionGeneratorTest.java @@ -8,6 +8,7 @@ import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.junit.Test; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** @@ -36,8 +37,8 @@ public class ExpressionGeneratorTest { Expression mCall = generateExpression("m(x,y)"); assertTrue(mCall instanceof FunctionCall); - assertTrue(((FunctionCall) mCall).name().equals("m")); - assertTrue(((FunctionCall) mCall).args().size() == 2); + assertEquals("m", ((FunctionCall) mCall).name()); + assertEquals(2, ((FunctionCall) mCall).args().size()); } @Test diff --git a/src/test/java/de/dhbw/horb/StatementGeneratorTest.java b/src/test/java/de/dhbw/horb/StatementGeneratorTest.java index 2a659bb..3f10d2e 100644 --- a/src/test/java/de/dhbw/horb/StatementGeneratorTest.java +++ b/src/test/java/de/dhbw/horb/StatementGeneratorTest.java @@ -8,24 +8,63 @@ import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.junit.Test; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** * Unit test for AST Generation of Expressions. */ -public class StatementGeneratorTest -{ +public class StatementGeneratorTest { @Test - public void whileTest() - { + public void whileTest() { Statement whileStmt = generateStatement("while(true){}"); assertTrue(whileStmt instanceof While); - assertTrue( ((While) whileStmt).block().stmts().size() == 0); + assertEquals(0, ((While) whileStmt).block().stmts().size()); } - private Statement generateStatement(String from){ - String inputString = from; - CharStream input = CharStreams.fromString(inputString); + @Test + public void whileTest2() { + Statement whileStmt = generateStatement("while(true){int x; x= 3;}"); + assertTrue(whileStmt instanceof While); + assertEquals(1, ((While) whileStmt).block().vars().size()); + assertEquals(1, ((While) whileStmt).block().stmts().size()); + } + + @Test + public void ifTest() { + Statement ifStmt = generateStatement("if(true){}"); + assertTrue(ifStmt instanceof IfElse); + assertTrue(((IfElse) ifStmt).ifBlock().stmts().isEmpty()); + } + + @Test + public void ifTest2() { + Statement ifStmt = generateStatement("if(true){bool cool; cool = true;}"); + assertTrue(ifStmt instanceof IfElse); + assertEquals(1, ((IfElse) ifStmt).ifBlock().vars().size()); + assertEquals(1, ((IfElse) ifStmt).ifBlock().stmts().size()); + } + + @Test + public void ifElseTest() { + Statement ifElseStmt = generateStatement("if(true){}else{}"); + assertTrue(ifElseStmt instanceof IfElse); + assertTrue(((IfElse) ifElseStmt).ifBlock().stmts().isEmpty()); + assertTrue(((IfElse) ifElseStmt).elseBlock().stmts().isEmpty()); + } + + @Test + public void ifElseTest2() { + Statement ifElseStmt = generateStatement("if(true){int x; x = 3;}else{int y; y = 4;}"); + assertTrue(ifElseStmt instanceof IfElse); + assertEquals(1, ((IfElse) ifElseStmt).ifBlock().vars().size()); + assertEquals(1, ((IfElse) ifElseStmt).ifBlock().stmts().size()); + assertEquals(1, ((IfElse) ifElseStmt).elseBlock().vars().size()); + assertEquals(1, ((IfElse) ifElseStmt).elseBlock().stmts().size()); + } + + private Statement generateStatement(String from) { + CharStream input = CharStreams.fromString(from); DecafLexer lexer = new DecafLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); DecafParser parser = new DecafParser(tokens);