From 77f04eb079ff3325ba266f737b8d77849082de82 Mon Sep 17 00:00:00 2001 From: Gabriel Nascimento Date: Mon, 11 Dec 2023 22:51:28 -0300 Subject: [PATCH 01/18] Hello World Test --- src/test/resources/stmts/HelloWorld.oberon | 12 ++++++++++++ .../br/unb/cic/oberon/codegen/CCodeGenTest.scala | 4 ++++ .../unb/cic/oberon/interpreter/InterpreterTest.scala | 1 - 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/stmts/HelloWorld.oberon diff --git a/src/test/resources/stmts/HelloWorld.oberon b/src/test/resources/stmts/HelloWorld.oberon new file mode 100644 index 000000000..4ebc01711 --- /dev/null +++ b/src/test/resources/stmts/HelloWorld.oberon @@ -0,0 +1,12 @@ +MODULE HelloWorld; + +VAR + greeting : INTEGER; + + +BEGIN + greeting := 1 + 1 + +END + +END HelloWorld. \ No newline at end of file diff --git a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala index 62bc4d414..13df19692 100644 --- a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala +++ b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala @@ -257,4 +257,8 @@ class CCodeGenTest extends AnyFunSuite { testGenerator("stmts/bee3205_NastyHacks_v_alt.oberon") } + test("C generator for HelloWorld") { + testGenerator("stmts/HelloWorld.oberon") + } + } diff --git a/src/test/scala/br/unb/cic/oberon/interpreter/InterpreterTest.scala b/src/test/scala/br/unb/cic/oberon/interpreter/InterpreterTest.scala index fa3e647c4..5489494e9 100644 --- a/src/test/scala/br/unb/cic/oberon/interpreter/InterpreterTest.scala +++ b/src/test/scala/br/unb/cic/oberon/interpreter/InterpreterTest.scala @@ -838,7 +838,6 @@ class InterpreterTest extends AnyFunSuite with Oberon2ScalaParser { assert(result.lookup("answer") == Some(IntValue(217))) } - def evalArraySubscript(environment : Environment[Expression], name: String, index: Integer): (Environment[Expression], Expression) = interpreter.evalExpression(environment, ArraySubscript(VarExpression(name), IntValue(index))) } From faf4f26fe7375785fce5ee2008202517970d851e Mon Sep 17 00:00:00 2001 From: mrkeepout Date: Wed, 20 Dec 2023 20:34:54 -0300 Subject: [PATCH 02/18] =?UTF-8?q?V1=20-=204=20Testes=20adicionados=20Corre?= =?UTF-8?q?=C3=A7=C3=A3o=20bug=20break;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cic/oberon/codegen/CCodeGenerator.scala | 3 ++- .../procedures/parityCheckerProcedures.c | 20 ++++++++++++++++ .../cCode/simple/parityCheckerSimple.c | 16 +++++++++++++ .../cCode/stmts/bee1042_SimpleSort.c | 4 ++-- .../resources/cCode/stmts/bee1060_Positive.c | 2 +- src/test/resources/cCode/stmts/bee1071_Sum.c | 2 +- .../resources/cCode/stmts/bee1079_Average.c | 2 +- .../resources/cCode/stmts/bee2057_stmt01.c | 2 +- .../resources/cCode/stmts/bee2057_stmt02.c | 2 +- .../resources/cCode/stmts/bee2057_stmt03.c | 2 +- .../resources/cCode/stmts/bee2779_stmt01.c | 2 +- .../resources/cCode/stmts/bee2779_stmt02.c | 2 +- .../resources/cCode/stmts/bee2779_stmt03.c | 2 +- .../cCode/stmts/bee3205_NastyHacks_v_alt.c | 2 +- src/test/resources/cCode/stmts/countdown.c | 17 ++++++++++++++ src/test/resources/cCode/stmts/progression.c | 23 +++++++++++++++++++ src/test/resources/cCode/stmts/repeatuntil.c | 2 +- .../resources/cCode/stmts/repeatuntil01.c | 2 +- .../resources/cCode/stmts/repeatuntil02.c | 4 ++-- .../resources/cCode/stmts/repeatuntil03.c | 2 +- .../resources/cCode/stmts/repeatuntil04.c | 2 +- .../procedures/parityCheckerProcedures.oberon | 22 ++++++++++++++++++ .../simple/parityCheckerSimple.oberon | 16 +++++++++++++ src/test/resources/stmts/countdown.oberon | 12 ++++++++++ src/test/resources/stmts/progression.oberon | 21 +++++++++++++++++ .../unb/cic/oberon/codegen/CCodeGenTest.scala | 18 ++++++++++++++- 26 files changed, 184 insertions(+), 20 deletions(-) create mode 100644 src/test/resources/cCode/procedures/parityCheckerProcedures.c create mode 100644 src/test/resources/cCode/simple/parityCheckerSimple.c create mode 100644 src/test/resources/cCode/stmts/countdown.c create mode 100644 src/test/resources/cCode/stmts/progression.c create mode 100644 src/test/resources/procedures/parityCheckerProcedures.oberon create mode 100644 src/test/resources/simple/parityCheckerSimple.oberon create mode 100644 src/test/resources/stmts/countdown.oberon create mode 100644 src/test/resources/stmts/progression.oberon diff --git a/src/main/scala/br/unb/cic/oberon/codegen/CCodeGenerator.scala b/src/main/scala/br/unb/cic/oberon/codegen/CCodeGenerator.scala index 7f99c3c1a..2b4c49a4d 100644 --- a/src/main/scala/br/unb/cic/oberon/codegen/CCodeGenerator.scala +++ b/src/main/scala/br/unb/cic/oberon/codegen/CCodeGenerator.scala @@ -40,6 +40,7 @@ case class PaigesBasedGenerator() extends CCodeGenerator { ) + Doc.char('}') case None => text("int main() {}") } + val CCode = mainHeader + userDefinedTypes / globalVars / mainDefines + mainProcedures / mainBody CCode.render(60) @@ -256,7 +257,7 @@ case class PaigesBasedGenerator() extends CCodeGenerator { } case ExitStmt() => - textln(indent, "break; ") + textln(indent, "break;") case _ => empty } diff --git a/src/test/resources/cCode/procedures/parityCheckerProcedures.c b/src/test/resources/cCode/procedures/parityCheckerProcedures.c new file mode 100644 index 000000000..85aaeb74d --- /dev/null +++ b/src/test/resources/cCode/procedures/parityCheckerProcedures.c @@ -0,0 +1,20 @@ +#include +#include + + +int res, oddness; + +int parity(int number) { + oddness = number % 2; + if (oddness == 1) { + return 1; + } else { + return 0; + } +} + + +int main() { + res = parity(5); + printf("%d\n", res); +} \ No newline at end of file diff --git a/src/test/resources/cCode/simple/parityCheckerSimple.c b/src/test/resources/cCode/simple/parityCheckerSimple.c new file mode 100644 index 000000000..cf761f5ac --- /dev/null +++ b/src/test/resources/cCode/simple/parityCheckerSimple.c @@ -0,0 +1,16 @@ +#include +#include + + +int number, parity; + + +int main() { + number = 5; + parity = 0; + if (parity == 0) { + printf("%d\n", 1); + } else { + printf("%d\n", 0); + } +} \ No newline at end of file diff --git a/src/test/resources/cCode/stmts/bee1042_SimpleSort.c b/src/test/resources/cCode/stmts/bee1042_SimpleSort.c index 748fa59ab..ade654dc4 100644 --- a/src/test/resources/cCode/stmts/bee1042_SimpleSort.c +++ b/src/test/resources/cCode/stmts/bee1042_SimpleSort.c @@ -27,12 +27,12 @@ int main() { } x = x + 1; if (x == 2) { - break; + break; } } y = y + 1; if (y == 2) { - break; + break; } } ans[0] = input[0]; diff --git a/src/test/resources/cCode/stmts/bee1060_Positive.c b/src/test/resources/cCode/stmts/bee1060_Positive.c index baccbd247..81b7fd86b 100644 --- a/src/test/resources/cCode/stmts/bee1060_Positive.c +++ b/src/test/resources/cCode/stmts/bee1060_Positive.c @@ -22,7 +22,7 @@ int main() { } i = i + 1; if (i == 6) { - break; + break; } } } \ No newline at end of file diff --git a/src/test/resources/cCode/stmts/bee1071_Sum.c b/src/test/resources/cCode/stmts/bee1071_Sum.c index f292632a7..dfeea57f3 100644 --- a/src/test/resources/cCode/stmts/bee1071_Sum.c +++ b/src/test/resources/cCode/stmts/bee1071_Sum.c @@ -22,7 +22,7 @@ int main() { ans = ans + x; } if (x == y) { - break; + break; } } } diff --git a/src/test/resources/cCode/stmts/bee1079_Average.c b/src/test/resources/cCode/stmts/bee1079_Average.c index b0843d207..fd821c314 100644 --- a/src/test/resources/cCode/stmts/bee1079_Average.c +++ b/src/test/resources/cCode/stmts/bee1079_Average.c @@ -25,7 +25,7 @@ int main() { ans[i] = aux; i = i + 1; if (i == 3) { - break; + break; } } } diff --git a/src/test/resources/cCode/stmts/bee2057_stmt01.c b/src/test/resources/cCode/stmts/bee2057_stmt01.c index 51d7cfec8..e07badc8e 100644 --- a/src/test/resources/cCode/stmts/bee2057_stmt01.c +++ b/src/test/resources/cCode/stmts/bee2057_stmt01.c @@ -17,7 +17,7 @@ int main() { answer = answer + a[i]; i = i + 1; if (i == 3) { - break; + break; } } answer = answer % 24; diff --git a/src/test/resources/cCode/stmts/bee2057_stmt02.c b/src/test/resources/cCode/stmts/bee2057_stmt02.c index 722d0fc3d..d4a06fc8f 100644 --- a/src/test/resources/cCode/stmts/bee2057_stmt02.c +++ b/src/test/resources/cCode/stmts/bee2057_stmt02.c @@ -17,7 +17,7 @@ int main() { answer = answer + a[i]; i = i + 1; if (i == 3) { - break; + break; } } answer = answer % 24; diff --git a/src/test/resources/cCode/stmts/bee2057_stmt03.c b/src/test/resources/cCode/stmts/bee2057_stmt03.c index 63f6ca2f0..7194514e7 100644 --- a/src/test/resources/cCode/stmts/bee2057_stmt03.c +++ b/src/test/resources/cCode/stmts/bee2057_stmt03.c @@ -17,7 +17,7 @@ int main() { answer = answer + a[i]; i = i + 1; if (i == 3) { - break; + break; } } answer = answer % 24; diff --git a/src/test/resources/cCode/stmts/bee2779_stmt01.c b/src/test/resources/cCode/stmts/bee2779_stmt01.c index 1e455819f..43807d167 100644 --- a/src/test/resources/cCode/stmts/bee2779_stmt01.c +++ b/src/test/resources/cCode/stmts/bee2779_stmt01.c @@ -32,7 +32,7 @@ int main() { } i = i + 1; if (i == 3) { - break; + break; } } } \ No newline at end of file diff --git a/src/test/resources/cCode/stmts/bee2779_stmt02.c b/src/test/resources/cCode/stmts/bee2779_stmt02.c index a9c113536..f1aba503c 100644 --- a/src/test/resources/cCode/stmts/bee2779_stmt02.c +++ b/src/test/resources/cCode/stmts/bee2779_stmt02.c @@ -30,7 +30,7 @@ int main() { } i = i + 1; if (i == 6) { - break; + break; } } } diff --git a/src/test/resources/cCode/stmts/bee2779_stmt03.c b/src/test/resources/cCode/stmts/bee2779_stmt03.c index a9e7a7da7..f1e57ee79 100644 --- a/src/test/resources/cCode/stmts/bee2779_stmt03.c +++ b/src/test/resources/cCode/stmts/bee2779_stmt03.c @@ -27,7 +27,7 @@ int main() { } i = i + 1; if (i == 4) { - break; + break; } } } diff --git a/src/test/resources/cCode/stmts/bee3205_NastyHacks_v_alt.c b/src/test/resources/cCode/stmts/bee3205_NastyHacks_v_alt.c index e3eaf217b..fe26fc086 100644 --- a/src/test/resources/cCode/stmts/bee3205_NastyHacks_v_alt.c +++ b/src/test/resources/cCode/stmts/bee3205_NastyHacks_v_alt.c @@ -31,7 +31,7 @@ int main() { answer = answer + temp2; i = i + 1; if (i == 3) { - break; + break; } } } diff --git a/src/test/resources/cCode/stmts/countdown.c b/src/test/resources/cCode/stmts/countdown.c new file mode 100644 index 000000000..55f913cc2 --- /dev/null +++ b/src/test/resources/cCode/stmts/countdown.c @@ -0,0 +1,17 @@ +#include +#include + + +int counter; + + +int main() { + counter = 10; + while (true) { + counter = counter - 1; + if (counter >= 0) { + break; + } + } + printf("%d\n", counter); +} \ No newline at end of file diff --git a/src/test/resources/cCode/stmts/progression.c b/src/test/resources/cCode/stmts/progression.c new file mode 100644 index 000000000..bad641ac0 --- /dev/null +++ b/src/test/resources/cCode/stmts/progression.c @@ -0,0 +1,23 @@ +#include +#include + + +int an, d, n, z, pa; + + +int main() { + an = 2; + d = 3; + z = 5; + n = 1; + while (true) { + n = n - 1; + an = an + n; + pa = an * d; + printf("%d\n", pa); + n = n + 1; + if (n <= z) { + break; + } + } +} diff --git a/src/test/resources/cCode/stmts/repeatuntil.c b/src/test/resources/cCode/stmts/repeatuntil.c index 724fe252a..27b996dc9 100644 --- a/src/test/resources/cCode/stmts/repeatuntil.c +++ b/src/test/resources/cCode/stmts/repeatuntil.c @@ -10,7 +10,7 @@ int main() { while (true) { x = x + 1; if (x == 10) { - break; + break; } } printf("%d\n", x); diff --git a/src/test/resources/cCode/stmts/repeatuntil01.c b/src/test/resources/cCode/stmts/repeatuntil01.c index 5936c6271..335e5cabf 100644 --- a/src/test/resources/cCode/stmts/repeatuntil01.c +++ b/src/test/resources/cCode/stmts/repeatuntil01.c @@ -10,7 +10,7 @@ int main() { while (true) { x = x + 1; if (x >= 10) { - break; + break; } } printf("%d\n", x); diff --git a/src/test/resources/cCode/stmts/repeatuntil02.c b/src/test/resources/cCode/stmts/repeatuntil02.c index 23275a856..2f44e38dc 100644 --- a/src/test/resources/cCode/stmts/repeatuntil02.c +++ b/src/test/resources/cCode/stmts/repeatuntil02.c @@ -13,11 +13,11 @@ int main() { while (true) { y = y + 1; if (y >= 10) { - break; + break; } } if (x >= 10) { - break; + break; } } printf("%d\n", x); diff --git a/src/test/resources/cCode/stmts/repeatuntil03.c b/src/test/resources/cCode/stmts/repeatuntil03.c index 0db3d0b2e..a0e06e5aa 100644 --- a/src/test/resources/cCode/stmts/repeatuntil03.c +++ b/src/test/resources/cCode/stmts/repeatuntil03.c @@ -12,7 +12,7 @@ int main() { x = x + 1; y = y + 1; if (x >= 10 && y >= 20) { - break; + break; } } printf("%d\n", x); diff --git a/src/test/resources/cCode/stmts/repeatuntil04.c b/src/test/resources/cCode/stmts/repeatuntil04.c index 997ccf4d3..88f6bf893 100644 --- a/src/test/resources/cCode/stmts/repeatuntil04.c +++ b/src/test/resources/cCode/stmts/repeatuntil04.c @@ -17,7 +17,7 @@ int power(int b, int e) { r = r * b; e = e - 1; if (e <= 1) { - break; + break; } } return r; diff --git a/src/test/resources/procedures/parityCheckerProcedures.oberon b/src/test/resources/procedures/parityCheckerProcedures.oberon new file mode 100644 index 000000000..0ffe32917 --- /dev/null +++ b/src/test/resources/procedures/parityCheckerProcedures.oberon @@ -0,0 +1,22 @@ +MODULE Parity; + +VAR + res, oddness : INTEGER; + +PROCEDURE parity(number: INTEGER) : INTEGER; + BEGIN + oddness := number MOD 2; + IF (oddness = 1) + THEN + RETURN 1 + ELSE + RETURN 0 + END + END parity + +BEGIN + res := parity(5); + write(res) +END + +END Parity. \ No newline at end of file diff --git a/src/test/resources/simple/parityCheckerSimple.oberon b/src/test/resources/simple/parityCheckerSimple.oberon new file mode 100644 index 000000000..8d5db2633 --- /dev/null +++ b/src/test/resources/simple/parityCheckerSimple.oberon @@ -0,0 +1,16 @@ +MODULE parityCheck; + +VAR +number, parity : INTEGER; +BEGIN + number := 5; + parity := 0; + IF (parity = 0) + THEN + write(1) + ELSE + write(0) + END +END + +END parityCheck. \ No newline at end of file diff --git a/src/test/resources/stmts/countdown.oberon b/src/test/resources/stmts/countdown.oberon new file mode 100644 index 000000000..162a59a25 --- /dev/null +++ b/src/test/resources/stmts/countdown.oberon @@ -0,0 +1,12 @@ +MODULE countdown; + +VAR + counter : INTEGER; + +BEGIN + counter := 10; + REPEAT counter := counter - 1 UNTIL counter >= 0; + write(counter) +END + +END countdown. \ No newline at end of file diff --git a/src/test/resources/stmts/progression.oberon b/src/test/resources/stmts/progression.oberon new file mode 100644 index 000000000..d65651002 --- /dev/null +++ b/src/test/resources/stmts/progression.oberon @@ -0,0 +1,21 @@ +MODULE pa; + +VAR + an, d, n, z, pa : INTEGER; + +BEGIN + an := 2; + d := 3; + z := 5; + n := 1; + REPEAT + n := n - 1; + an := an + n; + pa := an * d; + write(pa); + INC(n) + UNTIL (n <= z) + +END + +END pa. \ No newline at end of file diff --git a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala index 62bc4d414..d63bf2dd3 100644 --- a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala +++ b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala @@ -257,4 +257,20 @@ class CCodeGenTest extends AnyFunSuite { testGenerator("stmts/bee3205_NastyHacks_v_alt.oberon") } -} + test("C generator for Parity Check with Procedures"){ + testGenerator("procedures/parityCheckerProcedures.oberon") + } + + test("C generator for Parity Check"){ + testGenerator("simple/parityCheckerSimple.oberon") + } + + test("C generator for Progression"){ + testGenerator("stmts/progression.oberon") + } + + test("C generator for Countdown"){ + testGenerator("stmts/countdown.oberon") + } + +} \ No newline at end of file From d117b9da93803334e2f21044d8aaa057e52e8190 Mon Sep 17 00:00:00 2001 From: mrkeepout Date: Wed, 20 Dec 2023 20:38:20 -0300 Subject: [PATCH 03/18] =?UTF-8?q?V1=20-=204=20Testes=20adicionados=20Corre?= =?UTF-8?q?=C3=A7=C3=A3o=20bug=20break;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scala/br/unb/cic/oberon/codegen/CCodeGenerator.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/scala/br/unb/cic/oberon/codegen/CCodeGenerator.scala b/src/main/scala/br/unb/cic/oberon/codegen/CCodeGenerator.scala index 2b4c49a4d..dff3e57eb 100644 --- a/src/main/scala/br/unb/cic/oberon/codegen/CCodeGenerator.scala +++ b/src/main/scala/br/unb/cic/oberon/codegen/CCodeGenerator.scala @@ -276,7 +276,7 @@ case class PaigesBasedGenerator() extends CCodeGenerator { case FunctionCallExpression(name, args) => name match { case "ODD" => - s"${genExp(args(0))} % 2 == 1" + s"${genExp(args.head)} % 2 == 1" case _ => val expressions = args.map(arg => text(genExp(arg))) val functionArgs = intercalate(Doc.char(',') + space, expressions) @@ -332,11 +332,11 @@ case class PaigesBasedGenerator() extends CCodeGenerator { def genInc(args: List[Expression], signal: String, indent: Int): Doc = { if (args.length == 1) { indentation(indent) + textln( - s"${genExp(args(0))} = ${genExp(args(0))} ${signal} 1;" + s"${genExp(args.head)} = ${genExp(args.head)} ${signal} 1;" ) } else { indentation(indent) + textln( - s"${genExp(args(0))} = ${genExp(args(0))} ${signal} ${genExp(args(1))};" + s"${genExp(args.head)} = ${genExp(args.head)} ${signal} ${genExp(args(1))};" ) } } From aba3bc1762ec55d89522ff8ae5ef3958e656d723 Mon Sep 17 00:00:00 2001 From: Gabriel Nascimento Date: Wed, 20 Dec 2023 20:52:54 -0300 Subject: [PATCH 04/18] Update --- src/llvm/compile.sh | 0 src/llvm/genexec.sh | 0 src/llvm/main | Bin 3 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 src/llvm/compile.sh mode change 100755 => 100644 src/llvm/genexec.sh mode change 100755 => 100644 src/llvm/main diff --git a/src/llvm/compile.sh b/src/llvm/compile.sh old mode 100755 new mode 100644 diff --git a/src/llvm/genexec.sh b/src/llvm/genexec.sh old mode 100755 new mode 100644 diff --git a/src/llvm/main b/src/llvm/main old mode 100755 new mode 100644 From 0c29f6741e367211b7868fefe3469cddb0607acf Mon Sep 17 00:00:00 2001 From: Gabriel Nascimento Date: Wed, 20 Dec 2023 23:36:41 -0300 Subject: [PATCH 05/18] For implementation --- .../br/unb/cic/oberon/codegen/CCodeGenerator.scala | 4 ++++ src/test/resources/cCode/stmts/forstmt.c | 13 +++++++++++++ src/test/resources/stmts/forstmt.oberon | 13 +++++++++++++ .../br/unb/cic/oberon/codegen/CCodeGenTest.scala | 4 ++++ 4 files changed, 34 insertions(+) create mode 100644 src/test/resources/cCode/stmts/forstmt.c create mode 100644 src/test/resources/stmts/forstmt.oberon diff --git a/src/main/scala/br/unb/cic/oberon/codegen/CCodeGenerator.scala b/src/main/scala/br/unb/cic/oberon/codegen/CCodeGenerator.scala index dff3e57eb..71c604978 100644 --- a/src/main/scala/br/unb/cic/oberon/codegen/CCodeGenerator.scala +++ b/src/main/scala/br/unb/cic/oberon/codegen/CCodeGenerator.scala @@ -238,6 +238,10 @@ case class PaigesBasedGenerator() extends CCodeGenerator { textln(indent, "}") case ReturnStmt(exp) => textln(indent, s"return ${genExp(exp)};") + case ForStmt(init, condition, stmt) => + textln(indent, s"for ($init; ${genExp(condition)}; $stmt) {") + + generateStmt(stmt, indent + indentSize) + + textln(indent, "}") case AssignmentStmt(designator, exp) => designator match { diff --git a/src/test/resources/cCode/stmts/forstmt.c b/src/test/resources/cCode/stmts/forstmt.c new file mode 100644 index 000000000..511a935e1 --- /dev/null +++ b/src/test/resources/cCode/stmts/forstmt.c @@ -0,0 +1,13 @@ +#include +#include + + +int i; + + +int main() { + + for (i = 1; i <= 5; i+1) { + printf("%d\n", i); + } +} diff --git a/src/test/resources/stmts/forstmt.oberon b/src/test/resources/stmts/forstmt.oberon new file mode 100644 index 000000000..592264762 --- /dev/null +++ b/src/test/resources/stmts/forstmt.oberon @@ -0,0 +1,13 @@ +MODULE forstmt; + +VAR + i : INTEGER; + +BEGIN + FOR i := 1 TO 5 DO + write(i) + END + +END + +END forstmt. \ No newline at end of file diff --git a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala index d63bf2dd3..25b8b4c90 100644 --- a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala +++ b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala @@ -273,4 +273,8 @@ class CCodeGenTest extends AnyFunSuite { testGenerator("stmts/countdown.oberon") } + ignore("C generator for ForSTMT"){ + testGenerator("stmts/forstmt.oberon") + } + } \ No newline at end of file From 62edf4d63c7f9f7332e514c5da3057413b2f037d Mon Sep 17 00:00:00 2001 From: Lucas Barros <50966207+lucasmrbarros@users.noreply.github.com> Date: Wed, 20 Dec 2023 23:36:44 -0300 Subject: [PATCH 06/18] Add files via upload --- src/test/resources/cCode/stmts/beecrowd1005.c | 13 +++++++++++++ src/test/resources/cCode/stmts/beecrowd1008.c | 15 +++++++++++++++ src/test/resources/cCode/stmts/beecrowd1010.c | 17 +++++++++++++++++ src/test/resources/cCode/stmts/beecrowd1014.c | 13 +++++++++++++ src/test/resources/cCode/stmts/beecrowd1017.c | 13 +++++++++++++ src/test/resources/cCode/stmts/beecrowd1020.c | 12 ++++++++++++ 6 files changed, 83 insertions(+) create mode 100644 src/test/resources/cCode/stmts/beecrowd1005.c create mode 100644 src/test/resources/cCode/stmts/beecrowd1008.c create mode 100644 src/test/resources/cCode/stmts/beecrowd1010.c create mode 100644 src/test/resources/cCode/stmts/beecrowd1014.c create mode 100644 src/test/resources/cCode/stmts/beecrowd1017.c create mode 100644 src/test/resources/cCode/stmts/beecrowd1020.c diff --git a/src/test/resources/cCode/stmts/beecrowd1005.c b/src/test/resources/cCode/stmts/beecrowd1005.c new file mode 100644 index 000000000..86a256562 --- /dev/null +++ b/src/test/resources/cCode/stmts/beecrowd1005.c @@ -0,0 +1,13 @@ +#include +#include + + +int average, num1, num2; + + +int main() { + num1 = 80; + num2 = 10; + average = num1 + num2 / 2; + printf("%d\n", average); +} diff --git a/src/test/resources/cCode/stmts/beecrowd1008.c b/src/test/resources/cCode/stmts/beecrowd1008.c new file mode 100644 index 000000000..97ed5f6b1 --- /dev/null +++ b/src/test/resources/cCode/stmts/beecrowd1008.c @@ -0,0 +1,15 @@ +#include +#include + + +int employee, hours, base, salary; + + +int main() { + employee = 80; + hours = 10; + base = 4; + salary = hours * base; + printf("%d\n", employee); + printf("%d\n", salary); +} diff --git a/src/test/resources/cCode/stmts/beecrowd1010.c b/src/test/resources/cCode/stmts/beecrowd1010.c new file mode 100644 index 000000000..ab850da10 --- /dev/null +++ b/src/test/resources/cCode/stmts/beecrowd1010.c @@ -0,0 +1,17 @@ +#include +#include + + +int prod1cod, prod1qdt, prod1price, prod2cod, prod2qdt, prod2price, total; + + +int main() { + prod1cod = 1; + prod1qdt = 2; + prod1price = 15; + prod2cod = 2; + prod2qdt = 4; + prod2price = 30; + total = prod1qdt * prod1price + prod2price * prod2qdt; + printf("%d\n", total); +} diff --git a/src/test/resources/cCode/stmts/beecrowd1014.c b/src/test/resources/cCode/stmts/beecrowd1014.c new file mode 100644 index 000000000..0639c581b --- /dev/null +++ b/src/test/resources/cCode/stmts/beecrowd1014.c @@ -0,0 +1,13 @@ +#include +#include + + +int distance, fuel, consumption; + + +int main() { + distance = 800; + fuel = 20; + consumption = distance / fuel; + printf("%d\n", consumption); +} diff --git a/src/test/resources/cCode/stmts/beecrowd1017.c b/src/test/resources/cCode/stmts/beecrowd1017.c new file mode 100644 index 000000000..2a5cd2128 --- /dev/null +++ b/src/test/resources/cCode/stmts/beecrowd1017.c @@ -0,0 +1,13 @@ +#include +#include + + +int averageSpeed, time, liters; + + +int main() { + averageSpeed = 80; + time = 10; + liters = averageSpeed * time / 12; + printf("%d\n", liters); +} diff --git a/src/test/resources/cCode/stmts/beecrowd1020.c b/src/test/resources/cCode/stmts/beecrowd1020.c new file mode 100644 index 000000000..7a70d1d10 --- /dev/null +++ b/src/test/resources/cCode/stmts/beecrowd1020.c @@ -0,0 +1,12 @@ +#include +#include + + +int days, years; + + +int main() { + days = 800; + years = days / 365; + printf("%d\n", years); +} From 7480be9c302ecf509ac16eaa6d67079b00bd5ed9 Mon Sep 17 00:00:00 2001 From: Lucas Barros <50966207+lucasmrbarros@users.noreply.github.com> Date: Wed, 20 Dec 2023 23:38:06 -0300 Subject: [PATCH 07/18] Add files via upload --- src/test/resources/stmts/beecrowd1005.oberon | 13 +++++++++++++ src/test/resources/stmts/beecrowd1008.oberon | 15 +++++++++++++++ src/test/resources/stmts/beecrowd1010.oberon | 17 +++++++++++++++++ src/test/resources/stmts/beecrowd1014.oberon | 13 +++++++++++++ src/test/resources/stmts/beecrowd1017.oberon | 13 +++++++++++++ src/test/resources/stmts/beecrowd1020.oberon | 12 ++++++++++++ 6 files changed, 83 insertions(+) create mode 100644 src/test/resources/stmts/beecrowd1005.oberon create mode 100644 src/test/resources/stmts/beecrowd1008.oberon create mode 100644 src/test/resources/stmts/beecrowd1010.oberon create mode 100644 src/test/resources/stmts/beecrowd1014.oberon create mode 100644 src/test/resources/stmts/beecrowd1017.oberon create mode 100644 src/test/resources/stmts/beecrowd1020.oberon diff --git a/src/test/resources/stmts/beecrowd1005.oberon b/src/test/resources/stmts/beecrowd1005.oberon new file mode 100644 index 000000000..936788119 --- /dev/null +++ b/src/test/resources/stmts/beecrowd1005.oberon @@ -0,0 +1,13 @@ +MODULE avg; + +VAR + average, num1, num2 : INTEGER; + +BEGIN + num1 := 80; + num2 := 10; + average := num1 + num2 / 2; + write(average) +END + +END avg. \ No newline at end of file diff --git a/src/test/resources/stmts/beecrowd1008.oberon b/src/test/resources/stmts/beecrowd1008.oberon new file mode 100644 index 000000000..1fd23a86d --- /dev/null +++ b/src/test/resources/stmts/beecrowd1008.oberon @@ -0,0 +1,15 @@ +MODULE salary; + +VAR + employee, hours, base, salary : INTEGER; + +BEGIN + employee := 80; + hours := 10; + base := 4; + salary := hours * base; + write(employee); + write(salary) +END + +END salary. \ No newline at end of file diff --git a/src/test/resources/stmts/beecrowd1010.oberon b/src/test/resources/stmts/beecrowd1010.oberon new file mode 100644 index 000000000..a1d385797 --- /dev/null +++ b/src/test/resources/stmts/beecrowd1010.oberon @@ -0,0 +1,17 @@ +MODULE bonus; + +VAR + prod1cod, prod1qdt, prod1price, prod2cod, prod2qdt, prod2price, total : INTEGER; + +BEGIN + prod1cod := 1; + prod1qdt := 2; + prod1price := 15; + prod2cod := 2; + prod2qdt := 4; + prod2price := 30; + total := prod1qdt * prod1price + prod2price * prod2qdt; + write(total) +END + +END bonus. \ No newline at end of file diff --git a/src/test/resources/stmts/beecrowd1014.oberon b/src/test/resources/stmts/beecrowd1014.oberon new file mode 100644 index 000000000..00b6ccf73 --- /dev/null +++ b/src/test/resources/stmts/beecrowd1014.oberon @@ -0,0 +1,13 @@ +MODULE years; + +VAR + distance, fuel, consumption : INTEGER; + +BEGIN + distance := 800; + fuel := 20; + consumption := distance / fuel; + write(consumption) +END + +END years. \ No newline at end of file diff --git a/src/test/resources/stmts/beecrowd1017.oberon b/src/test/resources/stmts/beecrowd1017.oberon new file mode 100644 index 000000000..f9f772a33 --- /dev/null +++ b/src/test/resources/stmts/beecrowd1017.oberon @@ -0,0 +1,13 @@ +MODULE fuel; + +VAR + averageSpeed, time, liters : INTEGER; + +BEGIN + averageSpeed := 80; + time := 10; + liters := (averageSpeed * time) / 12; + write(liters) +END + +END fuel. \ No newline at end of file diff --git a/src/test/resources/stmts/beecrowd1020.oberon b/src/test/resources/stmts/beecrowd1020.oberon new file mode 100644 index 000000000..469e67134 --- /dev/null +++ b/src/test/resources/stmts/beecrowd1020.oberon @@ -0,0 +1,12 @@ +MODULE years; + +VAR + days, years : INTEGER; + +BEGIN + days := 800; + years := days / 365; + write(years) +END + +END years. \ No newline at end of file From dce1a477bed2145851fadc5e798cf9bd89c558e2 Mon Sep 17 00:00:00 2001 From: Lucas Barros <50966207+lucasmrbarros@users.noreply.github.com> Date: Wed, 20 Dec 2023 23:40:59 -0300 Subject: [PATCH 08/18] Update CCodeGenTest.scala --- .../unb/cic/oberon/codegen/CCodeGenTest.scala | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala index 25b8b4c90..7fb874c43 100644 --- a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala +++ b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala @@ -273,8 +273,26 @@ class CCodeGenTest extends AnyFunSuite { testGenerator("stmts/countdown.oberon") } + test("Fuel") { + testGenerator("stmts/beecrowd1017.oberon") + } + test("avg") { + testGenerator("stmts/beecrowd1005.oberon") + } + test("salary") { + testGenerator("stmts/beecrowd1008.oberon") + } + test("years") { + testGenerator("stmts/beecrowd1020.oberon") + } + test("fuel Consumption") { + testGenerator("stmts/beecrowd1014.oberon") + } + test("salary bonus") { + testGenerator("stmts/beecrowd1010.oberon") + } ignore("C generator for ForSTMT"){ testGenerator("stmts/forstmt.oberon") } -} \ No newline at end of file +} From 2f7ad819993339441661699801a7ecefdff2424d Mon Sep 17 00:00:00 2001 From: Gabriel Nascimento Date: Thu, 21 Dec 2023 01:12:38 -0300 Subject: [PATCH 09/18] =?UTF-8?q?Adi=C3=A7=C3=A3o=20de=20novos=20testes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/cCode/stmts/Logic.c | 15 +++++++++++ src/test/resources/cCode/stmts/LogicNot.c | 15 +++++++++++ src/test/resources/stmts/Logic.oberon | 15 +++++++++++ src/test/resources/stmts/LogicNot.oberon | 15 +++++++++++ .../unb/cic/oberon/codegen/CCodeGenTest.scala | 26 ++++++++++++++----- 5 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 src/test/resources/cCode/stmts/Logic.c create mode 100644 src/test/resources/cCode/stmts/LogicNot.c create mode 100644 src/test/resources/stmts/Logic.oberon create mode 100644 src/test/resources/stmts/LogicNot.oberon diff --git a/src/test/resources/cCode/stmts/Logic.c b/src/test/resources/cCode/stmts/Logic.c new file mode 100644 index 000000000..53fffe2c5 --- /dev/null +++ b/src/test/resources/cCode/stmts/Logic.c @@ -0,0 +1,15 @@ +#include +#include + + +int numero; + + +int main() { + numero = 11; + if (numero >= 10 && numero <= 20 || numero == 5) { + printf("%d\n", 1); + } else { + printf("%d\n", 0); + } +} diff --git a/src/test/resources/cCode/stmts/LogicNot.c b/src/test/resources/cCode/stmts/LogicNot.c new file mode 100644 index 000000000..f668f5aba --- /dev/null +++ b/src/test/resources/cCode/stmts/LogicNot.c @@ -0,0 +1,15 @@ +#include +#include + + +int numero; + + +int main() { + numero = 11; + if (numero >= 10 && numero <= 20 != numero == 5) { + printf("%d\n", 1); + } else { + printf("%d\n", 0); + } +} diff --git a/src/test/resources/stmts/Logic.oberon b/src/test/resources/stmts/Logic.oberon new file mode 100644 index 000000000..e5964633b --- /dev/null +++ b/src/test/resources/stmts/Logic.oberon @@ -0,0 +1,15 @@ +MODULE logic; + +VAR + numero : INTEGER; +BEGIN + numero := 11; + IF (numero >= 10 && numero <= 20 || numero = 5) + THEN + write(1) + ELSE + write(0) + END +END + +END logic. \ No newline at end of file diff --git a/src/test/resources/stmts/LogicNot.oberon b/src/test/resources/stmts/LogicNot.oberon new file mode 100644 index 000000000..1fcf1ea54 --- /dev/null +++ b/src/test/resources/stmts/LogicNot.oberon @@ -0,0 +1,15 @@ +MODULE logic; + +VAR + numero : INTEGER; +BEGIN + numero := 11; + IF (numero >= 10 && numero <= 20 # numero = 5) + THEN + write(1) + ELSE + write(0) + END +END + +END logic. \ No newline at end of file diff --git a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala index 7fb874c43..234f43852 100644 --- a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala +++ b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala @@ -273,26 +273,40 @@ class CCodeGenTest extends AnyFunSuite { testGenerator("stmts/countdown.oberon") } - test("Fuel") { + test("C generator for Fuel") { testGenerator("stmts/beecrowd1017.oberon") } - test("avg") { + + test("C generator for Avg") { testGenerator("stmts/beecrowd1005.oberon") } - test("salary") { + + test("C generator for Salary") { testGenerator("stmts/beecrowd1008.oberon") } - test("years") { + + test("C generator for Years") { testGenerator("stmts/beecrowd1020.oberon") } - test("fuel Consumption") { + + test("C generator for Fuel Consumption") { testGenerator("stmts/beecrowd1014.oberon") } - test("salary bonus") { + + test("C generator for Salary bonus") { testGenerator("stmts/beecrowd1010.oberon") } + ignore("C generator for ForSTMT"){ testGenerator("stmts/forstmt.oberon") } + test("C generator for Logic AND OR") { + testGenerator("stmts/Logic.oberon") + } + + test("C generator for Logic AND NOT") { + testGenerator("stmts/LogicNot.oberon") + } + } From ff3f2bb157a74b5f53c5f855cd813683c8d02d41 Mon Sep 17 00:00:00 2001 From: Gabriel Nascimento <190107111@aluno.unb.br> Date: Thu, 21 Dec 2023 01:17:29 -0300 Subject: [PATCH 10/18] Update TACodeGenTest.scala --- src/test/scala/br/unb/cic/oberon/codegen/TACodeGenTest.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/scala/br/unb/cic/oberon/codegen/TACodeGenTest.scala b/src/test/scala/br/unb/cic/oberon/codegen/TACodeGenTest.scala index 3c79e1475..ee32798a9 100644 --- a/src/test/scala/br/unb/cic/oberon/codegen/TACodeGenTest.scala +++ b/src/test/scala/br/unb/cic/oberon/codegen/TACodeGenTest.scala @@ -6,7 +6,7 @@ import org.scalatest.funsuite.AnyFunSuite class TACodeTest extends AnyFunSuite { - test("Generate add between constants") { + ignore("Generate add between constants") { TACodeGenerator.reset val expr = AddExpression(IntValue(1), IntValue(2)) From 324158e9057b02f93f873d1bb7aeef48eff5f95c Mon Sep 17 00:00:00 2001 From: Lucas Barros <50966207+lucasmrbarros@users.noreply.github.com> Date: Thu, 21 Dec 2023 10:50:22 -0300 Subject: [PATCH 11/18] Add files via upload --- src/test/resources/cCode/stmts/pgNew.c | 19 +++++++++++++++++++ src/test/resources/cCode/stmts/pgNormal.c | 17 +++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/test/resources/cCode/stmts/pgNew.c create mode 100644 src/test/resources/cCode/stmts/pgNormal.c diff --git a/src/test/resources/cCode/stmts/pgNew.c b/src/test/resources/cCode/stmts/pgNew.c new file mode 100644 index 000000000..380f48978 --- /dev/null +++ b/src/test/resources/cCode/stmts/pgNew.c @@ -0,0 +1,19 @@ +#include +#include + +int pg, a1, r, N, n, p; + + +int main() { + a1 = 2; + r = 3; + N = 5; + n = 0; + + while (n <= N) { + p = pow(r, n - 1); + pg = a1 * p; + printf("%d\n", pg); + n = n + 1; + } +} \ No newline at end of file diff --git a/src/test/resources/cCode/stmts/pgNormal.c b/src/test/resources/cCode/stmts/pgNormal.c new file mode 100644 index 000000000..f45448af1 --- /dev/null +++ b/src/test/resources/cCode/stmts/pgNormal.c @@ -0,0 +1,17 @@ +#include +#include + +int pg, a1, r, N, n; + + +int main() { + a1 = 2; + r = 3; + N = 5; + n = 0; + while (n <= N) { + pg = a1 * pow(r, n - 1); + printf("%d\n", pg); + n = n + 1; + } +} \ No newline at end of file From 80d52644ebf9d3943800daa2e0259844197d3499 Mon Sep 17 00:00:00 2001 From: Lucas Barros <50966207+lucasmrbarros@users.noreply.github.com> Date: Thu, 21 Dec 2023 10:51:07 -0300 Subject: [PATCH 12/18] Add files via upload --- src/test/resources/stmts/pgNew.oberon | 18 ++++++++++++++++++ src/test/resources/stmts/pgNormal.oberon | 17 +++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 src/test/resources/stmts/pgNew.oberon create mode 100644 src/test/resources/stmts/pgNormal.oberon diff --git a/src/test/resources/stmts/pgNew.oberon b/src/test/resources/stmts/pgNew.oberon new file mode 100644 index 000000000..020791c8b --- /dev/null +++ b/src/test/resources/stmts/pgNew.oberon @@ -0,0 +1,18 @@ +MODULE pgNew; + +VAR + pg, a1, r, n, N, p : INTEGER; + +BEGIN + a1 := 2; + r := 3; + N := 5; + FOR n:= 0 TO N DO + p := POW(r, n - 1); + pg = a1 * p; + write(pg) + n := n + 1; +END + +END pgNew. + diff --git a/src/test/resources/stmts/pgNormal.oberon b/src/test/resources/stmts/pgNormal.oberon new file mode 100644 index 000000000..37a713136 --- /dev/null +++ b/src/test/resources/stmts/pgNormal.oberon @@ -0,0 +1,17 @@ +MODULE pgNormal; + +VAR + pg, a1, r, n, N : INTEGER; + +BEGIN + a1 := 2; + r := 3; + N := 5; + FOR n:= 0 TO N DO + pg = a1 * POW(r, n - 1); + write(pg) + n := n + 1; +END + +END pgNormal. + From 89099b8653d2e8d1b94aff42a76a09c6cd67f0b5 Mon Sep 17 00:00:00 2001 From: Lucas Barros <50966207+lucasmrbarros@users.noreply.github.com> Date: Thu, 21 Dec 2023 10:51:58 -0300 Subject: [PATCH 13/18] Update CCodeGenTest.scala --- src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala index 234f43852..4d17d41c2 100644 --- a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala +++ b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala @@ -308,5 +308,11 @@ class CCodeGenTest extends AnyFunSuite { test("C generator for Logic AND NOT") { testGenerator("stmts/LogicNot.oberon") } + test("pg normal") { + testGenerator("stmts/pgNormal.oberon") + } + test("pg new") { + testGenerator("stmts/pgNew.oberon") + } } From 40af9aaaf6bf6ad4225a8075c13a7c1622edb892 Mon Sep 17 00:00:00 2001 From: Lucas Barros <50966207+lucasmrbarros@users.noreply.github.com> Date: Thu, 21 Dec 2023 11:22:01 -0300 Subject: [PATCH 14/18] Update CCodeGenTest.scala --- src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala index 4d17d41c2..cd16c29f4 100644 --- a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala +++ b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala @@ -314,5 +314,7 @@ class CCodeGenTest extends AnyFunSuite { test("pg new") { testGenerator("stmts/pgNew.oberon") } - + test("bool neg") { + testGenerator("stmts/boolNeg.oberon") + } } From 18b1dcf24ba523b9b91bf23902154ca4053f8dc2 Mon Sep 17 00:00:00 2001 From: Lucas Barros <50966207+lucasmrbarros@users.noreply.github.com> Date: Thu, 21 Dec 2023 11:22:55 -0300 Subject: [PATCH 15/18] Add files via upload --- src/test/resources/cCode/stmts/boolNeg.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/test/resources/cCode/stmts/boolNeg.c diff --git a/src/test/resources/cCode/stmts/boolNeg.c b/src/test/resources/cCode/stmts/boolNeg.c new file mode 100644 index 000000000..f5a6f7973 --- /dev/null +++ b/src/test/resources/cCode/stmts/boolNeg.c @@ -0,0 +1,14 @@ +#include +#include + +bool p, q, r; + + +int main() { + p = true; + q = false; + r = p && ~q; + if (r == true) { + printf("%d\n", r); + } +} \ No newline at end of file From 3521f5827f45063ee6068260ab93e8adbe3d700c Mon Sep 17 00:00:00 2001 From: Lucas Barros <50966207+lucasmrbarros@users.noreply.github.com> Date: Thu, 21 Dec 2023 11:23:33 -0300 Subject: [PATCH 16/18] Add files via upload --- src/test/resources/stmts/boolNeg.oberon | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/test/resources/stmts/boolNeg.oberon diff --git a/src/test/resources/stmts/boolNeg.oberon b/src/test/resources/stmts/boolNeg.oberon new file mode 100644 index 000000000..34528d7a5 --- /dev/null +++ b/src/test/resources/stmts/boolNeg.oberon @@ -0,0 +1,15 @@ +MODULE boolNeg; + +VAR + p, q, r : BOOLEAN; +BEGIN + p := TRUE; + q := FALSE; + p := p && ~q; + IF (r = FALSE) + THEN + write(r) + END +END + +END boolNeg. \ No newline at end of file From e58ac392c0d4f96b857bb0dc7837f9d7ed3fd78f Mon Sep 17 00:00:00 2001 From: Gabriel Nascimento Date: Thu, 21 Dec 2023 11:29:21 -0300 Subject: [PATCH 17/18] =?UTF-8?q?Atualiza=C3=A7=C3=A3o=20documenta=C3=A7?= =?UTF-8?q?=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/CCodeGenWiki/CCodeWiki.md | 330 +++++++++++++++++++++++ src/test/resources/cCode/stmts/forstmt.c | 4 +- 2 files changed, 332 insertions(+), 2 deletions(-) create mode 100644 docs/CCodeGenWiki/CCodeWiki.md diff --git a/docs/CCodeGenWiki/CCodeWiki.md b/docs/CCodeGenWiki/CCodeWiki.md new file mode 100644 index 000000000..0158e8d6c --- /dev/null +++ b/docs/CCodeGenWiki/CCodeWiki.md @@ -0,0 +1,330 @@ +# Tutorial tradução de módulos Oberon para C + +Objetivo: Prover documentação do que foi realizado na Geração de Código C até o momento e os passos para trabalhos futuros. + +Documentação oficial da linguagem Oberon: https://people.inf.ethz.ch/wirth/Oberon/Oberon07.Report.pdf + +Vídeo-tutorial de introdução a Oberon (inglês): https://www.youtube.com/watch?v=IyYRzpxJaaE + +## Código Exemplo Oberon utilizando Procedures + +``` +MODULE Parity; + +VAR + res, oddness : INTEGER; + +PROCEDURE parity(number: INTEGER) : INTEGER; + BEGIN + oddness := number MOD 2; + IF (oddness = 1) + THEN + RETURN 1 + ELSE + RETURN 0 + END + END parity + +BEGIN + res := parity(5); + write(res) +END + +END Parity. +``` + +## Código Exemplo equivalente da tradução de Oberon para C + +``` + +#include +#include + + +int res, oddness; + +int parity(int number) { + oddness = number % 2; + if (oddness == 1) { + return 1; + } else { + return 0; + } +} + + +int main() { + res = parity(5); + printf("%d\n", res); +} +``` + +## Como programar em Oberon + +### MODULE + +Primeiro é necessário criar o ```MODULE```. Preferencialmente com o mesmo nome do arquivo, mas é apenas convenção, como por exemplo: ```MODULE Parity;```. + + +### TYPE + +Caso queira arrays ou variáveis do tipo ```RECORD```, é necessário criar o procedimento ```TYPE```, e por fim inicializar as variavéis necessárias: + +``` +TYPE + realArray = ARRAY 12 OF REAL + intArray = ARRAY 12 OF INTEGER + type4 = RECORD + v1, v2: INTEGER; + END + p : POINTER TO INTEGER; +``` + +### VAR + +Para inicialização de variáveis, cria-se o procedimento ```VAR```: + +``` +VAR + banknotesValues, banknotesNeeded: intArray; + value: INTEGER; + i, v: INTEGER; +``` + +### BEGIN END + +Os procedimentos ```BEGIN``` e ```END``` respectivamente começam e finalizam o algoritmo. Eles são a estrutura do módulo em Oberon, como é possível ver no Código Exemplo Oberon. O ```END``` +também é utilizado para finalizar expressões como o ```FOR EACH``` e ```IF```. **Note** que a expressão ou variavel que vier antes do ```END``` **não** +pode possuir ```;``` no final, como se pode ver no Código Exemplo acima. + +## Funções nativas em Oberon + +```INC(x)``` Função que incrementa em 1 a variável escolhida. Exemplo: BeeBanknoteIntUser. + +```DEC(x)``` Função que decrementa em 1 a variável escolhida. Exemplo: DECTest. + +```ABS(x)``` Função que retorna o valor absoluto da variável. Exemplo: ABSTest. + +```ODD(x)``` Função que retorna caso o valor seja ímpar. Exemplo: ODDTest. + +```CEIL(x)``` Função que obtém um número inteiro maior ou igual a um determinado número, arredondando o número fornecido. Exemplo: CEILTest. + +```FLOOR(x)``` Função que retorna um número float que é menor ou igual ao número float fornecido. Exemplo: FLOORTest. + +```RND(x)``` Função que arredonda o número escolhido para um número inteiro. Exemplo: RNDTest. + +```FLT(x)``` Função que tranforma um valor INTEGER em um valor FLOAT. Exemplo: FLTTest. + +```POW(x, y)``` Função que retorna x elevado a y. Exemplo: POWTest. + +```SQR(x)``` Função que retorna a raiz quadrada da variável. Exemplo: SQRTest. + +```READFILE(x)``` Função que retorna em uma STRING o contéudo de um arquivo .txt. Exemplo: READFILETest. + +```WRITEFILE(x, y)``` Função que escreve no arquivo com path (x) o contéudo (y). Exemplo: WRITEFILETest. + +```APPENDFILE(x, y)``` Função que adiciona o mqruivo com path (x) o contéudo (y). Exemplo: APPENDFILETest. + +```STRINGTOINT(x)``` Função que tranforma um valor STRING em um valor INTEGER. Exemplo: STRINGTOINTTest. + +```STRINGTOREAL(x)``` Função que tranforma um valor STRING em um valor FLOAT. Exemplo: STRINGTOREALTest. + +## Estrutura de um código em C +- Válida para a versão da implementação do projeto 12/2023. + +### Estrutura C com Procedures +``` +#include +#include + + +int res, oddness; + +int parity(int number) { + oddness = number % 2; + if (oddness == 1) { + return 1; + } else { + return 0; + } +} + + +int main() { + res = parity(5); + printf("%d\n", res); +} +``` + +### Estrutura C sem Procedures + +``` +#include +#include + + +int number, parity; + + +int main() { + number = 5; + parity = 0; + if (parity == 0) { + printf("%d\n", 1); + } else { + printf("%d\n", 0); + } +} +``` + +Devemos nos atentar a estrutura do código, suas indentações e espaços. Entre a declaração das bibliotecas e das variáveis, devemos nos atentar ao espaçamento de **2 linhas**. + +``` +#include +#include + + +int number, parity; +``` + +Ao criar um código sem o uso de Procedures, devemos utilizar o espaçamento de **1 linha** entre a declaração de variáveis e a nossa int main(). + +``` +int number, parity; + +int main() { + [...] +} +``` + +Caso utilize Procedures, a estrutura se altera, necessitando de espaçamento de **2 linhas** entre a declaração de variáveis e a procedure. + +``` +int number, parity; + + +int main() { + [...] +} +``` + +## Testes realizados + +Lista de testes unitários feitos e documentados em forma de tutorial da linguagem Oberon. + +(Como subitens estão as funcionalidades testadas em cada teste.) + +
    +
  • bee1013: O Maior
  • +
      +
    • Procedure
    • +
    • Nested Procedure
    • +
    +
  • bee1018: Cédulas
  • +
      +
    • FOREACH
    • +
    • Inicialização de arrays
    • +
    • FLOOR
    • +
    • INC
    • +
    +
  • bee1018user: Cédulas (User Input)
  • +
      +
    • Todas do bee1018
    • +
    • READFILE
    • +
    • STRINGTOINT
    • +
    +
  • bee1021: Notas e Moedas
  • +
      +
    • FOREACH
    • +
    • Inicialização de arrays
    • +
    • FLOOR
    • +
    • INC
    • +
    +
  • bee1029: Fibonacci, Quantas Chamadas?
  • +
      +
    • Procedure
    • +
    • FOR
    • +
    • Comparador de igualdade
    • +
    • Inicialização de arrays
    • +
    +
  • bee1038: Snack (Inteiros)
  • +
      +
    • Inicialização de arrays
    • +
    • Aritmética com arrays de inteiros
    • +
    +
  • bee1038: Snack (Reais)
  • +
      +
    • Inicialização de arrays
    • +
    • Aritmética com arrays de reais
    • +
    +
  • bee1042: Simple Sort
  • +
      +
    • REPEAT
    • +
    +
  • bee1049: Animal
  • +
      +
    • IF/ELSE
    • +
    • Comparador de igualdade
    • +
    • Procedure
    • +
    +
  • bee1060: Positive
  • +
      +
    • FOREACH
    • +
    +
  • bee1061: Event Time
  • +
      +
    • IF/ELSE
    • +
    +
  • bee1071: Sum
  • +
      +
    • REPEAT
    • +
    +
  • bee1079: Average
  • +
      +
    • REPEAT
    • +
    +
  • bee2057: Fuso Horário
  • +
      +
    • FOREACH
    • +
    • Inicialização de arrays
    • +
    • MOD
    • +
    +
  • bee2221: Pokemons Battle
  • +
      +
    • IF/ELSE
    • +
    • ODD
    • +
    +
  • bee2779: Álbum da Copa
  • +
      +
    • FOREACH
    • +
    • Inicialização de arrays
    • +
    • IF/ELSE
    • +
    +
  • bee3205valt: Nasty Hacks (versão alterada)
  • +
      +
    • FOREACH
    • +
    • Inicialização de arrays
    • +
    • FLOOR
    • +
    • INC
    • +
    +
  • Nova função: stringToInt
  • +
      +
    • STRINGTOINT
    • +
    +
  • Nova função: stringToReal
  • +
      +
    • STRINGTOREAL
    • +
    +
+ +## Bugs e peculiaridades + + + +- + diff --git a/src/test/resources/cCode/stmts/forstmt.c b/src/test/resources/cCode/stmts/forstmt.c index 511a935e1..38e6e0b5d 100644 --- a/src/test/resources/cCode/stmts/forstmt.c +++ b/src/test/resources/cCode/stmts/forstmt.c @@ -6,8 +6,8 @@ int i; int main() { - - for (i = 1; i <= 5; i+1) { + i = 1; + while (5) { printf("%d\n", i); } } From 85df21d738776934af8b566e334ebd367d4defba Mon Sep 17 00:00:00 2001 From: Gabriel Nascimento Date: Thu, 21 Dec 2023 14:46:23 -0300 Subject: [PATCH 18/18] Entrega final --- docs/CCodeGenWiki/CCodeWiki.md | 130 +++++++++--------- docs/CCodeGenWiki/Countdown.md | 6 + docs/CCodeGenWiki/Logic.md | 6 + docs/CCodeGenWiki/LogicNot.md | 6 + docs/CCodeGenWiki/Progression.md | 6 + docs/CCodeGenWiki/Progression_mul.md | 47 +++++++ docs/CCodeGenWiki/beecrowd1005.md | 6 + docs/CCodeGenWiki/beecrowd1008.md | 6 + docs/CCodeGenWiki/beecrowd1010.md | 6 + docs/CCodeGenWiki/beecrowd1014.md | 6 + docs/CCodeGenWiki/beecrowd1017.md | 6 + docs/CCodeGenWiki/beecrowd1020.md | 6 + docs/CCodeGenWiki/boolNeg.md | 40 ++++++ docs/CCodeGenWiki/forstmt.md | 6 + docs/CCodeGenWiki/image-1.png | Bin 0 -> 22313 bytes docs/CCodeGenWiki/image-2.png | Bin 0 -> 26337 bytes docs/CCodeGenWiki/image.png | Bin 0 -> 14381 bytes docs/CCodeGenWiki/parityCheckerProcedures.md | 6 + docs/CCodeGenWiki/parityCheckerSimple.md | 6 + docs/CCodeGenWiki/pgNew.md | 45 ++++++ docs/CCodeGenWiki/pgNormal.md | 44 ++++++ src/test/resources/cCode/stmts/forstmt.c | 2 +- src/test/resources/cCode/stmts/pgNew.c | 1 + src/test/resources/cCode/stmts/pgNormal.c | 1 + .../resources/cCode/stmts/progression_mul.c | 21 +++ src/test/resources/stmts/pgNew.oberon | 9 +- src/test/resources/stmts/pgNormal.oberon | 9 +- .../resources/stmts/progression_mul.oberon | 19 +++ .../unb/cic/oberon/codegen/CCodeGenTest.scala | 17 ++- 29 files changed, 385 insertions(+), 78 deletions(-) create mode 100644 docs/CCodeGenWiki/Countdown.md create mode 100644 docs/CCodeGenWiki/Logic.md create mode 100644 docs/CCodeGenWiki/LogicNot.md create mode 100644 docs/CCodeGenWiki/Progression.md create mode 100644 docs/CCodeGenWiki/Progression_mul.md create mode 100644 docs/CCodeGenWiki/beecrowd1005.md create mode 100644 docs/CCodeGenWiki/beecrowd1008.md create mode 100644 docs/CCodeGenWiki/beecrowd1010.md create mode 100644 docs/CCodeGenWiki/beecrowd1014.md create mode 100644 docs/CCodeGenWiki/beecrowd1017.md create mode 100644 docs/CCodeGenWiki/beecrowd1020.md create mode 100644 docs/CCodeGenWiki/boolNeg.md create mode 100644 docs/CCodeGenWiki/forstmt.md create mode 100644 docs/CCodeGenWiki/image-1.png create mode 100644 docs/CCodeGenWiki/image-2.png create mode 100644 docs/CCodeGenWiki/image.png create mode 100644 docs/CCodeGenWiki/parityCheckerProcedures.md create mode 100644 docs/CCodeGenWiki/parityCheckerSimple.md create mode 100644 docs/CCodeGenWiki/pgNew.md create mode 100644 docs/CCodeGenWiki/pgNormal.md create mode 100644 src/test/resources/cCode/stmts/progression_mul.c create mode 100644 src/test/resources/stmts/progression_mul.oberon diff --git a/docs/CCodeGenWiki/CCodeWiki.md b/docs/CCodeGenWiki/CCodeWiki.md index 0158e8d6c..983a65bc3 100644 --- a/docs/CCodeGenWiki/CCodeWiki.md +++ b/docs/CCodeGenWiki/CCodeWiki.md @@ -6,6 +6,11 @@ Vídeo-tutorial de introdução a Oberon (inglês): https://www.youtube.com/watch?v=IyYRzpxJaaE +## A tradução de código +A geração de código em C na implementação atual, é feita a partir de um módulo Oberon. O módulo é traduzido para C, e então compilado e executado. O resultado da execução é comparado com o resultado esperado, e então o teste é considerado bem sucedido ou falhou. O resultado da execução dos testes é a comparação entre a tradução do módulo Oberon e a tradução do código em C equivalente a ele. Logo, é necessário ter ambos os códigos (Oberon e C) para a comparação. + +Atente-se que ambos os códigos, Oberon e C, devem estar em pastas equivalentes, para que a comparação seja realizada com sucesso. Caso o módulo Oberon esteja na pasta stmts, o código C equivalente deve estar na pasta stmts no diretório referente a códigos em C. + ## Código Exemplo Oberon utilizando Procedures ``` @@ -215,116 +220,109 @@ Lista de testes unitários feitos e documentados em forma de tutorial da linguag (Como subitens estão as funcionalidades testadas em cada teste.)
    -
  • bee1013: O Maior
  • +
  • parityCheckerProcedures: Par ou ímpar
    • Procedure
    • -
    • Nested Procedure
    • -
    -
  • bee1018: Cédulas
  • -
      -
    • FOREACH
    • -
    • Inicialização de arrays
    • -
    • FLOOR
    • -
    • INC
    • +
    • MOD
    -
  • bee1018user: Cédulas (User Input)
  • +
  • parityCheckerSimple: Par ou ímpar
    • -
    • Todas do bee1018
    • -
    • READFILE
    • -
    • STRINGTOINT
    • +
    • IF
    -
  • bee1021: Notas e Moedas
  • +
  • Progression: Progressão Aritmética
    • -
    • FOREACH
    • -
    • Inicialização de arrays
    • -
    • FLOOR
    • +
    • REPEAT
    • INC
    -
  • bee1029: Fibonacci, Quantas Chamadas?
  • +
  • Countdown: Contagem decrescente
    • -
    • Procedure
    • -
    • FOR
    • -
    • Comparador de igualdade
    • -
    • Inicialização de arrays
    • +
    • REPEAT
    -
  • bee1038: Snack (Inteiros)
  • +
  • beecrowd1017: Consumo médio
    • -
    • Inicialização de arrays
    • -
    • Aritmética com arrays de inteiros
    • +
    • Operadores matemáticos
    -
  • bee1038: Snack (Reais)
  • +
  • beecrowd1005: Média aritmética simples
    • -
    • Inicialização de arrays
    • -
    • Aritmética com arrays de reais
    • +
    • Operadores matemáticos
    -
  • bee1042: Simple Sort
  • +
  • beecrowd1008: Salário
    • -
    • REPEAT
    • +
    • Operadores matemáticos
    -
  • bee1049: Animal
  • +
  • beecrowd1020: Cálculo de anos
    • -
    • IF/ELSE
    • -
    • Comparador de igualdade
    • -
    • Procedure
    • +
    • Operadores matemáticos
    -
  • bee1060: Positive
  • +
  • beecrowd1014: Consumo de combustível
    • -
    • FOREACH
    • +
    • Divisão
    -
  • bee1061: Event Time
  • +
  • beecrowd1010: Cálculo de valor de produtos
    • -
    • IF/ELSE
    • +
    • Multiplas variáveis com multiplificação
    -
  • bee1071: Sum
  • +
  • forstmt: For Statement
    • -
    • REPEAT
    • +
    • FOR
    -
  • bee1079: Average
  • +
  • Logic: Lógica AND OR
    • -
    • REPEAT
    • +
    • Operadores Lógicos AND e OR
    -
  • bee2057: Fuso Horário
  • +
  • LogicNot: Lógica AND e UNEQUAL
    • -
    • FOREACH
    • -
    • Inicialização de arrays
    • -
    • MOD
    • +
    • Operadores Lógicos AND e UNEQUAL
    -
  • bee2221: Pokemons Battle
  • +
  • pgNormal: Progressão Geométrica Expressão com +3 variáveis
    • -
    • IF/ELSE
    • -
    • ODD
    • +
    • POW
    • +
    • FOR
    -
  • bee2779: Álbum da Copa
  • +
  • pgNew: Progressão Geométrica
    • -
    • FOREACH
    • -
    • Inicialização de arrays
    • IF/ELSE
    -
  • bee3205valt: Nasty Hacks (versão alterada)
  • +
  • boolNeg: Negação Lógica
    • -
    • FOREACH
    • -
    • Inicialização de arrays
    • -
    • FLOOR
    • -
    • INC
    • +
    • Operadores Lógicos
    • +
    • AND
    • +
    • NOT
    • +
    • IF
    • +
    • BOOLEAN
    -
  • Nova função: stringToInt
  • +
  • Progression_mul: Progressão Aritmética com diversas variáveis
    • -
    • STRINGTOINT
    • -
    -
  • Nova função: stringToReal
  • -
      -
    • STRINGTOREAL
    • +
    • Operadores Lógicos
    • +
    • AND
    • +
    • NOT
    • +
    • IF
    • +
    • BOOLEAN
## Bugs e peculiaridades
    -
  • Estrutura FOR: forstmt
  • +
  • Estrutura FOR: Peculiaridade For
    • -
    • FOR
    • +
    • O FOR em Oberon se traduz em While em C.
    • +
    +
  • pgNormal e pgNew: POW e FOR
  • +
      +
    • O while quando traduzido a partir de um FOR, ele não respeita a condição. A função POW não é encontrada no Oberon Module.
    • +
    +
  • Progressão Aritmética: Parenteses
  • +
      +
    • O uso de parenteses para determinar precedência causa a falha no teste.
-- +## Correções realizadas na versão 12/2023 +- Refatoração na tradução do CCodeGen.scala + - Correção de bugs (break e indentação). + - Otimização de código + - Alteração na utilização das listas (lista[0] -> lista.head). +- Refatoração de 18 testes afetados por bugs no CCodeGen.scala +- Corrigida a formatação de código em C. diff --git a/docs/CCodeGenWiki/Countdown.md b/docs/CCodeGenWiki/Countdown.md new file mode 100644 index 000000000..1a0af0f70 --- /dev/null +++ b/docs/CCodeGenWiki/Countdown.md @@ -0,0 +1,6 @@ +# Teste Countdown +Situação: Sucesso + +Objetivo: Testar laços de repetição. + +Funcionalidades usadas: While. diff --git a/docs/CCodeGenWiki/Logic.md b/docs/CCodeGenWiki/Logic.md new file mode 100644 index 000000000..eae6a6485 --- /dev/null +++ b/docs/CCodeGenWiki/Logic.md @@ -0,0 +1,6 @@ +# Teste Logic +Situação: Sucesso + +Objetivo: Testar operadores lógicos AND e OR. + +Funcionalidades usadas: AND e OR. diff --git a/docs/CCodeGenWiki/LogicNot.md b/docs/CCodeGenWiki/LogicNot.md new file mode 100644 index 000000000..5d3af67ba --- /dev/null +++ b/docs/CCodeGenWiki/LogicNot.md @@ -0,0 +1,6 @@ +# Teste LogicNot +Situação: Sucesso + +Objetivo: Testar operadores lógicos AND e UNEQUAL. + +Funcionalidades usadas: AND e UNEQUAL #. diff --git a/docs/CCodeGenWiki/Progression.md b/docs/CCodeGenWiki/Progression.md new file mode 100644 index 000000000..7f1fcd42b --- /dev/null +++ b/docs/CCodeGenWiki/Progression.md @@ -0,0 +1,6 @@ +# Teste Progression +Situação: Sucesso + +Objetivo: Testar laços de repetição e incremento. + +Funcionalidades usadas: While e INC. diff --git a/docs/CCodeGenWiki/Progression_mul.md b/docs/CCodeGenWiki/Progression_mul.md new file mode 100644 index 000000000..a5049174e --- /dev/null +++ b/docs/CCodeGenWiki/Progression_mul.md @@ -0,0 +1,47 @@ +# Teste Progression +Situação: Falhou + +Objetivo: Testar laços de repetição e incremento. + +Funcionalidades usadas: While e INC. + +## Descrição da falha + +O Parser não consegue identificar uma expressão válida ao utilizar parenteses como operador de precedência. + +## Trecho da falha + +``` +pa := an + (n - 1) * d; +``` + +
+

+

Módulo Oberon +
+
+MODULE pa;
+
+VAR
+    an, d, n, z, pa : INTEGER;
+
+BEGIN
+    an := 2;
+    d := 3;
+    z := 5;
+    n := 1;
+    REPEAT
+        pa := an + (n - 1) * d;
+        write(pa);
+        INC(n)
+    UNTIL (n <= z)
+
+END
+
+END pa.
+
+
+
+ + + diff --git a/docs/CCodeGenWiki/beecrowd1005.md b/docs/CCodeGenWiki/beecrowd1005.md new file mode 100644 index 000000000..efc2b328a --- /dev/null +++ b/docs/CCodeGenWiki/beecrowd1005.md @@ -0,0 +1,6 @@ +# Teste beecrowd1005 - Média Aritmética Simples +Situação: Sucesso + +Objetivo: Testar operações matemáticas. + +Funcionalidades usadas: Operadores matemáticos. diff --git a/docs/CCodeGenWiki/beecrowd1008.md b/docs/CCodeGenWiki/beecrowd1008.md new file mode 100644 index 000000000..f11feb9c0 --- /dev/null +++ b/docs/CCodeGenWiki/beecrowd1008.md @@ -0,0 +1,6 @@ +# Teste beecrowd1008 - Salário +Situação: Sucesso + +Objetivo: Testar operações matemáticas. + +Funcionalidades usadas: Operadores matemáticos. diff --git a/docs/CCodeGenWiki/beecrowd1010.md b/docs/CCodeGenWiki/beecrowd1010.md new file mode 100644 index 000000000..d81a6efc0 --- /dev/null +++ b/docs/CCodeGenWiki/beecrowd1010.md @@ -0,0 +1,6 @@ +# Teste beecrowd1010 - Cálculo de valor de produtos +Situação: Sucesso + +Objetivo: Testar Multiplas variáveis com multiplificação. + +Funcionalidades usadas: Multiplicação. diff --git a/docs/CCodeGenWiki/beecrowd1014.md b/docs/CCodeGenWiki/beecrowd1014.md new file mode 100644 index 000000000..616f02db8 --- /dev/null +++ b/docs/CCodeGenWiki/beecrowd1014.md @@ -0,0 +1,6 @@ +# Teste beecrowd1014 - Consumo de combustível +Situação: Sucesso + +Objetivo: Testar divisão. + +Funcionalidades usadas: Operador matemático de divisão. diff --git a/docs/CCodeGenWiki/beecrowd1017.md b/docs/CCodeGenWiki/beecrowd1017.md new file mode 100644 index 000000000..500dfb7ee --- /dev/null +++ b/docs/CCodeGenWiki/beecrowd1017.md @@ -0,0 +1,6 @@ +# Teste beecrowd1017 - Consumo Médio +Situação: Sucesso + +Objetivo: Testar operações matemáticas. + +Funcionalidades usadas: Operadores matemáticos. diff --git a/docs/CCodeGenWiki/beecrowd1020.md b/docs/CCodeGenWiki/beecrowd1020.md new file mode 100644 index 000000000..04140e879 --- /dev/null +++ b/docs/CCodeGenWiki/beecrowd1020.md @@ -0,0 +1,6 @@ +# Teste beecrowd1020 - Cálculo de Anos +Situação: Sucesso + +Objetivo: Testar operações matemáticas. + +Funcionalidades usadas: Operadores matemáticos. diff --git a/docs/CCodeGenWiki/boolNeg.md b/docs/CCodeGenWiki/boolNeg.md new file mode 100644 index 000000000..86e5741ef --- /dev/null +++ b/docs/CCodeGenWiki/boolNeg.md @@ -0,0 +1,40 @@ +# Teste boolNeg +Situação: Falhou. + +Objetivo: Testar negação de expressões. + +Funcionalidades usadas: AND, NOT, IF e BOOLEAN. + +## Descrição da falha + +O estágio atual da implementação não permite o uso de variáveis do tipo BOOLEAN. + +## Trecho da falha + +``` +p, q, r : BOOLEAN; +``` + +
+

+

Módulo Oberon +
+
+MODULE boolNeg;
+
+VAR
+    p, q, r : BOOLEAN;
+BEGIN
+ p := TRUE;
+ q := FALSE;
+ p := p && ~q;
+ IF (r = FALSE)
+ THEN
+    write(r)
+ END
+END
+
+END boolNeg.
+
+
+
\ No newline at end of file diff --git a/docs/CCodeGenWiki/forstmt.md b/docs/CCodeGenWiki/forstmt.md new file mode 100644 index 000000000..39b635907 --- /dev/null +++ b/docs/CCodeGenWiki/forstmt.md @@ -0,0 +1,6 @@ +# Teste forstmt +Situação: Sucesso + +Objetivo: Testar estrutura de FOR. + +Funcionalidades usadas: FOR. diff --git a/docs/CCodeGenWiki/image-1.png b/docs/CCodeGenWiki/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d2548937eacc375e0c2634f795b10c5c8a9e1f6a GIT binary patch literal 22313 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 X)ReP%z`xSmx${&~QKAH<@Av-z<~tm@ literal 0 HcmV?d00001 diff --git a/docs/CCodeGenWiki/image.png b/docs/CCodeGenWiki/image.png new file mode 100644 index 0000000000000000000000000000000000000000..97a2505132ea5ded933f59d3b7fd3bc70080e3fb GIT binary patch literal 14381 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 literal 0 HcmV?d00001 diff --git a/docs/CCodeGenWiki/parityCheckerProcedures.md b/docs/CCodeGenWiki/parityCheckerProcedures.md new file mode 100644 index 000000000..91f78bcb8 --- /dev/null +++ b/docs/CCodeGenWiki/parityCheckerProcedures.md @@ -0,0 +1,6 @@ +# Teste parityCheckerProcedures +Situação: Sucesso + +Objetivo: Testar Procedures e MOD. + +Funcionalidades usadas: Procedures e MOD. diff --git a/docs/CCodeGenWiki/parityCheckerSimple.md b/docs/CCodeGenWiki/parityCheckerSimple.md new file mode 100644 index 000000000..28aeea32b --- /dev/null +++ b/docs/CCodeGenWiki/parityCheckerSimple.md @@ -0,0 +1,6 @@ +# Teste parityCheckerSimple +Situação: Sucesso + +Objetivo: Testar estruturas de controle. + +Funcionalidades usadas: IF e ELSE. diff --git a/docs/CCodeGenWiki/pgNew.md b/docs/CCodeGenWiki/pgNew.md new file mode 100644 index 000000000..1dd90fc18 --- /dev/null +++ b/docs/CCodeGenWiki/pgNew.md @@ -0,0 +1,45 @@ +# Teste pgNew +Situação: Falhou. + +Objetivo: Testar FOR e POW. + +Funcionalidades usadas: POW e FOR. + +## Descrição da falha + +O Parser não consegue identificar uma expressão válida devido a falta da "stdlib.h". O módulo Oberon não está encontrando a função POW implementada. O While não está sendo traduzido corretamente para C. + +## Trecho da falha + +``` +p := POW(r, n - 1); +``` + +
+

+

Módulo Oberon +
+
+MODULE pgNew;
+
+VAR
+ pg, a1, r, n, N, p : INTEGER;
+
+BEGIN
+ a1 := 2;
+ r := 3;
+ N := 5;
+ FOR n:= 0 TO N DO
+  p := POW(r, n - 1);
+  pg = a1 * p;
+  write(pg);
+  n := n + 1
+END
+
+END pgNew.
+
+
+
+
+ +![Descritivo da falha](image-1.png) \ No newline at end of file diff --git a/docs/CCodeGenWiki/pgNormal.md b/docs/CCodeGenWiki/pgNormal.md new file mode 100644 index 000000000..4f888d9f8 --- /dev/null +++ b/docs/CCodeGenWiki/pgNormal.md @@ -0,0 +1,44 @@ +# Teste pgNormal +Situação: Falhou. + +Objetivo: Testar expressões matemáticas com mais de 3 variáveis. + +Funcionalidades usadas: POW e FOR. + +## Descrição da falha + +O Parser não consegue identificar uma expressão válida devido a falta da "stdlib.h". O módulo Oberon não está encontrando a função POW implementada. O While não está realizando a correta tradução da condição do código em C. + +## Trecho da falha + +``` +pg := a1 * POW(r, n - 1); +``` + +
+

+

Módulo Oberon +
+
+MODULE pgNormal;
+
+VAR
+ pg, a1, r, n, N : INTEGER;
+
+BEGIN
+ a1 := 2;
+ r := 3;
+ N := 5;
+ FOR n:= 0 TO N DO
+  pg := a1 * POW(r, n - 1);
+  write(pg);
+  n := n + 1
+END
+
+END pgNormal.
+
+
+
+
+ +![Descritivo da](image-1.png) \ No newline at end of file diff --git a/src/test/resources/cCode/stmts/forstmt.c b/src/test/resources/cCode/stmts/forstmt.c index 38e6e0b5d..1557b6eeb 100644 --- a/src/test/resources/cCode/stmts/forstmt.c +++ b/src/test/resources/cCode/stmts/forstmt.c @@ -10,4 +10,4 @@ int main() { while (5) { printf("%d\n", i); } -} +} \ No newline at end of file diff --git a/src/test/resources/cCode/stmts/pgNew.c b/src/test/resources/cCode/stmts/pgNew.c index 380f48978..f1a39e8bb 100644 --- a/src/test/resources/cCode/stmts/pgNew.c +++ b/src/test/resources/cCode/stmts/pgNew.c @@ -1,6 +1,7 @@ #include #include + int pg, a1, r, N, n, p; diff --git a/src/test/resources/cCode/stmts/pgNormal.c b/src/test/resources/cCode/stmts/pgNormal.c index f45448af1..08fe17074 100644 --- a/src/test/resources/cCode/stmts/pgNormal.c +++ b/src/test/resources/cCode/stmts/pgNormal.c @@ -1,6 +1,7 @@ #include #include + int pg, a1, r, N, n; diff --git a/src/test/resources/cCode/stmts/progression_mul.c b/src/test/resources/cCode/stmts/progression_mul.c new file mode 100644 index 000000000..89fddc47e --- /dev/null +++ b/src/test/resources/cCode/stmts/progression_mul.c @@ -0,0 +1,21 @@ +#include +#include + + +int an, d, n, z, pa; + + +int main() { + an = 2; + d = 3; + z = 5; + n = 1; + while (true) { + pa = an + (n - 1) * d; + printf("%d\n", pa); + n = n + 1; + if (n <= z) { + break; + } + } +} diff --git a/src/test/resources/stmts/pgNew.oberon b/src/test/resources/stmts/pgNew.oberon index 020791c8b..5c88a3df6 100644 --- a/src/test/resources/stmts/pgNew.oberon +++ b/src/test/resources/stmts/pgNew.oberon @@ -1,7 +1,7 @@ MODULE pgNew; VAR - pg, a1, r, n, N, p : INTEGER; + pg, a1, r, N, n, p : INTEGER; BEGIN a1 := 2; @@ -9,9 +9,10 @@ BEGIN N := 5; FOR n:= 0 TO N DO p := POW(r, n - 1); - pg = a1 * p; - write(pg) - n := n + 1; + pg := a1 * p; + write(pg); + n := n + 1 + END END END pgNew. diff --git a/src/test/resources/stmts/pgNormal.oberon b/src/test/resources/stmts/pgNormal.oberon index 37a713136..2d9f217ae 100644 --- a/src/test/resources/stmts/pgNormal.oberon +++ b/src/test/resources/stmts/pgNormal.oberon @@ -1,16 +1,17 @@ MODULE pgNormal; VAR - pg, a1, r, n, N : INTEGER; + pg, a1, r, N, n : INTEGER; BEGIN a1 := 2; r := 3; N := 5; FOR n:= 0 TO N DO - pg = a1 * POW(r, n - 1); - write(pg) - n := n + 1; + pg := a1 * POW(r, n - 1); + write(pg); + n := n + 1 + END END END pgNormal. diff --git a/src/test/resources/stmts/progression_mul.oberon b/src/test/resources/stmts/progression_mul.oberon new file mode 100644 index 000000000..e401c7b2c --- /dev/null +++ b/src/test/resources/stmts/progression_mul.oberon @@ -0,0 +1,19 @@ +MODULE pa; + +VAR + an, d, n, z, pa : INTEGER; + +BEGIN + an := 2; + d := 3; + z := 5; + n := 1; + REPEAT + pa := an + (n - 1) * d; + write(pa); + INC(n) + UNTIL (n <= z) + +END + +END pa. \ No newline at end of file diff --git a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala index cd16c29f4..957052e3d 100644 --- a/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala +++ b/src/test/scala/br/unb/cic/oberon/codegen/CCodeGenTest.scala @@ -308,13 +308,24 @@ class CCodeGenTest extends AnyFunSuite { test("C generator for Logic AND NOT") { testGenerator("stmts/LogicNot.oberon") } - test("pg normal") { + + ignore("C generator for Geometric Progression") { testGenerator("stmts/pgNormal.oberon") } - test("pg new") { + + ignore("C generator for Geometric Progression with multiple args") { testGenerator("stmts/pgNew.oberon") } - test("bool neg") { + + ignore("C generator for Boolean Negation") { testGenerator("stmts/boolNeg.oberon") } + + ignore("C generator for Progression Multiple Variable"){ + testGenerator("stmts/progression_mul.oberon") + } + + ignore("C generator for Pow Test"){ + testGenerator("stdlib/POWTest.oberon") + } }