Update TP04
This commit is contained in:
parent
0651175da6
commit
fcf4e29532
@ -3,24 +3,19 @@ LAB4 (simple code generation), MIF08 / CAP 2022-23
|
|||||||
|
|
||||||
# Authors
|
# Authors
|
||||||
|
|
||||||
YOUR NAME HERE
|
Augustin LUCAS
|
||||||
|
|
||||||
# Contents
|
# Contents
|
||||||
|
|
||||||
TODO for STUDENTS : Say a bit about the code infrastructure ...
|
|
||||||
|
|
||||||
# Test design
|
# Test design
|
||||||
|
|
||||||
TODO: explain your tests
|
|
||||||
|
|
||||||
# Design choices
|
# Design choices
|
||||||
|
|
||||||
TODO: explain your choices. How did you implement boolean not? Did you implement an extension?
|
Booleans are implemented as integers behind the scenes, but type-checking before compilation disables any casting mechanism.
|
||||||
|
As for the previous lab, the Fortran-like for-loop extension has been implemented.
|
||||||
|
|
||||||
# Known bugs
|
# Known bugs
|
||||||
|
|
||||||
TODO: Bugs and limitations.
|
|
||||||
|
|
||||||
# Checklists
|
# Checklists
|
||||||
|
|
||||||
A check ([X]) means that the feature is implemented
|
A check ([X]) means that the feature is implemented
|
||||||
@ -28,30 +23,30 @@ and *tested* with appropriate test cases.
|
|||||||
|
|
||||||
## Code generation
|
## Code generation
|
||||||
|
|
||||||
- [ ] Number Atom
|
- [x] Number Atom
|
||||||
- [ ] Boolean Atom
|
- [x] Boolean Atom
|
||||||
- [ ] Id Atom
|
- [x] Id Atom
|
||||||
- [ ] Additive expression
|
- [x] Additive expression
|
||||||
- [ ] Multiplicative expression
|
- [x] Multiplicative expression
|
||||||
- [ ] UnaryMinus expression
|
- [x] UnaryMinus expression
|
||||||
- [ ] Or expression
|
- [x] Or expression
|
||||||
- [ ] And expression
|
- [x] And expression
|
||||||
- [ ] Equality expression
|
- [x] Equality expression
|
||||||
- [ ] Relational expression (! many cases -> many tests)
|
- [x] Relational expression (! many cases -> many tests)
|
||||||
- [ ] Not expression
|
- [x] Not expression
|
||||||
|
|
||||||
## Statements
|
## Statements
|
||||||
|
|
||||||
- [ ] Prog, assignements
|
- [x] Prog, assignements
|
||||||
- [ ] While
|
- [x] While
|
||||||
- [ ] Cond Block
|
- [x] Cond Block
|
||||||
- [ ] If
|
- [x] If
|
||||||
- [ ] Nested ifs
|
- [x] Nested ifs
|
||||||
- [ ] Nested whiles
|
- [x] Nested whiles
|
||||||
|
|
||||||
## Allocation
|
## Allocation
|
||||||
|
|
||||||
- [ ] Naive allocation
|
- [x] Naive allocation
|
||||||
- [ ] All in memory allocation
|
- [x] All in memory allocation
|
||||||
- [ ] Massive tests of memory allocation
|
- [ ] Massive tests of memory allocation
|
||||||
|
|
||||||
|
@ -15,19 +15,21 @@ class AllInMemAllocator(Allocator):
|
|||||||
after: List[Instruction] = []
|
after: List[Instruction] = []
|
||||||
new_args: List[Operand] = []
|
new_args: List[Operand] = []
|
||||||
|
|
||||||
s_index = 0
|
for arg in old_instr.defined():
|
||||||
for arg in old_instr.args():
|
|
||||||
if isinstance(arg, Temporary):
|
if isinstance(arg, Temporary):
|
||||||
s_index += 1
|
|
||||||
if arg in old_instr.used(): # needs to be read first
|
|
||||||
before.append(RiscV.ld(
|
|
||||||
S[s_index], arg.get_alloced_loc()
|
|
||||||
))
|
|
||||||
if arg in old_instr.defined(): # needs to be stored after
|
|
||||||
after.append(RiscV.sd(
|
after.append(RiscV.sd(
|
||||||
S[s_index], arg.get_alloced_loc()
|
S[3], arg.get_alloced_loc()
|
||||||
))
|
))
|
||||||
new_args.append(S[s_index])
|
new_args.append(S[3])
|
||||||
|
else:
|
||||||
|
new_args.append(arg)
|
||||||
|
|
||||||
|
for i, arg in enumerate(old_instr.used(), 1):
|
||||||
|
if isinstance(arg, Temporary):
|
||||||
|
before.append(RiscV.ld(
|
||||||
|
S[i], arg.get_alloced_loc()
|
||||||
|
))
|
||||||
|
new_args.append(S[i])
|
||||||
else:
|
else:
|
||||||
new_args.append(arg)
|
new_args.append(arg)
|
||||||
|
|
||||||
|
@ -283,7 +283,7 @@ class MiniCCodeGen3AVisitor(MiniCVisitor):
|
|||||||
print(Trees.toStringTree(ctx.stat_block(), [], self._parser))
|
print(Trees.toStringTree(ctx.stat_block(), [], self._parser))
|
||||||
|
|
||||||
# ltest <- fresh_label()
|
# ltest <- fresh_label()
|
||||||
loop_test = self._current_function.fdata.fresh_label("loop_test")
|
loop_test = self._current_function.fdata.fresh_label("while_test")
|
||||||
# lendwhile <- fresh_label()
|
# lendwhile <- fresh_label()
|
||||||
end_while = self._current_function.fdata.fresh_label("end_while")
|
end_while = self._current_function.fdata.fresh_label("end_while")
|
||||||
# code.addLabel(ltest)
|
# code.addLabel(ltest)
|
||||||
@ -329,3 +329,79 @@ class MiniCCodeGen3AVisitor(MiniCVisitor):
|
|||||||
for stat in ctx.stat():
|
for stat in ctx.stat():
|
||||||
self._current_function.add_comment(Trees.toStringTree(stat, [], self._parser))
|
self._current_function.add_comment(Trees.toStringTree(stat, [], self._parser))
|
||||||
self.visit(stat)
|
self.visit(stat)
|
||||||
|
|
||||||
|
def visitForStat(self, ctx) -> None:
|
||||||
|
def immediate_to_tmp(op):
|
||||||
|
if not isinstance(op, Operands.Immediate):
|
||||||
|
return op
|
||||||
|
new_op = self._current_function.fdata.fresh_tmp()
|
||||||
|
self._current_function.add_instruction(
|
||||||
|
RiscV.li(new_op, op))
|
||||||
|
return new_op
|
||||||
|
|
||||||
|
|
||||||
|
from_t = immediate_to_tmp(self.visit(ctx.expr(0)))
|
||||||
|
to_t = immediate_to_tmp(self.visit(ctx.expr(1)))
|
||||||
|
|
||||||
|
stride = Operands.Immediate(1)
|
||||||
|
if len(ctx.expr()) > 2:
|
||||||
|
stride = self.visit(ctx.expr(2))
|
||||||
|
|
||||||
|
stride = immediate_to_tmp(stride)
|
||||||
|
|
||||||
|
name = ctx.ID().getText()
|
||||||
|
if name not in self._symbol_table:
|
||||||
|
raise MiniCInternalError(
|
||||||
|
"Variable {} has not been declared before for loop".format(name))
|
||||||
|
|
||||||
|
variable = self._symbol_table[name] # variable acting as counter
|
||||||
|
for_test = self._current_function.fdata.fresh_label("forF_test")
|
||||||
|
end_for = self._current_function.fdata.fresh_label("end_forF")
|
||||||
|
body_for = self._current_function.fdata.fresh_label("body_forF")
|
||||||
|
neg_stride = self._current_function.fdata.fresh_label("neg_stride_forF")
|
||||||
|
counter = self._current_function.fdata.fresh_tmp() # real counter not affected by var. changes
|
||||||
|
|
||||||
|
# counter <- from
|
||||||
|
self._current_function.add_instruction(
|
||||||
|
RiscV.mv(counter, from_t))
|
||||||
|
#* for_test:
|
||||||
|
# var <- counter
|
||||||
|
# bge 0 stride neg_stride
|
||||||
|
# (positive stride here)
|
||||||
|
# ble counter to end_for
|
||||||
|
# j body
|
||||||
|
self._current_function.add_label(for_test)
|
||||||
|
self._current_function.add_instruction(
|
||||||
|
RiscV.mv(variable, counter))
|
||||||
|
self._current_function.add_instruction(
|
||||||
|
RiscV.conditional_jump(
|
||||||
|
neg_stride, Operands.ZERO,
|
||||||
|
Condition(MiniCParser.GTEQ), stride
|
||||||
|
))
|
||||||
|
self._current_function.add_instruction(
|
||||||
|
RiscV.conditional_jump(
|
||||||
|
end_for, counter,
|
||||||
|
Condition(MiniCParser.GTEQ), to_t
|
||||||
|
))
|
||||||
|
self._current_function.add_instruction(
|
||||||
|
RiscV.jump(body_for))
|
||||||
|
#* neg_stride:
|
||||||
|
# bl to counter end_for
|
||||||
|
self._current_function.add_label(neg_stride)
|
||||||
|
self._current_function.add_instruction(
|
||||||
|
RiscV.conditional_jump(
|
||||||
|
end_for, to_t,
|
||||||
|
Condition(MiniCParser.GTEQ), counter
|
||||||
|
))
|
||||||
|
#* body:
|
||||||
|
# <body>
|
||||||
|
# counter <- counter + stride
|
||||||
|
# j for_test
|
||||||
|
self._current_function.add_label(body_for)
|
||||||
|
self.visit(ctx.stat_block())
|
||||||
|
self._current_function.add_instruction(
|
||||||
|
RiscV.add(counter, counter, stride))
|
||||||
|
self._current_function.add_instruction(
|
||||||
|
RiscV.jump(for_test))
|
||||||
|
#* end_for:
|
||||||
|
self._current_function.add_label(end_for)
|
||||||
|
10
MiniC/TP04/tests/students/base/test_add_boolean.c
Normal file
10
MiniC/TP04/tests/students/base/test_add_boolean.c
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
println_bool(true + false);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXITCODE 2
|
||||||
|
// EXPECTED
|
||||||
|
// In function main: Line 4 col 15: invalid type for additive operands: boolean and boolean
|
16
MiniC/TP04/tests/students/base/test_comp_bool.c
Normal file
16
MiniC/TP04/tests/students/base/test_comp_bool.c
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
bool x, y;
|
||||||
|
|
||||||
|
if (x <= y) {
|
||||||
|
println_string("ok");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXITCODE 2
|
||||||
|
// EXPECTED
|
||||||
|
// In function main: Line 6 col 6: invalid type for non numeric type: boolean
|
14
MiniC/TP04/tests/students/base/test_div_0.c
Normal file
14
MiniC/TP04/tests/students/base/test_div_0.c
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y;
|
||||||
|
x = 5;
|
||||||
|
y = 0;
|
||||||
|
println_int(x/0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXECCODE 1
|
||||||
|
// EXPECTED
|
||||||
|
// Division by 0
|
15
MiniC/TP04/tests/students/base/test_else.c
Normal file
15
MiniC/TP04/tests/students/base/test_else.c
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y;
|
||||||
|
if (x != 0) {
|
||||||
|
y = 12;
|
||||||
|
} else {
|
||||||
|
y = -3;
|
||||||
|
}
|
||||||
|
println_int(y);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECTED
|
||||||
|
// -3
|
27
MiniC/TP04/tests/students/base/test_fibonacci.c
Normal file
27
MiniC/TP04/tests/students/base/test_fibonacci.c
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int num, result, i;
|
||||||
|
int prev1, prev2, tmp;
|
||||||
|
result = -1;
|
||||||
|
num = 15;
|
||||||
|
|
||||||
|
if (num < 2) {
|
||||||
|
result = num;
|
||||||
|
} else {
|
||||||
|
prev1 = 1;
|
||||||
|
prev2 = 0;
|
||||||
|
for i=2 to num {
|
||||||
|
tmp = prev1;
|
||||||
|
prev1 = prev1 + prev2;
|
||||||
|
prev2 = tmp;
|
||||||
|
}
|
||||||
|
result = prev1+prev2;
|
||||||
|
}
|
||||||
|
println_int(result);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXPECTED
|
||||||
|
// 610
|
16
MiniC/TP04/tests/students/base/test_if_nonbool.c
Normal file
16
MiniC/TP04/tests/students/base/test_if_nonbool.c
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if (x) {
|
||||||
|
y = 5;
|
||||||
|
}
|
||||||
|
println_int(y);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXITCODE 2
|
||||||
|
// EXPECTED
|
||||||
|
// In function main: Line 6 col 2: invalid type for non boolean as condition: integer
|
15
MiniC/TP04/tests/students/base/test_mem_alloc.c
Normal file
15
MiniC/TP04/tests/students/base/test_mem_alloc.c
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
while (x < 5000) {
|
||||||
|
y = x+1;
|
||||||
|
x = y+1;
|
||||||
|
}
|
||||||
|
println_int(x);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECTED
|
||||||
|
// 5000
|
19
MiniC/TP04/tests/students/base/test_mod.c
Normal file
19
MiniC/TP04/tests/students/base/test_mod.c
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y;
|
||||||
|
x = 5;
|
||||||
|
y = 3;
|
||||||
|
println_int(x%y);
|
||||||
|
println_int((-x)%y);
|
||||||
|
y = 0;
|
||||||
|
println_int(x%y);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXECCODE 1
|
||||||
|
// EXPECTED
|
||||||
|
// 2
|
||||||
|
// -2
|
||||||
|
// Division by 0
|
12
MiniC/TP04/tests/students/base/test_mul.c
Normal file
12
MiniC/TP04/tests/students/base/test_mul.c
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y;
|
||||||
|
x = 12;
|
||||||
|
y = 5;
|
||||||
|
println_int(x*y);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECTED
|
||||||
|
// 60
|
33
MiniC/TP04/tests/students/base/test_nested_if.c
Normal file
33
MiniC/TP04/tests/students/base/test_nested_if.c
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
if (true) {
|
||||||
|
if (false) {
|
||||||
|
println_int(-1);
|
||||||
|
} else {
|
||||||
|
println_int(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
println_int(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (false) {
|
||||||
|
if (false) {
|
||||||
|
println_int(-1);
|
||||||
|
} else {
|
||||||
|
println_int(-1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (true) {
|
||||||
|
println_int(2);
|
||||||
|
} else {
|
||||||
|
println_int(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECTED
|
||||||
|
// 1
|
||||||
|
// 2
|
25
MiniC/TP04/tests/students/base/test_nested_while.c
Normal file
25
MiniC/TP04/tests/students/base/test_nested_while.c
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y, z;
|
||||||
|
while (x < 12) {
|
||||||
|
while (x < 25) {
|
||||||
|
x = x+2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println_int(x);
|
||||||
|
x = 0;
|
||||||
|
while (x < 5) {
|
||||||
|
x = x+1;
|
||||||
|
y = y+x;
|
||||||
|
while (z < 3) {
|
||||||
|
z = z+y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println_int(z);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECTED
|
||||||
|
// 26
|
||||||
|
// 3
|
14
MiniC/TP04/tests/students/base/test_not.c
Normal file
14
MiniC/TP04/tests/students/base/test_not.c
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
bool x, y;
|
||||||
|
x = true;
|
||||||
|
y = false;
|
||||||
|
println_bool(!x);
|
||||||
|
println_bool(!y);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECTED
|
||||||
|
// 0
|
||||||
|
// 1
|
11
MiniC/TP04/tests/students/base/test_not_int.c
Normal file
11
MiniC/TP04/tests/students/base/test_not_int.c
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
println_int(!(12+2));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXITCODE 2
|
||||||
|
// EXPECTED
|
||||||
|
// In function main: Line 4 col 14: invalid type for NOT: only boolean allowed: integer
|
12
MiniC/TP04/tests/students/base/test_or.c
Normal file
12
MiniC/TP04/tests/students/base/test_or.c
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
bool x, y;
|
||||||
|
x = true;
|
||||||
|
y = false;
|
||||||
|
println_bool(x || y);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECTED
|
||||||
|
// 1
|
14
MiniC/TP04/tests/students/base/test_println_bool.c
Normal file
14
MiniC/TP04/tests/students/base/test_println_bool.c
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
println_bool(true);
|
||||||
|
println_bool(y+2);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXITCODE 2
|
||||||
|
// EXPECTED
|
||||||
|
// In function main: Line 7 col 2: invalid type for println_bool statement: integer
|
14
MiniC/TP04/tests/students/base/test_println_float.c
Normal file
14
MiniC/TP04/tests/students/base/test_println_float.c
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
println_float(15.0);
|
||||||
|
println_float(y+2);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXITCODE 2
|
||||||
|
// EXPECTED
|
||||||
|
// In function main: Line 7 col 2: invalid type for println_float statement: integer
|
35
MiniC/TP04/tests/students/base/test_relational.c
Normal file
35
MiniC/TP04/tests/students/base/test_relational.c
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
println_bool(1 < 2);
|
||||||
|
println_bool(1 < 1);
|
||||||
|
println_bool(2 < 1);
|
||||||
|
|
||||||
|
println_bool(1 <= 2);
|
||||||
|
println_bool(1 <= 1);
|
||||||
|
println_bool(2 <= 1);
|
||||||
|
|
||||||
|
println_bool(1 > 2);
|
||||||
|
println_bool(1 > 1);
|
||||||
|
println_bool(2 > 1);
|
||||||
|
|
||||||
|
println_bool(1 >= 2);
|
||||||
|
println_bool(1 >= 1);
|
||||||
|
println_bool(2 >= 1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECTED
|
||||||
|
// 1
|
||||||
|
// 0
|
||||||
|
// 0
|
||||||
|
// 1
|
||||||
|
// 1
|
||||||
|
// 0
|
||||||
|
// 0
|
||||||
|
// 0
|
||||||
|
// 1
|
||||||
|
// 0
|
||||||
|
// 1
|
||||||
|
// 1
|
13
MiniC/TP04/tests/students/base/test_while.c
Normal file
13
MiniC/TP04/tests/students/base/test_while.c
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x;
|
||||||
|
while (x < 12) {
|
||||||
|
x = x+2;
|
||||||
|
}
|
||||||
|
println_int(x);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECTED
|
||||||
|
// 12
|
17
MiniC/TP04/tests/students/base/test_while_nonbool.c
Normal file
17
MiniC/TP04/tests/students/base/test_while_nonbool.c
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
while (x) {
|
||||||
|
y = 5;
|
||||||
|
x = x+1;
|
||||||
|
}
|
||||||
|
println_int(y);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXITCODE 2
|
||||||
|
// EXPECTED
|
||||||
|
// In function main: Line 6 col 2: invalid type for non boolean as condition: integer
|
32
MiniC/TP04/tests/students/ext-for-fortran/test_for.c
Normal file
32
MiniC/TP04/tests/students/ext-for-fortran/test_for.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y;
|
||||||
|
int zero, trois;
|
||||||
|
trois = 3;
|
||||||
|
|
||||||
|
// simple loop
|
||||||
|
for x=zero to trois {
|
||||||
|
y = y+3;
|
||||||
|
}
|
||||||
|
println_int(y);
|
||||||
|
println_int(x);
|
||||||
|
|
||||||
|
// inversed loop
|
||||||
|
for x=5 to 1 by -2 {
|
||||||
|
println_int(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
// empty loop
|
||||||
|
for x=5 to 0 {
|
||||||
|
println_int(-1);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXPECTED
|
||||||
|
// 9
|
||||||
|
// 3
|
||||||
|
// 5
|
||||||
|
// 3
|
@ -0,0 +1,18 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int i, count;
|
||||||
|
|
||||||
|
for i=0 to 6 {
|
||||||
|
for i=0 to 6 {
|
||||||
|
count = count + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println_int(count);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXPECTED
|
||||||
|
// 36
|
@ -0,0 +1,17 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y;
|
||||||
|
float fl;
|
||||||
|
fl = 12.0;
|
||||||
|
|
||||||
|
for x=fl to 3 {
|
||||||
|
y = y+3;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXITCODE 2
|
||||||
|
// EXPECTED
|
||||||
|
// In function main: Line 8 col 2: invalid type for non-integer from value: float
|
17
MiniC/TP04/tests/students/ext-for-fortran/test_invalid_id.c
Normal file
17
MiniC/TP04/tests/students/ext-for-fortran/test_invalid_id.c
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y;
|
||||||
|
float fl;
|
||||||
|
fl = 12.0;
|
||||||
|
|
||||||
|
for fl=0 to 3 {
|
||||||
|
y = y+3;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXITCODE 2
|
||||||
|
// EXPECTED
|
||||||
|
// In function main: Line 8 col 2: invalid type for non-integer for loop counter: float
|
@ -0,0 +1,15 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
for x=0 to 3 by 1.0 {
|
||||||
|
y = y+3;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXITCODE 2
|
||||||
|
// EXPECTED
|
||||||
|
// In function main: Line 6 col 2: invalid type for non-integer stride value: float
|
17
MiniC/TP04/tests/students/ext-for-fortran/test_invalid_to.c
Normal file
17
MiniC/TP04/tests/students/ext-for-fortran/test_invalid_to.c
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y;
|
||||||
|
float fl;
|
||||||
|
fl = 12.0;
|
||||||
|
|
||||||
|
for x=0 to fl {
|
||||||
|
y = y+3;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXITCODE 2
|
||||||
|
// EXPECTED
|
||||||
|
// In function main: Line 8 col 2: invalid type for non-integer to value: float
|
@ -0,0 +1,15 @@
|
|||||||
|
#include "printlib.h"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
for undef=0 to 3 {
|
||||||
|
y = y+3;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// SKIP TEST EXPECTED
|
||||||
|
// EXITCODE 2
|
||||||
|
// EXPECTED
|
||||||
|
// In function main: Line 6 col 2: Undefined variable undef
|
Loading…
Reference in New Issue
Block a user