diff --git a/.classpath b/.classpath index 3227a2c..d581ac3 100644 --- a/.classpath +++ b/.classpath @@ -2,20 +2,24 @@ - + + + + + - + - + - + diff --git a/lib/commons-lang3-3.5-javadoc.jar b/lib/commons-lang3-3.5-javadoc.jar deleted file mode 100644 index c3ef6f4..0000000 Binary files a/lib/commons-lang3-3.5-javadoc.jar and /dev/null differ diff --git a/lib/hamcrest-all-1.3-javadoc.jar b/lib/hamcrest-all-1.3-javadoc.jar deleted file mode 100644 index e1bb71c..0000000 Binary files a/lib/hamcrest-all-1.3-javadoc.jar and /dev/null differ diff --git a/lib/junit-4.12-javadoc.jar b/lib/junit-4.12-javadoc.jar deleted file mode 100644 index f7bdb82..0000000 Binary files a/lib/junit-4.12-javadoc.jar and /dev/null differ diff --git a/lib/junit.jar b/lib/junit.jar deleted file mode 100644 index aaf7444..0000000 Binary files a/lib/junit.jar and /dev/null differ diff --git a/src/pp/s1184725/boppi/BoppiBasicGenerator.java b/src/pp/s1184725/boppi/BoppiBasicGenerator.java index 88c3142..8f356b3 100644 --- a/src/pp/s1184725/boppi/BoppiBasicGenerator.java +++ b/src/pp/s1184725/boppi/BoppiBasicGenerator.java @@ -156,7 +156,7 @@ public class BoppiBasicGenerator extends BasicBaseVisitor { switch (ctx.op.getType()) { case BasicLexer.MINUS: - emit(OpCode.rsubI, new Num(0), getReg(ctx.singleExpr()), getReg(ctx)); + emit(OpCode.rsubI, getReg(ctx.singleExpr()), new Num(0), getReg(ctx)); } return null; } @@ -291,6 +291,7 @@ public class BoppiBasicGenerator extends BasicBaseVisitor { emit(OpCode.out, new Str("Unknown type: "), getReg(expr)); } } + copyReg(ctx.expr(0), ctx); return null; } } diff --git a/src/pp/s1184725/boppi/test/CheckerTest.java b/src/pp/s1184725/boppi/test/CheckerTest.java index 50befe7..0bb0f2b 100644 --- a/src/pp/s1184725/boppi/test/CheckerTest.java +++ b/src/pp/s1184725/boppi/test/CheckerTest.java @@ -1,25 +1,18 @@ package pp.s1184725.boppi.test; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.empty; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.*; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; -import java.util.logging.Level; -import java.util.logging.LogRecord; -import java.util.logging.Logger; +import java.util.logging.*; import org.apache.commons.lang3.tuple.Pair; import org.junit.Test; -import pp.s1184725.boppi.Annotations; -import pp.s1184725.boppi.BasicParser; -import pp.s1184725.boppi.BasicParserHelper; -import pp.s1184725.boppi.BoppiBasicChecker; +import pp.s1184725.boppi.*; public class CheckerTest { static final Path directory = Paths.get("src/pp/s1184725/boppi/test/parsing/"); @@ -39,9 +32,6 @@ public class CheckerTest { return pair.getRight(); } - protected void debug() { - log.forEach(entry -> System.out.println(entry.getMessage())); - } diff --git a/src/pp/s1184725/boppi/test/GeneratorTest.java b/src/pp/s1184725/boppi/test/GeneratorTest.java index 3f0de67..ed8b1cc 100644 --- a/src/pp/s1184725/boppi/test/GeneratorTest.java +++ b/src/pp/s1184725/boppi/test/GeneratorTest.java @@ -1,9 +1,18 @@ package pp.s1184725.boppi.test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.List; import java.util.logging.LogRecord; import java.util.logging.Logger; @@ -20,32 +29,83 @@ import pp.s1184725.boppi.BoppiBasicChecker; import pp.s1184725.boppi.BoppiBasicGenerator; public class GeneratorTest { - static private List generateAndGetLog(String code) { + static final Path directory = Paths.get("src/pp/s1184725/boppi/test/parsing/"); + private Pair> result; + + static private Pair> generateAndGetLog(String code, String input) { Logger logger = Logger.getAnonymousLogger(); Pair> pair = BasicParserHelper.getParserWithLog(code, logger); + return derp(logger, pair, input); + } + + static private Pair> generateAndGetLog(Path code, String input) throws IOException { + Logger logger = Logger.getAnonymousLogger(); + Pair> pair = BasicParserHelper.getParserWithLog(code, logger); + return derp(logger, pair, input); + } + + static private Pair> derp(Logger logger, Pair> pair, String input) { Annotations annotater = new Annotations(); ParserRuleContext tree = pair.getLeft().program(); new BoppiBasicChecker(logger, annotater).visit(tree); BoppiBasicGenerator generator = new BoppiBasicGenerator(annotater); generator.visit(tree); -// System.out.println(generator.prog.prettyPrint()); -// System.out.println(BasicParserHelper.getAnnotatedDOT(tree, annotater)); Simulator s = new Simulator(generator.prog); - InputStream in = new ByteArrayInputStream("1\nq\n".getBytes(StandardCharsets.UTF_8)); + InputStream in = new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8)); ByteArrayOutputStream out = new ByteArrayOutputStream(); s.setIn(in); s.setOut(out); - s.run(); - System.out.println(out.toString()); - return pair.getRight(); + try { + s.run(); + } + catch (Exception e) { + logger.severe(e.getMessage()); + } + return Pair.of(out.toString().replaceAll("\r\n", "\n"), pair.getRight()); + } + + + + + @Test + public void correctExpressionTest() throws IOException { + result = generateAndGetLog(directory.resolve("simpleExpression.boppi"), ""); + assertThat(result.getRight(), empty()); } @Test - public void basicTest() { -// generateAndGetLog("print(5*3)"); -// generateAndGetLog("var int x; var int y; x := 3*(y := 4); print(x,y)"); -// generateAndGetLog("print('T', 'e', 's', 't', '!')"); -// generateAndGetLog("var int i; if read(i) == 1 then var char c; read(c); print(c,c); else print(i) fi"); - generateAndGetLog("var int i; i := 10; while i > 0 do print('A', i); i := i-1 od"); + public void wrongExpressionTest() { + result = generateAndGetLog("1/0", ""); + assertThat(result.getRight(), hasSize(1)); + assertThat(result.getRight().get(0).getMessage(), containsString("zero")); + } + + @Test + public void correctVariableTest() throws IOException { + result = generateAndGetLog(directory.resolve("simpleVariable.boppi"), ""); + assertThat(result.getRight(), empty()); + } + + @Test + public void basicPrograms() throws IOException { + result = generateAndGetLog("print(5*3)", ""); + assertThat(result.getRight(), empty()); + assertThat(result.getLeft(), is("15\n")); + + result = generateAndGetLog("print('T', 'e', 's', 't', '!')", ""); + assertThat(result.getRight(), empty()); + assertThat(result.getLeft(), is("T\ne\ns\nt\n!\n")); + + result = generateAndGetLog("var int x; var int y; x := 3*(y := 4); print(x,y)", ""); + assertThat(result.getRight(), empty()); + assertThat(result.getLeft(), is("12\n4\n")); + + result = generateAndGetLog(directory.resolve("basicProgram1.boppi"), "1\nT\n"); + assertThat(result.getRight(), empty()); + assertThat(result.getLeft(), is("T\nT\n")); + + result = generateAndGetLog(directory.resolve("fibonacciIterative.boppi"), "6\n"); + assertThat(result.getRight(), empty()); + assertThat(result.getLeft(), is("13\n")); } } diff --git a/src/pp/s1184725/boppi/test/parsing/basicProgram1.boppi b/src/pp/s1184725/boppi/test/parsing/basicProgram1.boppi new file mode 100644 index 0000000..cc5b200 --- /dev/null +++ b/src/pp/s1184725/boppi/test/parsing/basicProgram1.boppi @@ -0,0 +1,9 @@ +var int i; + +if read(i) == 1 then + var char c; + read(c); + print(c,c); +else + print(i) +fi diff --git a/src/pp/s1184725/boppi/test/parsing/fibonacciIterative.boppi b/src/pp/s1184725/boppi/test/parsing/fibonacciIterative.boppi new file mode 100644 index 0000000..40d7212 --- /dev/null +++ b/src/pp/s1184725/boppi/test/parsing/fibonacciIterative.boppi @@ -0,0 +1,18 @@ +var int n; +var int i; +var int current; +var int previous; +current := 1; + +read(n); +i := 0; + +while i < n do + var int next; + next := current + previous; + previous := current; + current := next; + i := i+1; +od; + +print(current); diff --git a/src/pp/s1184725/boppi/test/parsing/simpleExpression.boppi b/src/pp/s1184725/boppi/test/parsing/simpleExpression.boppi index 072170c..789a483 100644 --- a/src/pp/s1184725/boppi/test/parsing/simpleExpression.boppi +++ b/src/pp/s1184725/boppi/test/parsing/simpleExpression.boppi @@ -26,3 +26,8 @@ true; 3 == 2; 1 < 2 == false; !(true <> false) == ('c' == 'd'); + +// printing +print('1'); +print(1)+4; +print(3, 'A', false);