diff --git a/include/cminusf_builder.hpp b/include/cminusf_builder.hpp new file mode 100644 index 0000000000000000000000000000000000000000..750dc3acdc347041bfc6eaf784c47fe192bc469f --- /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 e595568acb5e0e71abbe87ee5b2754ddd654cff9..51ccdea1ecc0f77fc3128c6c704d56b3332db4d4 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 0000000000000000000000000000000000000000..ff669ae0eba6aa0728ceac93632c0edfa18036dd --- /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 0000000000000000000000000000000000000000..e4278b2e5c54753d8ea5aa06c309e9eb6020a09a --- /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 0000000000000000000000000000000000000000..09dbe05f45b3c0c23fba0ca427beed09f7b207ba --- /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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 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 0000000000000000000000000000000000000000..b8626c4cff2849624fb67f87cd0ad72b163671ad --- /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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 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 0000000000000000000000000000000000000000..306e815ee0dc74207d8a1e817de0dda839af7bac --- /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 0000000000000000000000000000000000000000..81c545efebe5f57d4cab2ba9ec294c4b0cadf672 --- /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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 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 0000000000000000000000000000000000000000..190a18037c64c43e6b11489df4bf0b9eb6d2c9bf --- /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 0000000000000000000000000000000000000000..81c545efebe5f57d4cab2ba9ec294c4b0cadf672 --- /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 0000000000000000000000000000000000000000..b70608fe859d50b66977fb9a0ed9374877353128 --- /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 0000000000000000000000000000000000000000..216134747c6b49517b32e75225cfedd95ac9dd23 --- /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 0000000000000000000000000000000000000000..d9ff83f194985daf47a3f5f8160f991b8feab351 --- /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 0000000000000000000000000000000000000000..48082f72f087ce7e6fa75b9c41d7387daecd447b --- /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 0000000000000000000000000000000000000000..81c545efebe5f57d4cab2ba9ec294c4b0cadf672 --- /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 0000000000000000000000000000000000000000..48082f72f087ce7e6fa75b9c41d7387daecd447b --- /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 0000000000000000000000000000000000000000..7938dcdde861e064110513be9b948f63d726d024 --- /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 0000000000000000000000000000000000000000..7938dcdde861e064110513be9b948f63d726d024 --- /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 0000000000000000000000000000000000000000..7938dcdde861e064110513be9b948f63d726d024 --- /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 0000000000000000000000000000000000000000..986394f7c0fa05e52a94a3d93dee7085ed84cca4 --- /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 0000000000000000000000000000000000000000..986394f7c0fa05e52a94a3d93dee7085ed84cca4 --- /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 0000000000000000000000000000000000000000..986394f7c0fa05e52a94a3d93dee7085ed84cca4 --- /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 0000000000000000000000000000000000000000..bb5ee5c21ebeadb60f37f55e05206c18a219be58 --- /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 0000000000000000000000000000000000000000..bb5ee5c21ebeadb60f37f55e05206c18a219be58 --- /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 0000000000000000000000000000000000000000..bb5ee5c21ebeadb60f37f55e05206c18a219be58 --- /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 0000000000000000000000000000000000000000..2f1465d1598d82611e4e9081f6a149dcaf57f937 --- /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 0000000000000000000000000000000000000000..2f1465d1598d82611e4e9081f6a149dcaf57f937 --- /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 0000000000000000000000000000000000000000..2f1465d1598d82611e4e9081f6a149dcaf57f937 --- /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 0000000000000000000000000000000000000000..e22493782f088a61eee427426ee46732c94f5238 --- /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 0000000000000000000000000000000000000000..e22493782f088a61eee427426ee46732c94f5238 --- /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 0000000000000000000000000000000000000000..e22493782f088a61eee427426ee46732c94f5238 --- /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 0000000000000000000000000000000000000000..190a18037c64c43e6b11489df4bf0b9eb6d2c9bf --- /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 0000000000000000000000000000000000000000..81c545efebe5f57d4cab2ba9ec294c4b0cadf672 --- /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 0000000000000000000000000000000000000000..190a18037c64c43e6b11489df4bf0b9eb6d2c9bf --- /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 0000000000000000000000000000000000000000..16db301bb512cb809eb9cc31acf34eb98cb19541 --- /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 0000000000000000000000000000000000000000..16db301bb512cb809eb9cc31acf34eb98cb19541 --- /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 0000000000000000000000000000000000000000..16db301bb512cb809eb9cc31acf34eb98cb19541 --- /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 0000000000000000000000000000000000000000..86a0307199419a10492c4e4a044feb9f6580c607 --- /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 0000000000000000000000000000000000000000..81c545efebe5f57d4cab2ba9ec294c4b0cadf672 --- /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 0000000000000000000000000000000000000000..1862496d6f86193d05ecb82454f8f834302b23e4 --- /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 0000000000000000000000000000000000000000..e22493782f088a61eee427426ee46732c94f5238 --- /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 0000000000000000000000000000000000000000..16b42d8960ddee4fe712a0b6c73b9b15eb63c190 --- /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 0000000000000000000000000000000000000000..16b42d8960ddee4fe712a0b6c73b9b15eb63c190 --- /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 0000000000000000000000000000000000000000..16b42d8960ddee4fe712a0b6c73b9b15eb63c190 --- /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 0000000000000000000000000000000000000000..16b42d8960ddee4fe712a0b6c73b9b15eb63c190 --- /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 0000000000000000000000000000000000000000..81c545efebe5f57d4cab2ba9ec294c4b0cadf672 --- /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 0000000000000000000000000000000000000000..81c545efebe5f57d4cab2ba9ec294c4b0cadf672 --- /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 0000000000000000000000000000000000000000..81c545efebe5f57d4cab2ba9ec294c4b0cadf672 --- /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 0000000000000000000000000000000000000000..81c545efebe5f57d4cab2ba9ec294c4b0cadf672 --- /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 0000000000000000000000000000000000000000..d7b1c440c0f3f8d42eff097800b88ac5d40263d3 --- /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 0000000000000000000000000000000000000000..ec635144f60048986bc560c5576355344005e6e7 --- /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 0000000000000000000000000000000000000000..ec635144f60048986bc560c5576355344005e6e7 --- /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 0000000000000000000000000000000000000000..f4c0c86b6fd53583791a06fd72c2e2c67e231bf9 --- /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 0000000000000000000000000000000000000000..f4c0c86b6fd53583791a06fd72c2e2c67e231bf9 --- /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 0000000000000000000000000000000000000000..d01226530903c1342e53189ffd82b4a86392a98d --- /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 0000000000000000000000000000000000000000..d01226530903c1342e53189ffd82b4a86392a98d --- /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 0000000000000000000000000000000000000000..d01226530903c1342e53189ffd82b4a86392a98d --- /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 0000000000000000000000000000000000000000..d01226530903c1342e53189ffd82b4a86392a98d --- /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 0000000000000000000000000000000000000000..d01226530903c1342e53189ffd82b4a86392a98d --- /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 0000000000000000000000000000000000000000..1089b4f241a1b6986fc68fc931515a151ca44dd2 --- /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 0000000000000000000000000000000000000000..be6d407beda8e0edce6c5c577bb020e6bdc94172 --- /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 0000000000000000000000000000000000000000..be6d407beda8e0edce6c5c577bb020e6bdc94172 --- /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 0000000000000000000000000000000000000000..b34401c781e9c1aa80b761d3c1b9d3f6b093444a --- /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 0000000000000000000000000000000000000000..d00491fd7e5bb6fa28c517a0bb32b8b506539d4d --- /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 0000000000000000000000000000000000000000..961b372472a1809353ba4658ea88ca265d88b75c --- /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 0000000000000000000000000000000000000000..1f242fa6f000425d17a7f6c74f77c4908e6b4ef4 --- /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 0000000000000000000000000000000000000000..f599e28b8ab0d8c9c57a486c89c4a5132dcbd3b2 --- /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 0000000000000000000000000000000000000000..f4b3c38237507bd6fbf815484b32f2b924496596 --- /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 0000000000000000000000000000000000000000..81c545efebe5f57d4cab2ba9ec294c4b0cadf672 --- /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 0000000000000000000000000000000000000000..00750edc07d6415dcc07ae0351e9397b0222b7ba --- /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 0000000000000000000000000000000000000000..f599e28b8ab0d8c9c57a486c89c4a5132dcbd3b2 --- /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 0000000000000000000000000000000000000000..f599e28b8ab0d8c9c57a486c89c4a5132dcbd3b2 --- /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 0000000000000000000000000000000000000000..9406425c60fc6c56a6ddcfaec9467d926c62225b --- /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 0000000000000000000000000000000000000000..f599e28b8ab0d8c9c57a486c89c4a5132dcbd3b2 --- /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 0000000000000000000000000000000000000000..573541ac9702dd3969c9bc859d2b91ec1f7e6e56 --- /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 0000000000000000000000000000000000000000..573541ac9702dd3969c9bc859d2b91ec1f7e6e56 --- /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 0000000000000000000000000000000000000000..0c56bea59441a7abdd96a7cfe49438eaf701beb4 --- /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 0000000000000000000000000000000000000000..273675e2a8dfe3d520991c9f6e04d483ab9a32d8 --- /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 0000000000000000000000000000000000000000..b652fb0369622b4422aea4b471a1e30b6994b8ce --- /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 0000000000000000000000000000000000000000..ba6e481592b31ff68ad338a32ff6f4fdff724f12 --- /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 0000000000000000000000000000000000000000..8b1acc12b635c26f3decadeaa251729d3ce512e9 --- /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 0000000000000000000000000000000000000000..50a3a30207190ecbfc3889b758bec1dc4cac547a --- /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 0000000000000000000000000000000000000000..a2720097dccb441015beb4f75766b9908ad46f5a --- /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 0000000000000000000000000000000000000000..b8136f43701c3d6ba46dc1ec64a3ae4d8867bd15 --- /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 0000000000000000000000000000000000000000..ca9c246132233fa7b69c855a147cd534075d71b9 --- /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 0000000000000000000000000000000000000000..61949dfbea293c310dddadffff473ba0d1eb53a7 --- /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 0000000000000000000000000000000000000000..bd2895274d14e525cd98797b54f69c8921f2e4ab --- /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 0000000000000000000000000000000000000000..b4f1e348f4c38dff38af682a7d5be7dc7d53376f --- /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 0000000000000000000000000000000000000000..249926a0c8a34c4a37191343224bbe5909247950 --- /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 0000000000000000000000000000000000000000..6c1ef312529f5a15334fea07427cde39a4706d24 --- /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 0000000000000000000000000000000000000000..deef7f7dd69ac9166df247538c0d7d12cb6ceeed --- /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 0000000000000000000000000000000000000000..c135600b942aa9aaab4330d0c0a9b83afc1cfbfb --- /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 0000000000000000000000000000000000000000..9d1948a388ec93031f06f9ef11e372d493c9e0d6 --- /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 0000000000000000000000000000000000000000..75d9c3e473f2cf7acda0520a90ab0b95159248f3 --- /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 0000000000000000000000000000000000000000..026d14d38f20609d6881f4ddf25bcc95e06d8255 --- /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 0000000000000000000000000000000000000000..e6f1aa5b1fee3b6918bbc4ad2bb88d84865d33f4 --- /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 0000000000000000000000000000000000000000..9cecb1e558012c3a116ce46a1479d23d2d459ca3 --- /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 0000000000000000000000000000000000000000..4aa5fbbfc530a5baa0b5386abd2b220ea773e4c4 --- /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 0000000000000000000000000000000000000000..c1c10b45f9c8729a8b64a82a51197b8e9e62d6ab --- /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 0000000000000000000000000000000000000000..933a0d8204f1e780e9430e819cfe59d9bd32e124 --- /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 0000000000000000000000000000000000000000..19eba765d2dc3fca2d31b980043f7520eb4dd20d --- /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 0000000000000000000000000000000000000000..68551d25451d1feb727776ecc6ec74c4c28da0f0 --- /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 0000000000000000000000000000000000000000..2a0fceb3eb7cc8a5fa46552a4ca2d5e3d8842b33 --- /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 0000000000000000000000000000000000000000..10a4f12060debab4289f960596178a395f945106 --- /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 0000000000000000000000000000000000000000..e2eeeea59f9cde221458e79ff685a98d40c08915 --- /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 0000000000000000000000000000000000000000..2536fc8287478f0e1ad15405feeb7c51e7284634 --- /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 0000000000000000000000000000000000000000..f5a2eba36603bca2380d4be1f3856b3f4a4675f8 --- /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 0000000000000000000000000000000000000000..b272fc2c4393017c3cff72d392ec0a923f893e66 --- /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 0000000000000000000000000000000000000000..e4b6009e04ef54af10e990a19ca36d78884c7259 --- /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 0000000000000000000000000000000000000000..c3e6d7cc89f8f8918e21c6bc8cd137cb93a78bf0 --- /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 0000000000000000000000000000000000000000..905440c0cedb0d2f65c751a4107784d6228c21e0 --- /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 0000000000000000000000000000000000000000..320bd5bef05f010cdf5b814f1f83eae3ec6f4b35 --- /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 0000000000000000000000000000000000000000..f29aecf8f4d943f9a26b707e2971d1d5021368db --- /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 0000000000000000000000000000000000000000..a3ccf1b5b3c6299915dd84ad0cfe8f99114c4072 --- /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 0000000000000000000000000000000000000000..d96006418d5b0d7fb491b866c075e78d71a9149e --- /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 0000000000000000000000000000000000000000..be284822e293d9160b44d1e1dd81c020245366ec --- /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 0000000000000000000000000000000000000000..124e3b1eeeb1404ec10997e07e695b3cc8e9b03e --- /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 0000000000000000000000000000000000000000..b6e454a276b13fbb9e54406b992e1a81e7dff5c1 --- /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 0000000000000000000000000000000000000000..619596753c5c9b877d6cab925bf34889b6c29838 --- /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 0000000000000000000000000000000000000000..1c0f9fcbce5236b05a3782d78d437b6e02400165 --- /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 0000000000000000000000000000000000000000..78020d86a065eccfdec9e39093a9b29a80d5a291 --- /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 0000000000000000000000000000000000000000..8076ae8eba79f80b3216d095cf1e4fc00ad06310 --- /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 0000000000000000000000000000000000000000..2f4f89a7e1f463c39bde3229ce66126b4b159cfd --- /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 0000000000000000000000000000000000000000..24ef9fcaffad11dc0cdb9813670d1aafd1cce45e --- /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 0000000000000000000000000000000000000000..1ca099f65e3f574c81513ef7a48e745fefb5874d --- /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 0000000000000000000000000000000000000000..0bc93cf0fcc947e1482c0b53436e34d713e495ac --- /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 0000000000000000000000000000000000000000..bd094b1a702293dd2aa5fe25dbd90a67adf28653 --- /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 0000000000000000000000000000000000000000..bbccb00383a874ccc0fdab1a2a3843ff81d99935 --- /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 0000000000000000000000000000000000000000..3890958296e438c681d185ce4774168479af250d --- /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 0000000000000000000000000000000000000000..fa08600bde592cb50e80285458fe546bd019b1c6 --- /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 0000000000000000000000000000000000000000..625125290b8ba62656a81e22871ed6e17c0b1565 --- /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 0000000000000000000000000000000000000000..283e0d31b671c855f59b6dfe815c8d6803139afa --- /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 0000000000000000000000000000000000000000..ecaa8ad18aa3ab71d7a0a53d947e494b16d4289e --- /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 0000000000000000000000000000000000000000..0b688c8a7ec0b444f2bb060ad61c40711d9876d1 --- /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 0000000000000000000000000000000000000000..f214eacd2826ef8f722bb60e093d0e0687f3eb1a --- /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 0000000000000000000000000000000000000000..eaabfe999a8f935592f0ed99d3854d9c8ef4bb23 --- /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 0000000000000000000000000000000000000000..379f27fc362db7537eb9c6a968c50225d6f08446 --- /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 0000000000000000000000000000000000000000..ec17bb3e29fdba02618faa6b8f0a9b9c4cab109c --- /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 0000000000000000000000000000000000000000..d450c7f3609a6cc08e6aa40da657ccfc0bc7c7c2 --- /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 0000000000000000000000000000000000000000..f9bc2981b47092b820f11a93dc484af1f4309405 --- /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 0000000000000000000000000000000000000000..37fd99a74bfb261d59bd4fb750332f213fb2c140 --- /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 0000000000000000000000000000000000000000..5de697997fc1bdd76efe9d0aeb26a9f2cfd321a7 --- /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 0000000000000000000000000000000000000000..8ba169dc1bc93feac9320b2d237ed8ef29ce72ea --- /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 0000000000000000000000000000000000000000..deecaea0102d32b7771575e5124d518bbd0ab04b --- /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 0000000000000000000000000000000000000000..57be8c8b7508fff2228b3861a2ec7351924ffb1d --- /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 0000000000000000000000000000000000000000..a64a9b7c63658c502725b2eeb9b6290560aa272b --- /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 0000000000000000000000000000000000000000..73ad4de3485e6fc8376ea44f1bcc8dff31f333dc --- /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 0000000000000000000000000000000000000000..d4319147d54cd83d1b3d6e5c274aff99ffb2ff58 --- /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 0000000000000000000000000000000000000000..b50962ba1e781869cf4b42cbecf972ae33314fbf --- /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 0000000000000000000000000000000000000000..8bac001e9279ca86f2cb74a5e61f77cf944b8aa7 --- /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 0000000000000000000000000000000000000000..86760650aa1d4217293daec6a8907b05474b8e51 --- /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 0000000000000000000000000000000000000000..59ca0b39efe3bb2cc87648a55e59e091a4e33b46 --- /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 0000000000000000000000000000000000000000..ea1c5247b15dae27fcdd7f0cc42473f3f84d21a4 --- /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 0000000000000000000000000000000000000000..1772fad1501a093857a12787dc7bb38b1e5217ab --- /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 0000000000000000000000000000000000000000..68010f21aa22f7233163af2628239bae4ba5606a --- /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 0000000000000000000000000000000000000000..74c9096927a8dbfb8d94c8756b658ef4847fd3cf --- /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 0000000000000000000000000000000000000000..0bc2d84afb53efa8b2e7e1e619e5b4ed26baae30 --- /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 0000000000000000000000000000000000000000..41d5821e809fffde21dcfdf6e48b90f74cf70aa3 --- /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 0000000000000000000000000000000000000000..70ad39b44dd83bdf5749e27e4b9644ab54f940ff --- /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 0000000000000000000000000000000000000000..ee50ff224d211fe29a696c8fc7efa6652f65163c --- /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 0000000000000000000000000000000000000000..a59f55f313372847f6a2a7466757a2467af08f59 --- /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 0000000000000000000000000000000000000000..2fcee6c384e6a38498ce599d6645c57500890d1d --- /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 0000000000000000000000000000000000000000..a50974245815594c3833b51d505bb5cdfe3dccc1 --- /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 0000000000000000000000000000000000000000..4bf584ec0d2c5f6565cca65dfe1191fa971c4473 --- /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 0000000000000000000000000000000000000000..27b868401e5e58d9922baa7b603e0c0755aeb098 --- /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; + } +}