From 7b738bf2b320e1d196f9aef26334c05c8d7561db Mon Sep 17 00:00:00 2001 From: Edwardzcn Date: Mon, 24 Oct 2022 04:40:59 +0000 Subject: [PATCH] feat(lab3): upload lab3 source file --- include/cminusf_builder.hpp | 103 +++ src/CMakeLists.txt | 3 +- src/cminusfc/CMakeLists.txt | 19 + src/cminusfc/cminusf_builder.cpp | 184 ++++ src/cminusfc/cminusfc.cpp | 111 +++ tests/3-ir-gen/answers/lv0_1/decl_float.out | 0 .../answers/lv0_1/decl_float_array.out | 0 tests/3-ir-gen/answers/lv0_1/decl_int.out | 0 .../3-ir-gen/answers/lv0_1/decl_int_array.out | 0 tests/3-ir-gen/answers/lv0_1/input.in | 1 + tests/3-ir-gen/answers/lv0_1/input.out | 0 tests/3-ir-gen/answers/lv0_1/output_float.out | 1 + tests/3-ir-gen/answers/lv0_1/output_int.out | 1 + tests/3-ir-gen/answers/lv0_1/return.out | 0 .../3-ir-gen/answers/lv0_2/num_add_float.out | 1 + tests/3-ir-gen/answers/lv0_2/num_add_int.out | 1 + .../3-ir-gen/answers/lv0_2/num_add_mixed.out | 1 + tests/3-ir-gen/answers/lv0_2/num_comp1.out | 1 + tests/3-ir-gen/answers/lv0_2/num_comp2.out | 4 + .../3-ir-gen/answers/lv0_2/num_div_float.out | 1 + tests/3-ir-gen/answers/lv0_2/num_div_int.out | 1 + .../3-ir-gen/answers/lv0_2/num_div_mixed.out | 1 + tests/3-ir-gen/answers/lv0_2/num_eq_float.out | 3 + tests/3-ir-gen/answers/lv0_2/num_eq_int.out | 3 + tests/3-ir-gen/answers/lv0_2/num_eq_mixed.out | 3 + tests/3-ir-gen/answers/lv0_2/num_ge_float.out | 3 + tests/3-ir-gen/answers/lv0_2/num_ge_int.out | 3 + tests/3-ir-gen/answers/lv0_2/num_ge_mixed.out | 3 + tests/3-ir-gen/answers/lv0_2/num_gt_float.out | 3 + tests/3-ir-gen/answers/lv0_2/num_gt_int.out | 3 + tests/3-ir-gen/answers/lv0_2/num_gt_mixed.out | 3 + tests/3-ir-gen/answers/lv0_2/num_le_float.out | 3 + tests/3-ir-gen/answers/lv0_2/num_le_int.out | 3 + tests/3-ir-gen/answers/lv0_2/num_le_mixed.out | 3 + tests/3-ir-gen/answers/lv0_2/num_lt_float.out | 3 + tests/3-ir-gen/answers/lv0_2/num_lt_int.out | 3 + tests/3-ir-gen/answers/lv0_2/num_lt_mixed.out | 3 + .../3-ir-gen/answers/lv0_2/num_mul_float.out | 1 + tests/3-ir-gen/answers/lv0_2/num_mul_int.out | 1 + .../3-ir-gen/answers/lv0_2/num_mul_mixed.out | 1 + .../3-ir-gen/answers/lv0_2/num_neq_float.out | 3 + tests/3-ir-gen/answers/lv0_2/num_neq_int.out | 3 + .../3-ir-gen/answers/lv0_2/num_neq_mixed.out | 3 + .../3-ir-gen/answers/lv0_2/num_sub_float.out | 1 + tests/3-ir-gen/answers/lv0_2/num_sub_int.out | 1 + .../3-ir-gen/answers/lv0_2/num_sub_mixed.out | 1 + tests/3-ir-gen/answers/lv1/assign_cmp.out | 3 + .../answers/lv1/assign_float_array_global.out | 1 + .../answers/lv1/assign_float_array_local.out | 1 + .../answers/lv1/assign_float_var_global.out | 1 + .../answers/lv1/assign_float_var_local.out | 1 + .../answers/lv1/assign_int_array_global.out | 1 + .../answers/lv1/assign_int_array_local.out | 1 + .../answers/lv1/assign_int_var_global.out | 1 + .../answers/lv1/assign_int_var_local.out | 1 + tests/3-ir-gen/answers/lv1/idx_float.out | 1 + tests/3-ir-gen/answers/lv1/innout.in | 1 + tests/3-ir-gen/answers/lv1/innout.out | 1 + tests/3-ir-gen/answers/lv1/iteration1.out | 10 + tests/3-ir-gen/answers/lv1/iteration2.out | 10 + tests/3-ir-gen/answers/lv1/negidx_float.out | 1 + .../answers/lv1/negidx_floatfuncall.out | 1 + tests/3-ir-gen/answers/lv1/negidx_int.out | 1 + .../answers/lv1/negidx_intfuncall.out | 1 + .../answers/lv1/negidx_voidfuncall.out | 1 + tests/3-ir-gen/answers/lv1/scope.out | 3 + tests/3-ir-gen/answers/lv1/selection1.out | 2 + tests/3-ir-gen/answers/lv1/selection2.out | 2 + tests/3-ir-gen/answers/lv1/selection3.out | 3 + .../answers/lv1/transfer_float_to_int.out | 1 + .../answers/lv1/transfer_int_to_float.out | 1 + tests/3-ir-gen/answers/lv2/assign_chain.out | 3 + tests/3-ir-gen/answers/lv2/funcall_array.out | 1 + .../answers/lv2/funcall_array_array.out | 2 + tests/3-ir-gen/answers/lv2/funcall_chain.out | 1 + .../answers/lv2/funcall_float_array.out | 1 + .../answers/lv2/funcall_int_array.out | 1 + .../answers/lv2/funcall_type_mismatch1.out | 1 + .../answers/lv2/funcall_type_mismatch2.out | 1 + tests/3-ir-gen/answers/lv2/funcall_var.out | 1 + .../answers/lv2/return_in_middle1.out | 1 + .../answers/lv2/return_in_middle2.out | 1 + .../answers/lv2/return_type_mismatch1.out | 1 + .../answers/lv2/return_type_mismatch2.out | 1 + tests/3-ir-gen/answers/lv3/complex1.out | 800 ++++++++++++++++++ tests/3-ir-gen/answers/lv3/complex2.in | 10 + tests/3-ir-gen/answers/lv3/complex2.out | 10 + tests/3-ir-gen/answers/lv3/complex3.in | 2 + tests/3-ir-gen/answers/lv3/complex3.out | 1 + tests/3-ir-gen/answers/lv3/complex4.out | 3 + tests/3-ir-gen/eval.py | 175 ++++ .../testcases/lv0_1/decl_float.cminus | 4 + .../testcases/lv0_1/decl_float_array.cminus | 4 + .../3-ir-gen/testcases/lv0_1/decl_int.cminus | 4 + .../testcases/lv0_1/decl_int_array.cminus | 4 + tests/3-ir-gen/testcases/lv0_1/input.cminus | 4 + .../testcases/lv0_1/output_float.cminus | 4 + .../testcases/lv0_1/output_int.cminus | 4 + tests/3-ir-gen/testcases/lv0_1/return.cminus | 3 + .../testcases/lv0_2/num_add_float.cminus | 4 + .../testcases/lv0_2/num_add_int.cminus | 4 + .../testcases/lv0_2/num_add_mixed.cminus | 4 + .../3-ir-gen/testcases/lv0_2/num_comp1.cminus | 4 + .../3-ir-gen/testcases/lv0_2/num_comp2.cminus | 7 + .../testcases/lv0_2/num_div_float.cminus | 4 + .../testcases/lv0_2/num_div_int.cminus | 4 + .../testcases/lv0_2/num_div_mixed.cminus | 4 + .../testcases/lv0_2/num_eq_float.cminus | 6 + .../testcases/lv0_2/num_eq_int.cminus | 6 + .../testcases/lv0_2/num_eq_mixed.cminus | 6 + .../testcases/lv0_2/num_ge_float.cminus | 6 + .../testcases/lv0_2/num_ge_int.cminus | 6 + .../testcases/lv0_2/num_ge_mixed.cminus | 6 + .../testcases/lv0_2/num_gt_float.cminus | 6 + .../testcases/lv0_2/num_gt_int.cminus | 6 + .../testcases/lv0_2/num_gt_mixed.cminus | 6 + .../testcases/lv0_2/num_le_float.cminus | 6 + .../testcases/lv0_2/num_le_int.cminus | 6 + .../testcases/lv0_2/num_le_mixed.cminus | 6 + .../testcases/lv0_2/num_lt_float.cminus | 6 + .../testcases/lv0_2/num_lt_int.cminus | 6 + .../testcases/lv0_2/num_lt_mixed.cminus | 6 + .../testcases/lv0_2/num_mul_float.cminus | 4 + .../testcases/lv0_2/num_mul_int.cminus | 4 + .../testcases/lv0_2/num_mul_mixed.cminus | 4 + .../testcases/lv0_2/num_neq_float.cminus | 6 + .../testcases/lv0_2/num_neq_int.cminus | 6 + .../testcases/lv0_2/num_neq_mixed.cminus | 6 + .../testcases/lv0_2/num_sub_float.cminus | 4 + .../testcases/lv0_2/num_sub_int.cminus | 4 + .../testcases/lv0_2/num_sub_mixed.cminus | 4 + .../3-ir-gen/testcases/lv1/assign_cmp.cminus | 12 + .../lv1/assign_float_array_global.cminus | 6 + .../lv1/assign_float_array_local.cminus | 6 + .../lv1/assign_float_var_global.cminus | 6 + .../lv1/assign_float_var_local.cminus | 6 + .../lv1/assign_int_array_global.cminus | 6 + .../lv1/assign_int_array_local.cminus | 6 + .../lv1/assign_int_var_global.cminus | 6 + .../testcases/lv1/assign_int_var_local.cminus | 6 + tests/3-ir-gen/testcases/lv1/idx_float.cminus | 6 + tests/3-ir-gen/testcases/lv1/innout.cminus | 6 + .../3-ir-gen/testcases/lv1/iteration1.cminus | 9 + .../3-ir-gen/testcases/lv1/iteration2.cminus | 9 + .../testcases/lv1/negidx_float.cminus | 5 + .../testcases/lv1/negidx_floatfuncall.cminus | 9 + .../3-ir-gen/testcases/lv1/negidx_int.cminus | 5 + .../testcases/lv1/negidx_intfuncall.cminus | 9 + .../testcases/lv1/negidx_voidfuncall.cminus | 9 + tests/3-ir-gen/testcases/lv1/scope.cminus | 12 + .../3-ir-gen/testcases/lv1/selection1.cminus | 8 + .../3-ir-gen/testcases/lv1/selection2.cminus | 9 + .../3-ir-gen/testcases/lv1/selection3.cminus | 15 + .../lv1/transfer_float_to_int.cminus | 6 + .../lv1/transfer_int_to_float.cminus | 6 + .../testcases/lv2/assign_chain.cminus | 10 + .../testcases/lv2/funcall_array_array.cminus | 17 + .../testcases/lv2/funcall_chain.cminus | 9 + .../testcases/lv2/funcall_float_array.cminus | 11 + .../testcases/lv2/funcall_int_array.cminus | 11 + .../lv2/funcall_type_mismatch1.cminus | 11 + .../lv2/funcall_type_mismatch2.cminus | 11 + .../3-ir-gen/testcases/lv2/funcall_var.cminus | 11 + .../testcases/lv2/return_in_middle1.cminus | 16 + .../testcases/lv2/return_in_middle2.cminus | 14 + .../lv2/return_type_mismatch1.cminus | 8 + .../lv2/return_type_mismatch2.cminus | 8 + tests/3-ir-gen/testcases/lv3/complex1.cminus | 73 ++ tests/3-ir-gen/testcases/lv3/complex2.cminus | 54 ++ tests/3-ir-gen/testcases/lv3/complex3.cminus | 20 + tests/3-ir-gen/testcases/lv3/complex4.cminus | 100 +++ 171 files changed, 2326 insertions(+), 1 deletion(-) create mode 100644 include/cminusf_builder.hpp create mode 100644 src/cminusfc/CMakeLists.txt create mode 100644 src/cminusfc/cminusf_builder.cpp create mode 100644 src/cminusfc/cminusfc.cpp create mode 100644 tests/3-ir-gen/answers/lv0_1/decl_float.out create mode 100644 tests/3-ir-gen/answers/lv0_1/decl_float_array.out create mode 100644 tests/3-ir-gen/answers/lv0_1/decl_int.out create mode 100644 tests/3-ir-gen/answers/lv0_1/decl_int_array.out create mode 100644 tests/3-ir-gen/answers/lv0_1/input.in create mode 100644 tests/3-ir-gen/answers/lv0_1/input.out create mode 100644 tests/3-ir-gen/answers/lv0_1/output_float.out create mode 100644 tests/3-ir-gen/answers/lv0_1/output_int.out create mode 100644 tests/3-ir-gen/answers/lv0_1/return.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_add_float.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_add_int.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_add_mixed.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_comp1.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_comp2.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_div_float.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_div_int.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_div_mixed.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_eq_float.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_eq_int.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_eq_mixed.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_ge_float.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_ge_int.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_ge_mixed.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_gt_float.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_gt_int.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_gt_mixed.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_le_float.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_le_int.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_le_mixed.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_lt_float.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_lt_int.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_lt_mixed.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_mul_float.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_mul_int.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_mul_mixed.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_neq_float.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_neq_int.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_neq_mixed.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_sub_float.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_sub_int.out create mode 100644 tests/3-ir-gen/answers/lv0_2/num_sub_mixed.out create mode 100644 tests/3-ir-gen/answers/lv1/assign_cmp.out create mode 100644 tests/3-ir-gen/answers/lv1/assign_float_array_global.out create mode 100644 tests/3-ir-gen/answers/lv1/assign_float_array_local.out create mode 100644 tests/3-ir-gen/answers/lv1/assign_float_var_global.out create mode 100644 tests/3-ir-gen/answers/lv1/assign_float_var_local.out create mode 100644 tests/3-ir-gen/answers/lv1/assign_int_array_global.out create mode 100644 tests/3-ir-gen/answers/lv1/assign_int_array_local.out create mode 100644 tests/3-ir-gen/answers/lv1/assign_int_var_global.out create mode 100644 tests/3-ir-gen/answers/lv1/assign_int_var_local.out create mode 100644 tests/3-ir-gen/answers/lv1/idx_float.out create mode 100644 tests/3-ir-gen/answers/lv1/innout.in create mode 100644 tests/3-ir-gen/answers/lv1/innout.out create mode 100644 tests/3-ir-gen/answers/lv1/iteration1.out create mode 100644 tests/3-ir-gen/answers/lv1/iteration2.out create mode 100644 tests/3-ir-gen/answers/lv1/negidx_float.out create mode 100644 tests/3-ir-gen/answers/lv1/negidx_floatfuncall.out create mode 100644 tests/3-ir-gen/answers/lv1/negidx_int.out create mode 100644 tests/3-ir-gen/answers/lv1/negidx_intfuncall.out create mode 100644 tests/3-ir-gen/answers/lv1/negidx_voidfuncall.out create mode 100644 tests/3-ir-gen/answers/lv1/scope.out create mode 100644 tests/3-ir-gen/answers/lv1/selection1.out create mode 100644 tests/3-ir-gen/answers/lv1/selection2.out create mode 100644 tests/3-ir-gen/answers/lv1/selection3.out create mode 100644 tests/3-ir-gen/answers/lv1/transfer_float_to_int.out create mode 100644 tests/3-ir-gen/answers/lv1/transfer_int_to_float.out create mode 100644 tests/3-ir-gen/answers/lv2/assign_chain.out create mode 100644 tests/3-ir-gen/answers/lv2/funcall_array.out create mode 100644 tests/3-ir-gen/answers/lv2/funcall_array_array.out create mode 100644 tests/3-ir-gen/answers/lv2/funcall_chain.out create mode 100644 tests/3-ir-gen/answers/lv2/funcall_float_array.out create mode 100644 tests/3-ir-gen/answers/lv2/funcall_int_array.out create mode 100644 tests/3-ir-gen/answers/lv2/funcall_type_mismatch1.out create mode 100644 tests/3-ir-gen/answers/lv2/funcall_type_mismatch2.out create mode 100644 tests/3-ir-gen/answers/lv2/funcall_var.out create mode 100644 tests/3-ir-gen/answers/lv2/return_in_middle1.out create mode 100644 tests/3-ir-gen/answers/lv2/return_in_middle2.out create mode 100644 tests/3-ir-gen/answers/lv2/return_type_mismatch1.out create mode 100644 tests/3-ir-gen/answers/lv2/return_type_mismatch2.out create mode 100644 tests/3-ir-gen/answers/lv3/complex1.out create mode 100644 tests/3-ir-gen/answers/lv3/complex2.in create mode 100644 tests/3-ir-gen/answers/lv3/complex2.out create mode 100644 tests/3-ir-gen/answers/lv3/complex3.in create mode 100644 tests/3-ir-gen/answers/lv3/complex3.out create mode 100644 tests/3-ir-gen/answers/lv3/complex4.out create mode 100755 tests/3-ir-gen/eval.py create mode 100644 tests/3-ir-gen/testcases/lv0_1/decl_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_1/decl_float_array.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_1/decl_int.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_1/decl_int_array.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_1/input.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_1/output_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_1/output_int.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_1/return.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_add_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_add_int.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_add_mixed.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_comp1.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_comp2.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_div_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_div_int.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_div_mixed.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_eq_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_eq_int.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_eq_mixed.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_ge_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_ge_int.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_ge_mixed.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_gt_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_gt_int.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_gt_mixed.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_le_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_le_int.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_le_mixed.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_lt_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_lt_int.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_lt_mixed.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_mul_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_mul_int.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_mul_mixed.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_neq_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_neq_int.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_neq_mixed.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_sub_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_sub_int.cminus create mode 100644 tests/3-ir-gen/testcases/lv0_2/num_sub_mixed.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/assign_cmp.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/assign_float_array_global.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/assign_float_array_local.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/assign_float_var_global.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/assign_float_var_local.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/assign_int_array_global.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/assign_int_array_local.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/assign_int_var_global.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/assign_int_var_local.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/idx_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/innout.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/iteration1.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/iteration2.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/negidx_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/negidx_floatfuncall.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/negidx_int.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/negidx_intfuncall.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/negidx_voidfuncall.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/scope.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/selection1.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/selection2.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/selection3.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/transfer_float_to_int.cminus create mode 100644 tests/3-ir-gen/testcases/lv1/transfer_int_to_float.cminus create mode 100644 tests/3-ir-gen/testcases/lv2/assign_chain.cminus create mode 100644 tests/3-ir-gen/testcases/lv2/funcall_array_array.cminus create mode 100644 tests/3-ir-gen/testcases/lv2/funcall_chain.cminus create mode 100644 tests/3-ir-gen/testcases/lv2/funcall_float_array.cminus create mode 100644 tests/3-ir-gen/testcases/lv2/funcall_int_array.cminus create mode 100644 tests/3-ir-gen/testcases/lv2/funcall_type_mismatch1.cminus create mode 100644 tests/3-ir-gen/testcases/lv2/funcall_type_mismatch2.cminus create mode 100644 tests/3-ir-gen/testcases/lv2/funcall_var.cminus create mode 100644 tests/3-ir-gen/testcases/lv2/return_in_middle1.cminus create mode 100644 tests/3-ir-gen/testcases/lv2/return_in_middle2.cminus create mode 100644 tests/3-ir-gen/testcases/lv2/return_type_mismatch1.cminus create mode 100644 tests/3-ir-gen/testcases/lv2/return_type_mismatch2.cminus create mode 100644 tests/3-ir-gen/testcases/lv3/complex1.cminus create mode 100644 tests/3-ir-gen/testcases/lv3/complex2.cminus create mode 100644 tests/3-ir-gen/testcases/lv3/complex3.cminus create mode 100644 tests/3-ir-gen/testcases/lv3/complex4.cminus diff --git a/include/cminusf_builder.hpp b/include/cminusf_builder.hpp new file mode 100644 index 0000000..750dc3a --- /dev/null +++ b/include/cminusf_builder.hpp @@ -0,0 +1,103 @@ +#ifndef _CMINUSF_BUILDER_HPP_ +#define _CMINUSF_BUILDER_HPP_ +#include "BasicBlock.h" +#include "Constant.h" +#include "Function.h" +#include "IRBuilder.h" +#include "Module.h" +#include "Type.h" +#include "ast.hpp" + +#include +#include + +class Scope { + public: + // enter a new scope + void enter() { inner.push_back({}); } + + // exit a scope + void exit() { inner.pop_back(); } + + bool in_global() { return inner.size() == 1; } + + // push a name to scope + // return true if successful + // return false if this name already exits + bool push(std::string name, Value *val) { + auto result = inner[inner.size() - 1].insert({name, val}); + return result.second; + } + + Value *find(std::string name) { + for (auto s = inner.rbegin(); s != inner.rend(); s++) { + auto iter = s->find(name); + if (iter != s->end()) { + return iter->second; + } + } + + return nullptr; + } + + private: + std::vector> inner; +}; + +class CminusfBuilder : public ASTVisitor { + public: + CminusfBuilder() { + module = std::unique_ptr(new Module("Cminus code")); + builder = std::make_unique(nullptr, module.get()); + auto TyVoid = Type::get_void_type(module.get()); + auto TyInt32 = Type::get_int32_type(module.get()); + auto TyFloat = Type::get_float_type(module.get()); + + auto input_type = FunctionType::get(TyInt32, {}); + auto input_fun = Function::create(input_type, "input", module.get()); + + std::vector output_params; + output_params.push_back(TyInt32); + auto output_type = FunctionType::get(TyVoid, output_params); + auto output_fun = Function::create(output_type, "output", module.get()); + + std::vector output_float_params; + output_float_params.push_back(TyFloat); + auto output_float_type = FunctionType::get(TyVoid, output_float_params); + auto output_float_fun = Function::create(output_float_type, "outputFloat", module.get()); + + auto neg_idx_except_type = FunctionType::get(TyVoid, {}); + auto neg_idx_except_fun = Function::create(neg_idx_except_type, "neg_idx_except", module.get()); + + scope.enter(); + scope.push("input", input_fun); + scope.push("output", output_fun); + scope.push("outputFloat", output_float_fun); + scope.push("neg_idx_except", neg_idx_except_fun); + } + + std::unique_ptr getModule() { return std::move(module); } + + private: + virtual void visit(ASTProgram &) override final; + virtual void visit(ASTNum &) override final; + virtual void visit(ASTVarDeclaration &) override final; + virtual void visit(ASTFunDeclaration &) override final; + virtual void visit(ASTParam &) override final; + virtual void visit(ASTCompoundStmt &) override final; + virtual void visit(ASTExpressionStmt &) override final; + virtual void visit(ASTSelectionStmt &) override final; + virtual void visit(ASTIterationStmt &) override final; + virtual void visit(ASTReturnStmt &) override final; + virtual void visit(ASTAssignExpression &) override final; + virtual void visit(ASTSimpleExpression &) override final; + virtual void visit(ASTAdditiveExpression &) override final; + virtual void visit(ASTVar &) override final; + virtual void visit(ASTTerm &) override final; + virtual void visit(ASTCall &) override final; + + std::unique_ptr builder; + Scope scope; + std::unique_ptr module; +}; +#endif diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e595568..51ccdea 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,5 @@ add_subdirectory(parser) add_subdirectory(common) add_subdirectory(io) -add_subdirectory(lightir) \ No newline at end of file +add_subdirectory(lightir) +add_subdirectory(cminusfc) \ No newline at end of file diff --git a/src/cminusfc/CMakeLists.txt b/src/cminusfc/CMakeLists.txt new file mode 100644 index 0000000..ff669ae --- /dev/null +++ b/src/cminusfc/CMakeLists.txt @@ -0,0 +1,19 @@ +add_executable( + cminusfc + cminusfc.cpp + cminusf_builder.cpp +) + +target_link_libraries( + cminusfc + IR_lib + common + syntax +) + +install( + TARGETS cminusfc + RUNTIME DESTINATION bin +) + + diff --git a/src/cminusfc/cminusf_builder.cpp b/src/cminusfc/cminusf_builder.cpp new file mode 100644 index 0000000..e4278b2 --- /dev/null +++ b/src/cminusfc/cminusf_builder.cpp @@ -0,0 +1,184 @@ +/* + * 声明:本代码为 2020 秋 中国科大编译原理(李诚)课程实验参考实现。 + * 请不要以任何方式,将本代码上传到可以公开访问的站点或仓库 + */ + +#include "cminusf_builder.hpp" + +#define CONST_FP(num) ConstantFP::get((float)num, module.get()) +#define CONST_INT(num) ConstantInt::get(num, module.get()) + + +// TODO: Global Variable Declarations +// You can define global variables here +// to store state. You can expand these +// definitions if you need to. + +// function that is being built +Function *cur_fun = nullptr; + +// types +Type *VOID_T; +Type *INT1_T; +Type *INT32_T; +Type *INT32PTR_T; +Type *FLOAT_T; +Type *FLOATPTR_T; + +/* + * use CMinusfBuilder::Scope to construct scopes + * scope.enter: enter a new scope + * scope.exit: exit current scope + * scope.push: add a new binding to current scope + * scope.find: find and return the value bound to the name + */ + +void CminusfBuilder::visit(ASTProgram &node) { + VOID_T = Type::get_void_type(module.get()); + INT1_T = Type::get_int1_type(module.get()); + INT32_T = Type::get_int32_type(module.get()); + INT32PTR_T = Type::get_int32_ptr_type(module.get()); + FLOAT_T = Type::get_float_type(module.get()); + FLOATPTR_T = Type::get_float_ptr_type(module.get()); + + for (auto decl : node.declarations) { + decl->accept(*this); + } +} + +void CminusfBuilder::visit(ASTNum &node) { + //!TODO: This function is empty now. + // Add some code here. +} + +void CminusfBuilder::visit(ASTVarDeclaration &node) { + //!TODO: This function is empty now. + // Add some code here. +} + +void CminusfBuilder::visit(ASTFunDeclaration &node) { + FunctionType *fun_type; + Type *ret_type; + std::vector param_types; + if (node.type == TYPE_INT) + ret_type = INT32_T; + else if (node.type == TYPE_FLOAT) + ret_type = FLOAT_T; + else + ret_type = VOID_T; + + for (auto ¶m : node.params) { + //!TODO: Please accomplish param_types. + + + + } + + fun_type = FunctionType::get(ret_type, param_types); + auto fun = Function::create(fun_type, node.id, module.get()); + scope.push(node.id, fun); + cur_fun = fun; + auto funBB = BasicBlock::create(module.get(), "entry", fun); + builder->set_insert_point(funBB); + scope.enter(); + std::vector args; + for (auto arg = fun->arg_begin(); arg != fun->arg_end(); arg++) { + args.push_back(*arg); + } + for (int i = 0; i < node.params.size(); ++i) { + //!TODO: You need to deal with params + // and store them in the scope. + + + + } + node.compound_stmt->accept(*this); + if (builder->get_insert_block()->get_terminator() == nullptr) + { + if (cur_fun->get_return_type()->is_void_type()) + builder->create_void_ret(); + else if (cur_fun->get_return_type()->is_float_type()) + builder->create_ret(CONST_FP(0.)); + else + builder->create_ret(CONST_INT(0)); + } + scope.exit(); +} + +void CminusfBuilder::visit(ASTParam &node) { + //!TODO: This function is empty now. + // Add some code here. +} + +void CminusfBuilder::visit(ASTCompoundStmt &node) { + //!TODO: This function is not complete. + // You may need to add some code here + // to deal with complex statements. + + + for (auto &decl : node.local_declarations) { + decl->accept(*this); + } + + for (auto &stmt : node.statement_list) { + stmt->accept(*this); + if (builder->get_insert_block()->get_terminator() != nullptr) + break; + } +} + +void CminusfBuilder::visit(ASTExpressionStmt &node) { + //!TODO: This function is empty now. + // Add some code here. +} + +void CminusfBuilder::visit(ASTSelectionStmt &node) { + //!TODO: This function is empty now. + // Add some code here. +} + +void CminusfBuilder::visit(ASTIterationStmt &node) { + //!TODO: This function is empty now. + // Add some code here. +} + +void CminusfBuilder::visit(ASTReturnStmt &node) { + if (node.expression == nullptr) { + builder->create_void_ret(); + } else { + //!TODO: The given code is incomplete. + // You need to solve other return cases (e.g. return an integer). + + + } +} + +void CminusfBuilder::visit(ASTVar &node) { + //!TODO: This function is empty now. + // Add some code here. +} + +void CminusfBuilder::visit(ASTAssignExpression &node) { + //!TODO: This function is empty now. + // Add some code here. +} + +void CminusfBuilder::visit(ASTSimpleExpression &node) { + //!TODO: This function is empty now. + // Add some code here. +} + +void CminusfBuilder::visit(ASTAdditiveExpression &node) { + //!TODO: This function is empty now. + // Add some code here. +} + +void CminusfBuilder::visit(ASTTerm &node) { + //!TODO: This function is empty now. + // Add some code here. +} + +void CminusfBuilder::visit(ASTCall &node) { + //!TODO: This function is empty now. + // Add some code here. +} diff --git a/src/cminusfc/cminusfc.cpp b/src/cminusfc/cminusfc.cpp new file mode 100644 index 0000000..09dbe05 --- /dev/null +++ b/src/cminusfc/cminusfc.cpp @@ -0,0 +1,111 @@ +#include "cminusf_builder.hpp" +#include +#include +#include + +using namespace std::literals::string_literals; + +void print_help(std::string exe_name) { + std::cout << "Usage: " << exe_name << + " [ -h | --help ] [ -o ] [ -emit-llvm ] " << std::endl; +} + + +int main(int argc, char **argv) { + std::string target_path; + std::string input_path; + + bool mem2reg = false; + bool const_propagation = false; + bool activevars = false; + bool loop_inv_hoist = false; + bool loop_search = false; + bool emit = false; + + for (int i = 1; i < argc; ++i) { + if (argv[i] == "-h"s || argv[i] == "--help"s) { + print_help(argv[0]); + return 0; + } else if (argv[i] == "-o"s) { + if (target_path.empty() && i + 1 < argc) { + target_path = argv[i + 1]; + i += 1; + } else { + print_help(argv[0]); + return 0; + } + } else if (argv[i] == "-emit-llvm"s) { + emit = true; + } else if (argv[i] == "-mem2reg"s) { + mem2reg = true; + } else if (argv[i] == "-loop-search"s) { + loop_search = true; + } else if (argv[i] == "-loop-inv-hoist"s) { + loop_inv_hoist = true; + } else if (argv[i] == "-const-propagation"s) { + const_propagation = true; + } else if (argv[i] == "-active-vars"s) { + activevars = true; + } else { + if (input_path.empty()) { + input_path = argv[i]; + } else { + print_help(argv[0]); + return 0; + } + } + } + if (input_path.empty()) { + print_help(argv[0]); + return 0; + } + + if (target_path.empty()) { + auto pos = input_path.rfind('.'); + if (pos == std::string::npos) { + std::cerr << argv[0] << ": input file " << input_path << " has unknown filetype!" << std::endl; + return -1; + } else { + if (input_path.substr(pos) != ".cminus") { + std::cerr << argv[0] << ": input file " << input_path << " has unknown filetype!" << std::endl; + return -1; + } + if (emit) { + target_path = input_path.substr(0, pos); + } else { + target_path = input_path.substr(0, pos); + } + } + } + + auto s = parse(input_path.c_str()); + auto a = AST(s); + CminusfBuilder builder; + a.run_visitor(builder); + + auto m = builder.getModule(); + + auto IR = m->print(); + + std::ofstream output_stream; + auto output_file = target_path + ".ll"; + output_stream.open(output_file, std::ios::out); + output_stream << "; ModuleID = 'cminus'\n"; + output_stream << "source_filename = \"" + input_path + "\"\n\n"; + output_stream << IR; + output_stream.close(); + if (!emit) { + std::string lib_path = argv[0]; + lib_path.erase(lib_path.rfind('/')) += "/libcminus_io.a"; + auto command_string = "clang -O0 -w "s + target_path + ".ll -o " + target_path + " " + lib_path; + int re_code0 = std::system(command_string.c_str()); + command_string = "rm "s + target_path + ".ll"; + int re_code1 = std::system(command_string.c_str()); + if (re_code0 == 0 && re_code1 == 0) + return 0; + else + return 1; + } + + return 0; +} diff --git a/tests/3-ir-gen/answers/lv0_1/decl_float.out b/tests/3-ir-gen/answers/lv0_1/decl_float.out new file mode 100644 index 0000000..e69de29 diff --git a/tests/3-ir-gen/answers/lv0_1/decl_float_array.out b/tests/3-ir-gen/answers/lv0_1/decl_float_array.out new file mode 100644 index 0000000..e69de29 diff --git a/tests/3-ir-gen/answers/lv0_1/decl_int.out b/tests/3-ir-gen/answers/lv0_1/decl_int.out new file mode 100644 index 0000000..e69de29 diff --git a/tests/3-ir-gen/answers/lv0_1/decl_int_array.out b/tests/3-ir-gen/answers/lv0_1/decl_int_array.out new file mode 100644 index 0000000..e69de29 diff --git a/tests/3-ir-gen/answers/lv0_1/input.in b/tests/3-ir-gen/answers/lv0_1/input.in new file mode 100644 index 0000000..b8626c4 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_1/input.in @@ -0,0 +1 @@ +4 diff --git a/tests/3-ir-gen/answers/lv0_1/input.out b/tests/3-ir-gen/answers/lv0_1/input.out new file mode 100644 index 0000000..e69de29 diff --git a/tests/3-ir-gen/answers/lv0_1/output_float.out b/tests/3-ir-gen/answers/lv0_1/output_float.out new file mode 100644 index 0000000..306e815 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_1/output_float.out @@ -0,0 +1 @@ +123.400002 diff --git a/tests/3-ir-gen/answers/lv0_1/output_int.out b/tests/3-ir-gen/answers/lv0_1/output_int.out new file mode 100644 index 0000000..81c545e --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_1/output_int.out @@ -0,0 +1 @@ +1234 diff --git a/tests/3-ir-gen/answers/lv0_1/return.out b/tests/3-ir-gen/answers/lv0_1/return.out new file mode 100644 index 0000000..e69de29 diff --git a/tests/3-ir-gen/answers/lv0_2/num_add_float.out b/tests/3-ir-gen/answers/lv0_2/num_add_float.out new file mode 100644 index 0000000..190a180 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_add_float.out @@ -0,0 +1 @@ +123 diff --git a/tests/3-ir-gen/answers/lv0_2/num_add_int.out b/tests/3-ir-gen/answers/lv0_2/num_add_int.out new file mode 100644 index 0000000..81c545e --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_add_int.out @@ -0,0 +1 @@ +1234 diff --git a/tests/3-ir-gen/answers/lv0_2/num_add_mixed.out b/tests/3-ir-gen/answers/lv0_2/num_add_mixed.out new file mode 100644 index 0000000..b70608f --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_add_mixed.out @@ -0,0 +1 @@ +1023 diff --git a/tests/3-ir-gen/answers/lv0_2/num_comp1.out b/tests/3-ir-gen/answers/lv0_2/num_comp1.out new file mode 100644 index 0000000..2161347 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_comp1.out @@ -0,0 +1 @@ +-44.720001 diff --git a/tests/3-ir-gen/answers/lv0_2/num_comp2.out b/tests/3-ir-gen/answers/lv0_2/num_comp2.out new file mode 100644 index 0000000..d9ff83f --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_comp2.out @@ -0,0 +1,4 @@ +1 +1 +0 +0 diff --git a/tests/3-ir-gen/answers/lv0_2/num_div_float.out b/tests/3-ir-gen/answers/lv0_2/num_div_float.out new file mode 100644 index 0000000..48082f7 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_div_float.out @@ -0,0 +1 @@ +12 diff --git a/tests/3-ir-gen/answers/lv0_2/num_div_int.out b/tests/3-ir-gen/answers/lv0_2/num_div_int.out new file mode 100644 index 0000000..81c545e --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_div_int.out @@ -0,0 +1 @@ +1234 diff --git a/tests/3-ir-gen/answers/lv0_2/num_div_mixed.out b/tests/3-ir-gen/answers/lv0_2/num_div_mixed.out new file mode 100644 index 0000000..48082f7 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_div_mixed.out @@ -0,0 +1 @@ +12 diff --git a/tests/3-ir-gen/answers/lv0_2/num_eq_float.out b/tests/3-ir-gen/answers/lv0_2/num_eq_float.out new file mode 100644 index 0000000..7938dcd --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_eq_float.out @@ -0,0 +1,3 @@ +0 +1 +0 diff --git a/tests/3-ir-gen/answers/lv0_2/num_eq_int.out b/tests/3-ir-gen/answers/lv0_2/num_eq_int.out new file mode 100644 index 0000000..7938dcd --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_eq_int.out @@ -0,0 +1,3 @@ +0 +1 +0 diff --git a/tests/3-ir-gen/answers/lv0_2/num_eq_mixed.out b/tests/3-ir-gen/answers/lv0_2/num_eq_mixed.out new file mode 100644 index 0000000..7938dcd --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_eq_mixed.out @@ -0,0 +1,3 @@ +0 +1 +0 diff --git a/tests/3-ir-gen/answers/lv0_2/num_ge_float.out b/tests/3-ir-gen/answers/lv0_2/num_ge_float.out new file mode 100644 index 0000000..986394f --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_ge_float.out @@ -0,0 +1,3 @@ +0 +1 +1 diff --git a/tests/3-ir-gen/answers/lv0_2/num_ge_int.out b/tests/3-ir-gen/answers/lv0_2/num_ge_int.out new file mode 100644 index 0000000..986394f --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_ge_int.out @@ -0,0 +1,3 @@ +0 +1 +1 diff --git a/tests/3-ir-gen/answers/lv0_2/num_ge_mixed.out b/tests/3-ir-gen/answers/lv0_2/num_ge_mixed.out new file mode 100644 index 0000000..986394f --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_ge_mixed.out @@ -0,0 +1,3 @@ +0 +1 +1 diff --git a/tests/3-ir-gen/answers/lv0_2/num_gt_float.out b/tests/3-ir-gen/answers/lv0_2/num_gt_float.out new file mode 100644 index 0000000..bb5ee5c --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_gt_float.out @@ -0,0 +1,3 @@ +0 +0 +1 diff --git a/tests/3-ir-gen/answers/lv0_2/num_gt_int.out b/tests/3-ir-gen/answers/lv0_2/num_gt_int.out new file mode 100644 index 0000000..bb5ee5c --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_gt_int.out @@ -0,0 +1,3 @@ +0 +0 +1 diff --git a/tests/3-ir-gen/answers/lv0_2/num_gt_mixed.out b/tests/3-ir-gen/answers/lv0_2/num_gt_mixed.out new file mode 100644 index 0000000..bb5ee5c --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_gt_mixed.out @@ -0,0 +1,3 @@ +0 +0 +1 diff --git a/tests/3-ir-gen/answers/lv0_2/num_le_float.out b/tests/3-ir-gen/answers/lv0_2/num_le_float.out new file mode 100644 index 0000000..2f1465d --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_le_float.out @@ -0,0 +1,3 @@ +1 +1 +0 diff --git a/tests/3-ir-gen/answers/lv0_2/num_le_int.out b/tests/3-ir-gen/answers/lv0_2/num_le_int.out new file mode 100644 index 0000000..2f1465d --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_le_int.out @@ -0,0 +1,3 @@ +1 +1 +0 diff --git a/tests/3-ir-gen/answers/lv0_2/num_le_mixed.out b/tests/3-ir-gen/answers/lv0_2/num_le_mixed.out new file mode 100644 index 0000000..2f1465d --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_le_mixed.out @@ -0,0 +1,3 @@ +1 +1 +0 diff --git a/tests/3-ir-gen/answers/lv0_2/num_lt_float.out b/tests/3-ir-gen/answers/lv0_2/num_lt_float.out new file mode 100644 index 0000000..e224937 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_lt_float.out @@ -0,0 +1,3 @@ +1 +0 +0 diff --git a/tests/3-ir-gen/answers/lv0_2/num_lt_int.out b/tests/3-ir-gen/answers/lv0_2/num_lt_int.out new file mode 100644 index 0000000..e224937 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_lt_int.out @@ -0,0 +1,3 @@ +1 +0 +0 diff --git a/tests/3-ir-gen/answers/lv0_2/num_lt_mixed.out b/tests/3-ir-gen/answers/lv0_2/num_lt_mixed.out new file mode 100644 index 0000000..e224937 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_lt_mixed.out @@ -0,0 +1,3 @@ +1 +0 +0 diff --git a/tests/3-ir-gen/answers/lv0_2/num_mul_float.out b/tests/3-ir-gen/answers/lv0_2/num_mul_float.out new file mode 100644 index 0000000..190a180 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_mul_float.out @@ -0,0 +1 @@ +123 diff --git a/tests/3-ir-gen/answers/lv0_2/num_mul_int.out b/tests/3-ir-gen/answers/lv0_2/num_mul_int.out new file mode 100644 index 0000000..81c545e --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_mul_int.out @@ -0,0 +1 @@ +1234 diff --git a/tests/3-ir-gen/answers/lv0_2/num_mul_mixed.out b/tests/3-ir-gen/answers/lv0_2/num_mul_mixed.out new file mode 100644 index 0000000..190a180 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_mul_mixed.out @@ -0,0 +1 @@ +123 diff --git a/tests/3-ir-gen/answers/lv0_2/num_neq_float.out b/tests/3-ir-gen/answers/lv0_2/num_neq_float.out new file mode 100644 index 0000000..16db301 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_neq_float.out @@ -0,0 +1,3 @@ +1 +0 +1 diff --git a/tests/3-ir-gen/answers/lv0_2/num_neq_int.out b/tests/3-ir-gen/answers/lv0_2/num_neq_int.out new file mode 100644 index 0000000..16db301 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_neq_int.out @@ -0,0 +1,3 @@ +1 +0 +1 diff --git a/tests/3-ir-gen/answers/lv0_2/num_neq_mixed.out b/tests/3-ir-gen/answers/lv0_2/num_neq_mixed.out new file mode 100644 index 0000000..16db301 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_neq_mixed.out @@ -0,0 +1,3 @@ +1 +0 +1 diff --git a/tests/3-ir-gen/answers/lv0_2/num_sub_float.out b/tests/3-ir-gen/answers/lv0_2/num_sub_float.out new file mode 100644 index 0000000..86a0307 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_sub_float.out @@ -0,0 +1 @@ +192 diff --git a/tests/3-ir-gen/answers/lv0_2/num_sub_int.out b/tests/3-ir-gen/answers/lv0_2/num_sub_int.out new file mode 100644 index 0000000..81c545e --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_sub_int.out @@ -0,0 +1 @@ +1234 diff --git a/tests/3-ir-gen/answers/lv0_2/num_sub_mixed.out b/tests/3-ir-gen/answers/lv0_2/num_sub_mixed.out new file mode 100644 index 0000000..1862496 --- /dev/null +++ b/tests/3-ir-gen/answers/lv0_2/num_sub_mixed.out @@ -0,0 +1 @@ +1923 diff --git a/tests/3-ir-gen/answers/lv1/assign_cmp.out b/tests/3-ir-gen/answers/lv1/assign_cmp.out new file mode 100644 index 0000000..e224937 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/assign_cmp.out @@ -0,0 +1,3 @@ +1 +0 +0 diff --git a/tests/3-ir-gen/answers/lv1/assign_float_array_global.out b/tests/3-ir-gen/answers/lv1/assign_float_array_global.out new file mode 100644 index 0000000..16b42d8 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/assign_float_array_global.out @@ -0,0 +1 @@ +1234.000000 diff --git a/tests/3-ir-gen/answers/lv1/assign_float_array_local.out b/tests/3-ir-gen/answers/lv1/assign_float_array_local.out new file mode 100644 index 0000000..16b42d8 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/assign_float_array_local.out @@ -0,0 +1 @@ +1234.000000 diff --git a/tests/3-ir-gen/answers/lv1/assign_float_var_global.out b/tests/3-ir-gen/answers/lv1/assign_float_var_global.out new file mode 100644 index 0000000..16b42d8 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/assign_float_var_global.out @@ -0,0 +1 @@ +1234.000000 diff --git a/tests/3-ir-gen/answers/lv1/assign_float_var_local.out b/tests/3-ir-gen/answers/lv1/assign_float_var_local.out new file mode 100644 index 0000000..16b42d8 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/assign_float_var_local.out @@ -0,0 +1 @@ +1234.000000 diff --git a/tests/3-ir-gen/answers/lv1/assign_int_array_global.out b/tests/3-ir-gen/answers/lv1/assign_int_array_global.out new file mode 100644 index 0000000..81c545e --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/assign_int_array_global.out @@ -0,0 +1 @@ +1234 diff --git a/tests/3-ir-gen/answers/lv1/assign_int_array_local.out b/tests/3-ir-gen/answers/lv1/assign_int_array_local.out new file mode 100644 index 0000000..81c545e --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/assign_int_array_local.out @@ -0,0 +1 @@ +1234 diff --git a/tests/3-ir-gen/answers/lv1/assign_int_var_global.out b/tests/3-ir-gen/answers/lv1/assign_int_var_global.out new file mode 100644 index 0000000..81c545e --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/assign_int_var_global.out @@ -0,0 +1 @@ +1234 diff --git a/tests/3-ir-gen/answers/lv1/assign_int_var_local.out b/tests/3-ir-gen/answers/lv1/assign_int_var_local.out new file mode 100644 index 0000000..81c545e --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/assign_int_var_local.out @@ -0,0 +1 @@ +1234 diff --git a/tests/3-ir-gen/answers/lv1/idx_float.out b/tests/3-ir-gen/answers/lv1/idx_float.out new file mode 100644 index 0000000..d7b1c44 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/idx_float.out @@ -0,0 +1 @@ +1024 diff --git a/tests/3-ir-gen/answers/lv1/innout.in b/tests/3-ir-gen/answers/lv1/innout.in new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/innout.in @@ -0,0 +1 @@ +9 diff --git a/tests/3-ir-gen/answers/lv1/innout.out b/tests/3-ir-gen/answers/lv1/innout.out new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/innout.out @@ -0,0 +1 @@ +9 diff --git a/tests/3-ir-gen/answers/lv1/iteration1.out b/tests/3-ir-gen/answers/lv1/iteration1.out new file mode 100644 index 0000000..f4c0c86 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/iteration1.out @@ -0,0 +1,10 @@ +10 +9 +8 +7 +6 +5 +4 +3 +2 +1 diff --git a/tests/3-ir-gen/answers/lv1/iteration2.out b/tests/3-ir-gen/answers/lv1/iteration2.out new file mode 100644 index 0000000..f4c0c86 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/iteration2.out @@ -0,0 +1,10 @@ +10 +9 +8 +7 +6 +5 +4 +3 +2 +1 diff --git a/tests/3-ir-gen/answers/lv1/negidx_float.out b/tests/3-ir-gen/answers/lv1/negidx_float.out new file mode 100644 index 0000000..d012265 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/negidx_float.out @@ -0,0 +1 @@ +negative index exception diff --git a/tests/3-ir-gen/answers/lv1/negidx_floatfuncall.out b/tests/3-ir-gen/answers/lv1/negidx_floatfuncall.out new file mode 100644 index 0000000..d012265 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/negidx_floatfuncall.out @@ -0,0 +1 @@ +negative index exception diff --git a/tests/3-ir-gen/answers/lv1/negidx_int.out b/tests/3-ir-gen/answers/lv1/negidx_int.out new file mode 100644 index 0000000..d012265 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/negidx_int.out @@ -0,0 +1 @@ +negative index exception diff --git a/tests/3-ir-gen/answers/lv1/negidx_intfuncall.out b/tests/3-ir-gen/answers/lv1/negidx_intfuncall.out new file mode 100644 index 0000000..d012265 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/negidx_intfuncall.out @@ -0,0 +1 @@ +negative index exception diff --git a/tests/3-ir-gen/answers/lv1/negidx_voidfuncall.out b/tests/3-ir-gen/answers/lv1/negidx_voidfuncall.out new file mode 100644 index 0000000..d012265 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/negidx_voidfuncall.out @@ -0,0 +1 @@ +negative index exception diff --git a/tests/3-ir-gen/answers/lv1/scope.out b/tests/3-ir-gen/answers/lv1/scope.out new file mode 100644 index 0000000..1089b4f --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/scope.out @@ -0,0 +1,3 @@ +3 +11 +3 diff --git a/tests/3-ir-gen/answers/lv1/selection1.out b/tests/3-ir-gen/answers/lv1/selection1.out new file mode 100644 index 0000000..be6d407 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/selection1.out @@ -0,0 +1,2 @@ +42 +24 diff --git a/tests/3-ir-gen/answers/lv1/selection2.out b/tests/3-ir-gen/answers/lv1/selection2.out new file mode 100644 index 0000000..be6d407 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/selection2.out @@ -0,0 +1,2 @@ +42 +24 diff --git a/tests/3-ir-gen/answers/lv1/selection3.out b/tests/3-ir-gen/answers/lv1/selection3.out new file mode 100644 index 0000000..b34401c --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/selection3.out @@ -0,0 +1,3 @@ +42 +24 +1234 diff --git a/tests/3-ir-gen/answers/lv1/transfer_float_to_int.out b/tests/3-ir-gen/answers/lv1/transfer_float_to_int.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/transfer_float_to_int.out @@ -0,0 +1 @@ +1 diff --git a/tests/3-ir-gen/answers/lv1/transfer_int_to_float.out b/tests/3-ir-gen/answers/lv1/transfer_int_to_float.out new file mode 100644 index 0000000..961b372 --- /dev/null +++ b/tests/3-ir-gen/answers/lv1/transfer_int_to_float.out @@ -0,0 +1 @@ +1.000000 diff --git a/tests/3-ir-gen/answers/lv2/assign_chain.out b/tests/3-ir-gen/answers/lv2/assign_chain.out new file mode 100644 index 0000000..1f242fa --- /dev/null +++ b/tests/3-ir-gen/answers/lv2/assign_chain.out @@ -0,0 +1,3 @@ +3 +3 +3 diff --git a/tests/3-ir-gen/answers/lv2/funcall_array.out b/tests/3-ir-gen/answers/lv2/funcall_array.out new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/tests/3-ir-gen/answers/lv2/funcall_array.out @@ -0,0 +1 @@ +10 diff --git a/tests/3-ir-gen/answers/lv2/funcall_array_array.out b/tests/3-ir-gen/answers/lv2/funcall_array_array.out new file mode 100644 index 0000000..f4b3c38 --- /dev/null +++ b/tests/3-ir-gen/answers/lv2/funcall_array_array.out @@ -0,0 +1,2 @@ +1024 +1024 diff --git a/tests/3-ir-gen/answers/lv2/funcall_chain.out b/tests/3-ir-gen/answers/lv2/funcall_chain.out new file mode 100644 index 0000000..81c545e --- /dev/null +++ b/tests/3-ir-gen/answers/lv2/funcall_chain.out @@ -0,0 +1 @@ +1234 diff --git a/tests/3-ir-gen/answers/lv2/funcall_float_array.out b/tests/3-ir-gen/answers/lv2/funcall_float_array.out new file mode 100644 index 0000000..00750ed --- /dev/null +++ b/tests/3-ir-gen/answers/lv2/funcall_float_array.out @@ -0,0 +1 @@ +3 diff --git a/tests/3-ir-gen/answers/lv2/funcall_int_array.out b/tests/3-ir-gen/answers/lv2/funcall_int_array.out new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/tests/3-ir-gen/answers/lv2/funcall_int_array.out @@ -0,0 +1 @@ +10 diff --git a/tests/3-ir-gen/answers/lv2/funcall_type_mismatch1.out b/tests/3-ir-gen/answers/lv2/funcall_type_mismatch1.out new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/tests/3-ir-gen/answers/lv2/funcall_type_mismatch1.out @@ -0,0 +1 @@ +10 diff --git a/tests/3-ir-gen/answers/lv2/funcall_type_mismatch2.out b/tests/3-ir-gen/answers/lv2/funcall_type_mismatch2.out new file mode 100644 index 0000000..9406425 --- /dev/null +++ b/tests/3-ir-gen/answers/lv2/funcall_type_mismatch2.out @@ -0,0 +1 @@ +4.000000 diff --git a/tests/3-ir-gen/answers/lv2/funcall_var.out b/tests/3-ir-gen/answers/lv2/funcall_var.out new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/tests/3-ir-gen/answers/lv2/funcall_var.out @@ -0,0 +1 @@ +10 diff --git a/tests/3-ir-gen/answers/lv2/return_in_middle1.out b/tests/3-ir-gen/answers/lv2/return_in_middle1.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/3-ir-gen/answers/lv2/return_in_middle1.out @@ -0,0 +1 @@ +0 diff --git a/tests/3-ir-gen/answers/lv2/return_in_middle2.out b/tests/3-ir-gen/answers/lv2/return_in_middle2.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/3-ir-gen/answers/lv2/return_in_middle2.out @@ -0,0 +1 @@ +0 diff --git a/tests/3-ir-gen/answers/lv2/return_type_mismatch1.out b/tests/3-ir-gen/answers/lv2/return_type_mismatch1.out new file mode 100644 index 0000000..0c56bea --- /dev/null +++ b/tests/3-ir-gen/answers/lv2/return_type_mismatch1.out @@ -0,0 +1 @@ +233 diff --git a/tests/3-ir-gen/answers/lv2/return_type_mismatch2.out b/tests/3-ir-gen/answers/lv2/return_type_mismatch2.out new file mode 100644 index 0000000..273675e --- /dev/null +++ b/tests/3-ir-gen/answers/lv2/return_type_mismatch2.out @@ -0,0 +1 @@ +7.000000 diff --git a/tests/3-ir-gen/answers/lv3/complex1.out b/tests/3-ir-gen/answers/lv3/complex1.out new file mode 100644 index 0000000..b652fb0 --- /dev/null +++ b/tests/3-ir-gen/answers/lv3/complex1.out @@ -0,0 +1,800 @@ +3 +1 +4 +1 +5 +9 +2 +6 +5 +3 +5 +8 +9 +7 +9 +3 +2 +3 +8 +4 +6 +2 +6 +4 +3 +3 +8 +3 +2 +7 +9 +5 +0 +2 +8 +8 +4 +1 +9 +7 +1 +6 +9 +3 +9 +9 +3 +7 +5 +1 +0 +5 +8 +2 +0 +9 +7 +4 +9 +4 +4 +5 +9 +2 +3 +0 +7 +8 +1 +6 +4 +0 +6 +2 +8 +6 +2 +0 +8 +9 +9 +8 +6 +2 +8 +0 +3 +4 +8 +2 +5 +3 +4 +2 +1 +1 +7 +0 +6 +7 +9 +8 +2 +1 +4 +8 +0 +8 +6 +5 +1 +3 +2 +8 +2 +3 +0 +6 +6 +4 +7 +0 +9 +3 +8 +4 +4 +6 +0 +9 +5 +5 +0 +5 +8 +2 +2 +3 +1 +7 +2 +5 +3 +5 +9 +4 +0 +8 +1 +2 +8 +4 +8 +1 +1 +1 +7 +4 +5 +0 +2 +8 +4 +1 +0 +2 +7 +0 +1 +9 +3 +8 +5 +2 +1 +1 +0 +5 +5 +5 +9 +6 +4 +4 +6 +2 +2 +9 +4 +8 +9 +5 +4 +9 +3 +0 +3 +8 +1 +9 +6 +4 +4 +2 +8 +8 +1 +0 +9 +7 +5 +6 +6 +5 +9 +3 +3 +4 +4 +6 +1 +2 +8 +4 +7 +5 +6 +4 +8 +2 +3 +3 +7 +8 +6 +7 +8 +3 +1 +6 +5 +2 +7 +1 +2 +0 +1 +9 +0 +9 +1 +4 +5 +6 +4 +8 +5 +6 +6 +9 +2 +3 +4 +6 +0 +3 +4 +8 +6 +1 +0 +4 +5 +4 +3 +2 +6 +6 +4 +8 +2 +1 +3 +3 +9 +3 +6 +0 +7 +2 +6 +0 +2 +4 +9 +1 +4 +1 +2 +7 +3 +7 +2 +4 +5 +8 +7 +0 +0 +6 +6 +0 +6 +3 +1 +5 +5 +8 +8 +1 +7 +4 +8 +8 +1 +5 +2 +0 +9 +2 +0 +9 +6 +2 +8 +2 +9 +2 +5 +4 +0 +9 +1 +7 +1 +5 +3 +6 +4 +3 +6 +7 +8 +9 +2 +5 +9 +0 +3 +6 +0 +0 +1 +1 +3 +3 +0 +5 +3 +0 +5 +4 +8 +8 +2 +0 +4 +6 +6 +5 +2 +1 +3 +8 +4 +1 +4 +6 +9 +5 +1 +9 +4 +1 +5 +1 +1 +6 +0 +9 +4 +3 +3 +0 +5 +7 +2 +7 +0 +3 +6 +5 +7 +5 +9 +5 +9 +1 +9 +5 +3 +0 +9 +2 +1 +8 +6 +1 +1 +7 +3 +8 +1 +9 +3 +2 +6 +1 +1 +7 +9 +3 +1 +0 +5 +1 +1 +8 +5 +4 +8 +0 +7 +4 +4 +6 +2 +3 +7 +9 +9 +6 +2 +7 +4 +9 +5 +6 +7 +3 +5 +1 +8 +8 +5 +7 +5 +2 +7 +2 +4 +8 +9 +1 +2 +2 +7 +9 +3 +8 +1 +8 +3 +0 +1 +1 +9 +4 +9 +1 +2 +9 +8 +3 +3 +6 +7 +3 +3 +6 +2 +4 +4 +0 +6 +5 +6 +6 +4 +3 +0 +8 +6 +0 +2 +1 +3 +9 +4 +9 +4 +6 +3 +9 +5 +2 +2 +4 +7 +3 +7 +1 +9 +0 +7 +0 +2 +1 +7 +9 +8 +6 +0 +9 +4 +3 +7 +0 +2 +7 +7 +0 +5 +3 +9 +2 +1 +7 +1 +7 +6 +2 +9 +3 +1 +7 +6 +7 +5 +2 +3 +8 +4 +6 +7 +4 +8 +1 +8 +4 +6 +7 +6 +6 +9 +4 +0 +5 +1 +3 +2 +0 +0 +0 +5 +6 +8 +1 +2 +7 +1 +4 +5 +2 +6 +3 +5 +6 +0 +8 +2 +7 +7 +8 +5 +7 +7 +1 +3 +4 +2 +7 +5 +7 +7 +8 +9 +6 +0 +9 +1 +7 +3 +6 +3 +7 +1 +7 +8 +7 +2 +1 +4 +6 +8 +4 +4 +0 +9 +0 +1 +2 +2 +4 +9 +5 +3 +4 +3 +0 +1 +4 +6 +5 +4 +9 +5 +8 +5 +3 +7 +1 +0 +5 +0 +7 +9 +2 +2 +7 +9 +6 +8 +9 +2 +5 +8 +9 +2 +3 +5 +4 +2 +0 +1 +9 +9 +5 +6 +1 +1 +2 +1 +2 +9 +0 +2 +1 +9 +6 +0 +8 +6 +4 +0 +3 +4 +4 +1 +8 +1 +5 +9 +8 +1 +3 +6 +2 +9 +7 +7 +4 +7 +7 +1 +3 +0 +9 +9 +6 +0 +5 +1 +8 +7 +0 +7 +2 +1 +1 +3 +4 +9 +9 +9 +9 +9 +9 +8 +3 +7 +2 +9 +7 +8 +0 +4 +9 +9 +5 +1 +0 +5 +9 +7 +3 +1 +7 +3 +2 +8 +1 +6 +0 +9 +6 +3 +1 +8 +5 diff --git a/tests/3-ir-gen/answers/lv3/complex2.in b/tests/3-ir-gen/answers/lv3/complex2.in new file mode 100644 index 0000000..ba6e481 --- /dev/null +++ b/tests/3-ir-gen/answers/lv3/complex2.in @@ -0,0 +1,10 @@ +9 +8 +7 +6 +5 +4 +3 +2 +1 +0 diff --git a/tests/3-ir-gen/answers/lv3/complex2.out b/tests/3-ir-gen/answers/lv3/complex2.out new file mode 100644 index 0000000..8b1acc1 --- /dev/null +++ b/tests/3-ir-gen/answers/lv3/complex2.out @@ -0,0 +1,10 @@ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 diff --git a/tests/3-ir-gen/answers/lv3/complex3.in b/tests/3-ir-gen/answers/lv3/complex3.in new file mode 100644 index 0000000..50a3a30 --- /dev/null +++ b/tests/3-ir-gen/answers/lv3/complex3.in @@ -0,0 +1,2 @@ +78 +117 diff --git a/tests/3-ir-gen/answers/lv3/complex3.out b/tests/3-ir-gen/answers/lv3/complex3.out new file mode 100644 index 0000000..a272009 --- /dev/null +++ b/tests/3-ir-gen/answers/lv3/complex3.out @@ -0,0 +1 @@ +39 diff --git a/tests/3-ir-gen/answers/lv3/complex4.out b/tests/3-ir-gen/answers/lv3/complex4.out new file mode 100644 index 0000000..b8136f4 --- /dev/null +++ b/tests/3-ir-gen/answers/lv3/complex4.out @@ -0,0 +1,3 @@ +1.000000 +-0.200000 +0.400000 diff --git a/tests/3-ir-gen/eval.py b/tests/3-ir-gen/eval.py new file mode 100755 index 0000000..ca9c246 --- /dev/null +++ b/tests/3-ir-gen/eval.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python3 +import subprocess +# 17 +lv0_1 = { + "return": (3, False), + "decl_int": (2, False), + "decl_float": (2, False), + "decl_int_array": (2, False), + "decl_float_array": (2, False), + "input": (2, True), + "output_float": (2, False), + "output_int": (2, False), +} + +# 18 +lv0_2 = { + "num_add_int": (0.5, False), + "num_sub_int": (0.5, False), + "num_mul_int": (0.5, False), + "num_div_int": (0.5, False), + "num_add_float": (0.5, False), + "num_sub_float": (0.5, False), + "num_mul_float": (0.5, False), + "num_div_float": (0.5, False), + "num_add_mixed": (0.5, False), + "num_sub_mixed": (0.5, False), + "num_mul_mixed": (0.5, False), + "num_div_mixed": (0.5, False), + "num_comp1": (1.5, False), + "num_le_int": (0.5, False), + "num_lt_int": (0.5, False), + "num_ge_int": (0.5, False), + "num_gt_int": (0.5, False), + "num_eq_int": (0.5, False), + "num_neq_int": (0.5, False), + "num_le_float": (0.5, False), + "num_lt_float": (0.5, False), + "num_ge_float": (0.5, False), + "num_gt_float": (0.5, False), + "num_eq_float": (0.5, False), + "num_neq_float": (0.5, False), + "num_le_mixed": (0.5, False), + "num_lt_mixed": (0.5, False), + "num_ge_mixed": (0.5, False), + "num_gt_mixed": (0.5, False), + "num_eq_mixed": (0.5, False), + "num_neq_mixed": (0.5, False), + "num_comp2": (1.5, False), +} + +# 31 +lv1 = { + "assign_int_var_local": (1, False), + "assign_int_array_local": (2, False), + "assign_int_var_global": (1, False), + "assign_int_array_global": (2, False), + "assign_float_var_local": (1, False), + "assign_float_array_local": (2, False), + "assign_float_var_global": (1, False), + "assign_float_array_global": (2, False), + "assign_cmp": (1, False), + "innout": (1, True), + "idx_float": (1, False), + "negidx_int": (1, False), + "negidx_float": (1, False), + "negidx_intfuncall": (1, False), + "negidx_floatfuncall": (1, False), + "negidx_voidfuncall": (1, False), + "selection1": (1.5, False), + "selection2": (1.5, False), + "selection3": (1.5, False), + "iteration1": (1.5, False), + "iteration2": (1.5, False), + "scope": (1.5, False), + "transfer_float_to_int": (1, False), + "transfer_int_to_float": (1, False), +} + +# 23 +lv2 = { + "funcall_chain": (2, False), + "assign_chain": (2, False), + "funcall_var": (2, False), + "funcall_int_array": (2, False), + "funcall_float_array": (2, False), + "funcall_array_array": (2, False), + "return_in_middle1": (2, False), + "return_in_middle2": (2, False), + "funcall_type_mismatch1": (2, False), + "funcall_type_mismatch2": (2, False), + "return_type_mismatch1": (1.5, False), + "return_type_mismatch2": (1.5, False), +} + +# 11 +lv3 = { + "complex1": (3, False), + "complex2": (3, True), + "complex3": (2, True), + "complex4": (3, False), +} + +suite = [ + ("lv0_1", lv0_1, 0), + ("lv0_2", lv0_2, 0), + ("lv1", lv1, 0), + ("lv2", lv2, 0), + ("lv3", lv3, 0) +] + + +def eval(): + f = open("eval_result", 'w') + EXE_PATH = "../../build/cminusfc" + TEST_BASE_PATH = "./testcases/" + ANSWER_BASE_PATH = "./answers/" + total_points = 0 + for level in suite: + lv_points = 0 + has_bonus = True + level_name = level[0] + bonus = level[2] + cases = level[1] + f.write('===========%s START========\n' % level_name) + for case in cases: + f.write('%s:' % case) + TEST_PATH = TEST_BASE_PATH + level_name + "/" + case + ANSWER_PATH = ANSWER_BASE_PATH + level_name + "/" + case + score = cases[case][0] + need_input = cases[case][1] + + COMMAND = [TEST_PATH] + + try: + result = subprocess.run([EXE_PATH, TEST_PATH + ".cminus"], stderr=subprocess.PIPE, timeout=1) + except Exception as _: + f.write('\tFail\n') + continue + + if result.returncode == 0: + input_option = None + if need_input: + with open(ANSWER_PATH + ".in", "rb") as fin: + input_option = fin.read() + + try: + result = subprocess.run(COMMAND, input=input_option, stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=1) + with open(ANSWER_PATH + ".out", "rb") as fout: + if result.stdout == fout.read(): + f.write('\tSuccess\n') + lv_points += score + else: + f.write('\tFail\n') + has_bonus = False + except Exception as _: + f.write('\tFail\n') + has_bonus = False + finally: + subprocess.call(["rm", "-rf", TEST_PATH, TEST_PATH + ".o"]) + + else: + f.write('\tFail\n') + has_bonus = False + + if has_bonus: + lv_points += bonus + + total_points += lv_points + f.write('points of %s is: %d\n' % (level_name, lv_points)) + f.write('===========%s END========\n\n' % level_name) + f.write('total points: %d\n' % total_points) + + +if __name__ == "__main__": + eval() diff --git a/tests/3-ir-gen/testcases/lv0_1/decl_float.cminus b/tests/3-ir-gen/testcases/lv0_1/decl_float.cminus new file mode 100644 index 0000000..61949df --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_1/decl_float.cminus @@ -0,0 +1,4 @@ +void main(void) { + float a; + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_1/decl_float_array.cminus b/tests/3-ir-gen/testcases/lv0_1/decl_float_array.cminus new file mode 100644 index 0000000..bd28952 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_1/decl_float_array.cminus @@ -0,0 +1,4 @@ +void main(void) { + float a[10]; + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_1/decl_int.cminus b/tests/3-ir-gen/testcases/lv0_1/decl_int.cminus new file mode 100644 index 0000000..b4f1e34 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_1/decl_int.cminus @@ -0,0 +1,4 @@ +void main(void) { + int a; + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_1/decl_int_array.cminus b/tests/3-ir-gen/testcases/lv0_1/decl_int_array.cminus new file mode 100644 index 0000000..249926a --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_1/decl_int_array.cminus @@ -0,0 +1,4 @@ +void main(void) { + int a[10]; + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_1/input.cminus b/tests/3-ir-gen/testcases/lv0_1/input.cminus new file mode 100644 index 0000000..6c1ef31 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_1/input.cminus @@ -0,0 +1,4 @@ +void main(void) { + input(); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_1/output_float.cminus b/tests/3-ir-gen/testcases/lv0_1/output_float.cminus new file mode 100644 index 0000000..deef7f7 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_1/output_float.cminus @@ -0,0 +1,4 @@ +void main(void) { + outputFloat(123.4); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_1/output_int.cminus b/tests/3-ir-gen/testcases/lv0_1/output_int.cminus new file mode 100644 index 0000000..c135600 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_1/output_int.cminus @@ -0,0 +1,4 @@ +void main(void) { + output(1234); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_1/return.cminus b/tests/3-ir-gen/testcases/lv0_1/return.cminus new file mode 100644 index 0000000..9d1948a --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_1/return.cminus @@ -0,0 +1,3 @@ +void main(void) { + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_add_float.cminus b/tests/3-ir-gen/testcases/lv0_2/num_add_float.cminus new file mode 100644 index 0000000..75d9c3e --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_add_float.cminus @@ -0,0 +1,4 @@ +void main(void) { + output(100.0 + 23.4); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_add_int.cminus b/tests/3-ir-gen/testcases/lv0_2/num_add_int.cminus new file mode 100644 index 0000000..026d14d --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_add_int.cminus @@ -0,0 +1,4 @@ +void main(void) { + output(1000 + 234); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_add_mixed.cminus b/tests/3-ir-gen/testcases/lv0_2/num_add_mixed.cminus new file mode 100644 index 0000000..e6f1aa5 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_add_mixed.cminus @@ -0,0 +1,4 @@ +void main(void) { + output(1000 + 23.4); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_comp1.cminus b/tests/3-ir-gen/testcases/lv0_2/num_comp1.cminus new file mode 100644 index 0000000..9cecb1e --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_comp1.cminus @@ -0,0 +1,4 @@ +void main(void) { + outputFloat(9 + 1.2 / (2 * 2 + 5 - 6) * 3.2 - 55); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_comp2.cminus b/tests/3-ir-gen/testcases/lv0_2/num_comp2.cminus new file mode 100644 index 0000000..4aa5fbb --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_comp2.cminus @@ -0,0 +1,7 @@ +void main(void) { + output((1 > 2.) < 3); + output((1 > 2) < ((3 == 4) >= 0)); + output(((3 == 4.) >= 0) <= (4 != 4)); + output(((1 > 2) < ((3 == 4) >= 0)) <= (4. != 4)); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_div_float.cminus b/tests/3-ir-gen/testcases/lv0_2/num_div_float.cminus new file mode 100644 index 0000000..c1c10b4 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_div_float.cminus @@ -0,0 +1,4 @@ +void main(void) { + output(24.68 / 2.); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_div_int.cminus b/tests/3-ir-gen/testcases/lv0_2/num_div_int.cminus new file mode 100644 index 0000000..933a0d8 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_div_int.cminus @@ -0,0 +1,4 @@ +void main(void) { + output(2468 / 2); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_div_mixed.cminus b/tests/3-ir-gen/testcases/lv0_2/num_div_mixed.cminus new file mode 100644 index 0000000..19eba76 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_div_mixed.cminus @@ -0,0 +1,4 @@ +void main(void) { + output(24.68 / 2); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_eq_float.cminus b/tests/3-ir-gen/testcases/lv0_2/num_eq_float.cminus new file mode 100644 index 0000000..68551d2 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_eq_float.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1. == 2.); + output(2. == 2.); + output(3. == 2.); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_eq_int.cminus b/tests/3-ir-gen/testcases/lv0_2/num_eq_int.cminus new file mode 100644 index 0000000..2a0fceb --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_eq_int.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1 == 2); + output(2 == 2); + output(3 == 2); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_eq_mixed.cminus b/tests/3-ir-gen/testcases/lv0_2/num_eq_mixed.cminus new file mode 100644 index 0000000..10a4f12 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_eq_mixed.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1. == 2); + output(2. == 2); + output(3 == 2.); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_ge_float.cminus b/tests/3-ir-gen/testcases/lv0_2/num_ge_float.cminus new file mode 100644 index 0000000..e2eeeea --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_ge_float.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1. >= 2.); + output(2. >= 2.); + output(3. >= 2.); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_ge_int.cminus b/tests/3-ir-gen/testcases/lv0_2/num_ge_int.cminus new file mode 100644 index 0000000..2536fc8 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_ge_int.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1 >= 2); + output(2 >= 2); + output(3 >= 2); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_ge_mixed.cminus b/tests/3-ir-gen/testcases/lv0_2/num_ge_mixed.cminus new file mode 100644 index 0000000..f5a2eba --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_ge_mixed.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1. >= 2); + output(2. >= 2); + output(3 >= 2.); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_gt_float.cminus b/tests/3-ir-gen/testcases/lv0_2/num_gt_float.cminus new file mode 100644 index 0000000..b272fc2 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_gt_float.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1. > 2.); + output(2. > 2.); + output(3. > 2.); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_gt_int.cminus b/tests/3-ir-gen/testcases/lv0_2/num_gt_int.cminus new file mode 100644 index 0000000..e4b6009 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_gt_int.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1 > 2); + output(2 > 2); + output(3 > 2); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_gt_mixed.cminus b/tests/3-ir-gen/testcases/lv0_2/num_gt_mixed.cminus new file mode 100644 index 0000000..c3e6d7c --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_gt_mixed.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1. > 2); + output(2. > 2); + output(3 > 2.); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_le_float.cminus b/tests/3-ir-gen/testcases/lv0_2/num_le_float.cminus new file mode 100644 index 0000000..905440c --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_le_float.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1. <= 2.); + output(2. <= 2.); + output(3. <= 2.); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_le_int.cminus b/tests/3-ir-gen/testcases/lv0_2/num_le_int.cminus new file mode 100644 index 0000000..320bd5b --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_le_int.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1 <= 2); + output(2 <= 2); + output(3 <= 2); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_le_mixed.cminus b/tests/3-ir-gen/testcases/lv0_2/num_le_mixed.cminus new file mode 100644 index 0000000..f29aecf --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_le_mixed.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1. <= 2); + output(2. <= 2); + output(3 <= 2.); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_lt_float.cminus b/tests/3-ir-gen/testcases/lv0_2/num_lt_float.cminus new file mode 100644 index 0000000..a3ccf1b --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_lt_float.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1. < 2.); + output(2. < 2.); + output(3. < 2.); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_lt_int.cminus b/tests/3-ir-gen/testcases/lv0_2/num_lt_int.cminus new file mode 100644 index 0000000..d960064 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_lt_int.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1 < 2); + output(2 < 2); + output(3 < 2); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_lt_mixed.cminus b/tests/3-ir-gen/testcases/lv0_2/num_lt_mixed.cminus new file mode 100644 index 0000000..be28482 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_lt_mixed.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1. < 2); + output(2 < 2.); + output(3. < 2); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_mul_float.cminus b/tests/3-ir-gen/testcases/lv0_2/num_mul_float.cminus new file mode 100644 index 0000000..124e3b1 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_mul_float.cminus @@ -0,0 +1,4 @@ +void main(void) { + output(2. * 61.7); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_mul_int.cminus b/tests/3-ir-gen/testcases/lv0_2/num_mul_int.cminus new file mode 100644 index 0000000..b6e454a --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_mul_int.cminus @@ -0,0 +1,4 @@ +void main(void) { + output(2 * 617); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_mul_mixed.cminus b/tests/3-ir-gen/testcases/lv0_2/num_mul_mixed.cminus new file mode 100644 index 0000000..6195967 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_mul_mixed.cminus @@ -0,0 +1,4 @@ +void main(void) { + output(2 * 61.7); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_neq_float.cminus b/tests/3-ir-gen/testcases/lv0_2/num_neq_float.cminus new file mode 100644 index 0000000..1c0f9fc --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_neq_float.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1. != 2.); + output(2. != 2.); + output(3. != 2.); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_neq_int.cminus b/tests/3-ir-gen/testcases/lv0_2/num_neq_int.cminus new file mode 100644 index 0000000..78020d8 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_neq_int.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1 != 2); + output(2 != 2); + output(3 != 2); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_neq_mixed.cminus b/tests/3-ir-gen/testcases/lv0_2/num_neq_mixed.cminus new file mode 100644 index 0000000..8076ae8 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_neq_mixed.cminus @@ -0,0 +1,6 @@ +void main(void) { + output(1. != 2); + output(2 != 2.); + output(3 != 2.); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_sub_float.cminus b/tests/3-ir-gen/testcases/lv0_2/num_sub_float.cminus new file mode 100644 index 0000000..2f4f89a --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_sub_float.cminus @@ -0,0 +1,4 @@ +void main(void) { + output(200.0 - 7.66); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_sub_int.cminus b/tests/3-ir-gen/testcases/lv0_2/num_sub_int.cminus new file mode 100644 index 0000000..24ef9fc --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_sub_int.cminus @@ -0,0 +1,4 @@ +void main(void) { + output(2000 - 766); + return; +} diff --git a/tests/3-ir-gen/testcases/lv0_2/num_sub_mixed.cminus b/tests/3-ir-gen/testcases/lv0_2/num_sub_mixed.cminus new file mode 100644 index 0000000..1ca099f --- /dev/null +++ b/tests/3-ir-gen/testcases/lv0_2/num_sub_mixed.cminus @@ -0,0 +1,4 @@ +void main(void) { + output(2000 - 76.6); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/assign_cmp.cminus b/tests/3-ir-gen/testcases/lv1/assign_cmp.cminus new file mode 100644 index 0000000..0bc93cf --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/assign_cmp.cminus @@ -0,0 +1,12 @@ +void main(void) { + int a; + int b; + int c; + a = 1 < 3; + b = 2 == 4; + c = 3 > 5; + output(a); + output(b); + output(c); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/assign_float_array_global.cminus b/tests/3-ir-gen/testcases/lv1/assign_float_array_global.cminus new file mode 100644 index 0000000..bd094b1 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/assign_float_array_global.cminus @@ -0,0 +1,6 @@ +float b[10]; +void main(void) { + b[3] = 1234.0; + outputFloat(b[3]); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/assign_float_array_local.cminus b/tests/3-ir-gen/testcases/lv1/assign_float_array_local.cminus new file mode 100644 index 0000000..bbccb00 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/assign_float_array_local.cminus @@ -0,0 +1,6 @@ +void main(void) { + float b[10]; + b[3] = 1234.0; + outputFloat(b[3]); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/assign_float_var_global.cminus b/tests/3-ir-gen/testcases/lv1/assign_float_var_global.cminus new file mode 100644 index 0000000..3890958 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/assign_float_var_global.cminus @@ -0,0 +1,6 @@ +float b; +void main(void) { + b = 1234.0; + outputFloat(b); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/assign_float_var_local.cminus b/tests/3-ir-gen/testcases/lv1/assign_float_var_local.cminus new file mode 100644 index 0000000..fa08600 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/assign_float_var_local.cminus @@ -0,0 +1,6 @@ +void main(void) { + float b; + b = 1234.0; + outputFloat(b); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/assign_int_array_global.cminus b/tests/3-ir-gen/testcases/lv1/assign_int_array_global.cminus new file mode 100644 index 0000000..6251252 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/assign_int_array_global.cminus @@ -0,0 +1,6 @@ +int a[10]; +void main(void) { + a[3] = 1234; + output(a[3]); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/assign_int_array_local.cminus b/tests/3-ir-gen/testcases/lv1/assign_int_array_local.cminus new file mode 100644 index 0000000..283e0d3 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/assign_int_array_local.cminus @@ -0,0 +1,6 @@ +void main(void) { + int a[10]; + a[3] = 1234; + output(a[3]); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/assign_int_var_global.cminus b/tests/3-ir-gen/testcases/lv1/assign_int_var_global.cminus new file mode 100644 index 0000000..ecaa8ad --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/assign_int_var_global.cminus @@ -0,0 +1,6 @@ +int a; +void main(void) { + a = 1234; + output(a); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/assign_int_var_local.cminus b/tests/3-ir-gen/testcases/lv1/assign_int_var_local.cminus new file mode 100644 index 0000000..0b688c8 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/assign_int_var_local.cminus @@ -0,0 +1,6 @@ +void main(void) { + int a; + a = 1234; + output(a); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/idx_float.cminus b/tests/3-ir-gen/testcases/lv1/idx_float.cminus new file mode 100644 index 0000000..f214eac --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/idx_float.cminus @@ -0,0 +1,6 @@ +void main(void) { + int a[10]; + a[0] = 1024; + output(a[0.1]); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/innout.cminus b/tests/3-ir-gen/testcases/lv1/innout.cminus new file mode 100644 index 0000000..eaabfe9 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/innout.cminus @@ -0,0 +1,6 @@ +void main(void) { + int a; + a = input(); + output(a); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/iteration1.cminus b/tests/3-ir-gen/testcases/lv1/iteration1.cminus new file mode 100644 index 0000000..379f27f --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/iteration1.cminus @@ -0,0 +1,9 @@ +void main(void) { + int i; + i = 10; + while (i) { + output(i); + i = i - 1; + } + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/iteration2.cminus b/tests/3-ir-gen/testcases/lv1/iteration2.cminus new file mode 100644 index 0000000..ec17bb3 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/iteration2.cminus @@ -0,0 +1,9 @@ +void main(void) { + int i; + i = 10; + while (i > 0) { + output(i); + i = i - 1; + } + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/negidx_float.cminus b/tests/3-ir-gen/testcases/lv1/negidx_float.cminus new file mode 100644 index 0000000..d450c7f --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/negidx_float.cminus @@ -0,0 +1,5 @@ +void main(void) { + int a[10]; + a[2.-3]; + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/negidx_floatfuncall.cminus b/tests/3-ir-gen/testcases/lv1/negidx_floatfuncall.cminus new file mode 100644 index 0000000..f9bc298 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/negidx_floatfuncall.cminus @@ -0,0 +1,9 @@ +float test(void) { + int a[10]; + a[2-3]; + return 2.; +} +void main(void) { + test(); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/negidx_int.cminus b/tests/3-ir-gen/testcases/lv1/negidx_int.cminus new file mode 100644 index 0000000..37fd99a --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/negidx_int.cminus @@ -0,0 +1,5 @@ +void main(void) { + int a[10]; + a[2-3]; + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/negidx_intfuncall.cminus b/tests/3-ir-gen/testcases/lv1/negidx_intfuncall.cminus new file mode 100644 index 0000000..5de6979 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/negidx_intfuncall.cminus @@ -0,0 +1,9 @@ +int test(void) { + int a[10]; + a[2-3]; + return 2; +} +void main(void) { + test(); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/negidx_voidfuncall.cminus b/tests/3-ir-gen/testcases/lv1/negidx_voidfuncall.cminus new file mode 100644 index 0000000..8ba169d --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/negidx_voidfuncall.cminus @@ -0,0 +1,9 @@ +void test(void) { + int a[10]; + a[2-3]; + return; +} +void main(void) { + test(); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/scope.cminus b/tests/3-ir-gen/testcases/lv1/scope.cminus new file mode 100644 index 0000000..deecaea --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/scope.cminus @@ -0,0 +1,12 @@ +void main(void) { + int a; + a = 3; + output(a); + { + int a; + a = 11; + output(a); + } + output(a); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/selection1.cminus b/tests/3-ir-gen/testcases/lv1/selection1.cminus new file mode 100644 index 0000000..57be8c8 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/selection1.cminus @@ -0,0 +1,8 @@ +void main(void) { + int a; + a = 2; + if (a) + output(42); + output(24); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/selection2.cminus b/tests/3-ir-gen/testcases/lv1/selection2.cminus new file mode 100644 index 0000000..a64a9b7 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/selection2.cminus @@ -0,0 +1,9 @@ +void main(void) { + if (2 > 1) + output(42); + output(24); + if (1 > 2) { + output (1234); + } + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/selection3.cminus b/tests/3-ir-gen/testcases/lv1/selection3.cminus new file mode 100644 index 0000000..73ad4de --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/selection3.cminus @@ -0,0 +1,15 @@ +void main(void) { + if (2 > 1) { + output(42); + } else + output(1234); + + output(24); + + if (2 < 1) + output(42); + else { + output(1234); + } + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/transfer_float_to_int.cminus b/tests/3-ir-gen/testcases/lv1/transfer_float_to_int.cminus new file mode 100644 index 0000000..d431914 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/transfer_float_to_int.cminus @@ -0,0 +1,6 @@ +void main(void){ + int a; + a = 1.0; + output(a); + return; +} diff --git a/tests/3-ir-gen/testcases/lv1/transfer_int_to_float.cminus b/tests/3-ir-gen/testcases/lv1/transfer_int_to_float.cminus new file mode 100644 index 0000000..b50962b --- /dev/null +++ b/tests/3-ir-gen/testcases/lv1/transfer_int_to_float.cminus @@ -0,0 +1,6 @@ +void main(void){ + float a; + a = 1; + outputFloat(a); + return; +} diff --git a/tests/3-ir-gen/testcases/lv2/assign_chain.cminus b/tests/3-ir-gen/testcases/lv2/assign_chain.cminus new file mode 100644 index 0000000..8bac001 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv2/assign_chain.cminus @@ -0,0 +1,10 @@ +void main(void) { + int a; + int b; + int c; + a = b = c = 3; + output(a); + output(b); + output(c); + return; +} diff --git a/tests/3-ir-gen/testcases/lv2/funcall_array_array.cminus b/tests/3-ir-gen/testcases/lv2/funcall_array_array.cminus new file mode 100644 index 0000000..8676065 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv2/funcall_array_array.cminus @@ -0,0 +1,17 @@ +void g(int b[]) { + output(b[3]); + return; +} + +void f(int c[]) { + output(c[3]); + g(c); + return; +} + +void main(void) { + int a[10]; + a[3] = 1024; + f(a); + return; +} diff --git a/tests/3-ir-gen/testcases/lv2/funcall_chain.cminus b/tests/3-ir-gen/testcases/lv2/funcall_chain.cminus new file mode 100644 index 0000000..59ca0b3 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv2/funcall_chain.cminus @@ -0,0 +1,9 @@ +int addone(int a) { + return a + 1; +} +void main(void) { + int result; + result = addone(addone(addone(addone(1230)))); + output(result); + return; +} diff --git a/tests/3-ir-gen/testcases/lv2/funcall_float_array.cminus b/tests/3-ir-gen/testcases/lv2/funcall_float_array.cminus new file mode 100644 index 0000000..ea1c524 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv2/funcall_float_array.cminus @@ -0,0 +1,11 @@ +void test(float a[]) { + output(a[3]); + return; +} + +void main(void) { + float a[10]; + a[3] = 3.14; + test(a); + return; +} diff --git a/tests/3-ir-gen/testcases/lv2/funcall_int_array.cminus b/tests/3-ir-gen/testcases/lv2/funcall_int_array.cminus new file mode 100644 index 0000000..1772fad --- /dev/null +++ b/tests/3-ir-gen/testcases/lv2/funcall_int_array.cminus @@ -0,0 +1,11 @@ +void test(int a[]) { + output(a[3]); + return; +} + +void main(void) { + int a[10]; + a[3] = 10; + test(a); + return; +} diff --git a/tests/3-ir-gen/testcases/lv2/funcall_type_mismatch1.cminus b/tests/3-ir-gen/testcases/lv2/funcall_type_mismatch1.cminus new file mode 100644 index 0000000..68010f2 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv2/funcall_type_mismatch1.cminus @@ -0,0 +1,11 @@ +void f(int a) { + output(a); + return; +} + +void main(void) { + float a; + a = 10; + f(a); + return; +} diff --git a/tests/3-ir-gen/testcases/lv2/funcall_type_mismatch2.cminus b/tests/3-ir-gen/testcases/lv2/funcall_type_mismatch2.cminus new file mode 100644 index 0000000..74c9096 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv2/funcall_type_mismatch2.cminus @@ -0,0 +1,11 @@ +void f(float a) { + outputFloat(a); + return; +} + +void main(void) { + int a; + a = 4.5; + f(a); + return; +} diff --git a/tests/3-ir-gen/testcases/lv2/funcall_var.cminus b/tests/3-ir-gen/testcases/lv2/funcall_var.cminus new file mode 100644 index 0000000..0bc2d84 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv2/funcall_var.cminus @@ -0,0 +1,11 @@ +void test(int a) { + output(a); + return; +} + +void main(void) { + int a; + a = 10; + test(a); + return; +} diff --git a/tests/3-ir-gen/testcases/lv2/return_in_middle1.cminus b/tests/3-ir-gen/testcases/lv2/return_in_middle1.cminus new file mode 100644 index 0000000..41d5821 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv2/return_in_middle1.cminus @@ -0,0 +1,16 @@ +int result(void){ + int i; + if (1) { + i = 1; + return 0; + } else { + i = 2; + } + output(3); + return 3; +} + +void main(void) { + output(result()); + return; +} diff --git a/tests/3-ir-gen/testcases/lv2/return_in_middle2.cminus b/tests/3-ir-gen/testcases/lv2/return_in_middle2.cminus new file mode 100644 index 0000000..70ad39b --- /dev/null +++ b/tests/3-ir-gen/testcases/lv2/return_in_middle2.cminus @@ -0,0 +1,14 @@ +int result(void){ + int i; + i = 10; + while (i > 0) { + return 0; + } + output(4); + return 1; +} + +void main(void) { + output(result()); + return; +} diff --git a/tests/3-ir-gen/testcases/lv2/return_type_mismatch1.cminus b/tests/3-ir-gen/testcases/lv2/return_type_mismatch1.cminus new file mode 100644 index 0000000..ee50ff2 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv2/return_type_mismatch1.cminus @@ -0,0 +1,8 @@ +int f(void) { + return 233.3; +} + +void main(void) { + output(f()); + return; +} diff --git a/tests/3-ir-gen/testcases/lv2/return_type_mismatch2.cminus b/tests/3-ir-gen/testcases/lv2/return_type_mismatch2.cminus new file mode 100644 index 0000000..a59f55f --- /dev/null +++ b/tests/3-ir-gen/testcases/lv2/return_type_mismatch2.cminus @@ -0,0 +1,8 @@ +float f(void) { + return 7; +} + +void main(void) { + outputFloat(f()); + return; +} diff --git a/tests/3-ir-gen/testcases/lv3/complex1.cminus b/tests/3-ir-gen/testcases/lv3/complex1.cminus new file mode 100644 index 0000000..2fcee6c --- /dev/null +++ b/tests/3-ir-gen/testcases/lv3/complex1.cminus @@ -0,0 +1,73 @@ +/* + This code is adopted from Dik T. Winter at CWI + It computes pi to 800 decimal digits + */ + +int mod(int a, int b) { + return a - a / b * b; +} + +void printfour(int input) { + int a; + int b; + int c; + int d; + input = mod(input, 10000); + d = mod(input, 10); + input = input / 10; + c = mod(input, 10); + input = input / 10; + b = mod(input, 10); + input = input / 10; + a = input; + output(a); + output(b); + output(c); + output(d); + return; +} + +void main(void) { + int r[2801]; + int i; + int k; + int b; + int d; + int c; + c = 0; + d = 1234; + + { + int mod; + mod = 0; + while (mod < 2800) { + r[mod] = 2000; + mod = mod + 1; + } + } + + k = 2800; + while (k) { + int d; + d = 0; + i = k; + + while (i != 0) { + d = d + r[i] * 10000; + b = 2 * i - 1; + r[i] = mod(d, b); + d = d / b; + i = i - 1; + if (i != 0) { + d = d * i; + } + } + + printfour(c + d / 10000); + c = mod(d, 10000); + + k = k - 14; + } + + return; +} diff --git a/tests/3-ir-gen/testcases/lv3/complex2.cminus b/tests/3-ir-gen/testcases/lv3/complex2.cminus new file mode 100644 index 0000000..a509742 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv3/complex2.cminus @@ -0,0 +1,54 @@ +/* this is the sample program in C- in the book "Compiler Construction" */ +/* A program to perform selection sort on a 10 element array. */ +float x[10]; +int minloc (float a[], float low, int high ) +{ + int i; + int x; + int k; + k = low; + x = a[low]; + i = low + 1; + while (i < high) { + if (a[i] < x) { + x = a[i]; + k = i; + } + i = i + 1; + } + return k; +} + +void sort(float a[], int low, float high) +{ + int i; + int k; + i = low; + while (i < high - 1) + { + int t; + k = minloc(a, i, high); + t = a[k]; + a[k] = a[i]; + a[i] = t; + i = i + 1; + } + return; +} + +void main(void) +{ + int i; + i = 0; + while ( i < 10) { + x[i] = input(); + i = i + 1; + } + sort(x, 0, 10); + i = 0; + while (i < 10) { + output(x[i]); + i = i + 1; + } + return; +} diff --git a/tests/3-ir-gen/testcases/lv3/complex3.cminus b/tests/3-ir-gen/testcases/lv3/complex3.cminus new file mode 100644 index 0000000..4bf584e --- /dev/null +++ b/tests/3-ir-gen/testcases/lv3/complex3.cminus @@ -0,0 +1,20 @@ +int gcd (int u, int v) { + if (v == 0) return u; + else return gcd(v, u - u / v * v); +} + +void main(void) { + int x; + int y; + int temp; + x = input(); + y = input(); + if (x < y) { + temp = x; + x = y; + y = temp; + } + temp = gcd(x, y); + output(temp); + return; +} diff --git a/tests/3-ir-gen/testcases/lv3/complex4.cminus b/tests/3-ir-gen/testcases/lv3/complex4.cminus new file mode 100644 index 0000000..27b8684 --- /dev/null +++ b/tests/3-ir-gen/testcases/lv3/complex4.cminus @@ -0,0 +1,100 @@ +float get(float a[], int x, int y, int row) { + return a[x * row + y]; +} + +float abs(float x) { + if (x > 0) + return x; + else + return 0 - x; +} + +float isZero(float t) { + return abs(t) < 0.000001; +} + +int gauss(float vars[], float equ[], int var) { + int i; + int j; + int k; + int varone; + int maxr; + int col; + float temp; + varone = var + 1; + + i = 0; + while (i < var) { + vars[i] = 0; + i = i + 1; + } + + col = 0; + k = 0; + while (k < var) { + maxr = k; + i = k + 1; + while (i < var) { + if (abs(get(equ, i, col, varone)) > abs(get(equ, maxr, col, varone))) + maxr = i; + i = i + 1; + } + if (maxr != k) { + j = k; + + while (j < varone) { + temp = get(equ, k, j, varone); + equ[k * varone + j] = get(equ, maxr, j, varone); + equ[maxr * varone + j] = temp; + j = j + 1; + } + } + if (isZero(get(equ, k, col, varone))) { + k = k - 1; + } else { + i = k + 1; + while (i < var) { + if (1 - isZero(get(equ, i, col, varone))) { + temp = get(equ, i, col, varone) / get(equ, k, col, varone); + j = col; + while (j < varone) { + equ[i * varone + j] = equ[i * varone + j] - get(equ, k, j, varone) * temp; + j = j + 1; + } + } + i = i + 1; + } + } + k = k + 1; + col = col + 1; + } + + i = var - 1; + while (i >= 0) { + temp = get(equ, i, var, varone); + j = i + 1; + while (j < var) { + if (1 - isZero(get(equ, i, j, varone))) + temp = temp - get(equ, i, j, varone) * vars[j]; + j = j + 1; + } + vars[i] = temp / get(equ, i, i, varone); + i = i - 1; + } + return 0; +} + +void main(void) { + int num; + float vars[3]; + float equ[12]; + equ[0] = 1; equ[1] = 2; equ[2] = 1; equ[3] = 1; + equ[1 * 4 + 0] = 2; equ[1 * 4 + 1] = 3; equ[1 * 4 + 2] = 4; equ[1 * 4 + 3] = 3; + equ[2 * 4 + 0] = 1; equ[2 * 4 + 1] = 1; equ[2 * 4 + 2] = 0 - 2; equ[2 * 4 + 3] = 0; + gauss(vars, equ, 3); + num = 0; + while (num < 3) { + outputFloat(vars[num]); + num = num + 1; + } +} -- GitLab