Loading LLVMParser.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -229,12 +229,10 @@ void LLVMParser::grammar_callable_declaration() get_current_out() << " @GLOBAL_" << name_token.term.payload << "(" << out_buffer.str() << ") {" << std::endl; grammar_block(); auto& offset = symbols.find("metadata::current_offset").second.offset; if (return_type == DT_INTEGER) get_current_out() << "ret i32 0"; else get_current_out() << "ret double 0.000000e+00"; offset += 2; get_current_out() << std::endl << "}" << std::endl; symbols.pop(); Loading Loading @@ -355,6 +353,7 @@ void LLVMParser::grammar_statement(const std::string& label_next) else get_current_out() << "double"; get_current_out() << " %" << loaded_storage_offset << std::endl; get_next_offset(); } else { // Print the returned value, when we are in the global scope. get_current_out() << "call i32 (i8*, ...) @printf(i8* getelementptr inbounds ("; if (coerced_type == DT_INTEGER) Loading @@ -363,6 +362,7 @@ void LLVMParser::grammar_statement(const std::string& label_next) get_current_out() << "[5 x i8], [5 x i8]* @.print_double, i32 0, i32 0), double %"; get_current_out() << loaded_storage_offset << ")" << std::endl << "ret i32 0" << std::endl; get_next_offset(); } } else { auto name_token = token; Loading Loading @@ -824,7 +824,7 @@ void LLVMParser::grammar_bool_operand( if (token.term.payload == "true") get_current_out() << "br label %" << label_true << std::endl; else get_current_out() << "br label %" << label_true << std::endl; get_current_out() << "br label %" << label_false << std::endl; } else { size_t loaded_storage_offset = grammar_relation_expression(); get_current_out() << "br i1 %" << loaded_storage_offset Loading LLVMParser.hpp +2 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,8 @@ private: void write_label(const std::string& label) { get_current_out() << label << ":" << std::endl; if (symbols.find("metadata::current_offset").second.offset > 1) get_next_offset(); } size_t get_next_offset() { Loading tests/Phase03_LLVMParser.cpp +12 −0 Original line number Diff line number Diff line Loading @@ -361,3 +361,15 @@ TEST(Phase03_LLVMParser, coercionsInt32ToDouble) EXPECT_THROW(string_to_integer(compile_and_run(input)), std::invalid_argument); } } TEST(Phase03_LLVMParser, if) { EXPECT_EQ(1, string_to_integer(compile_and_run("if true then return 1; fi; return 0;"))); EXPECT_EQ(0, string_to_integer(compile_and_run("if false then return 1; fi; return 0;"))); } TEST(Phase03_LLVMParser, ifElse) { EXPECT_EQ(1, string_to_integer(compile_and_run("if true then return 1; else return 0; fi;"))); EXPECT_EQ(0, string_to_integer(compile_and_run("if false then return 1; else return 0; fi;"))); } Loading
LLVMParser.cpp +3 −3 Original line number Diff line number Diff line Loading @@ -229,12 +229,10 @@ void LLVMParser::grammar_callable_declaration() get_current_out() << " @GLOBAL_" << name_token.term.payload << "(" << out_buffer.str() << ") {" << std::endl; grammar_block(); auto& offset = symbols.find("metadata::current_offset").second.offset; if (return_type == DT_INTEGER) get_current_out() << "ret i32 0"; else get_current_out() << "ret double 0.000000e+00"; offset += 2; get_current_out() << std::endl << "}" << std::endl; symbols.pop(); Loading Loading @@ -355,6 +353,7 @@ void LLVMParser::grammar_statement(const std::string& label_next) else get_current_out() << "double"; get_current_out() << " %" << loaded_storage_offset << std::endl; get_next_offset(); } else { // Print the returned value, when we are in the global scope. get_current_out() << "call i32 (i8*, ...) @printf(i8* getelementptr inbounds ("; if (coerced_type == DT_INTEGER) Loading @@ -363,6 +362,7 @@ void LLVMParser::grammar_statement(const std::string& label_next) get_current_out() << "[5 x i8], [5 x i8]* @.print_double, i32 0, i32 0), double %"; get_current_out() << loaded_storage_offset << ")" << std::endl << "ret i32 0" << std::endl; get_next_offset(); } } else { auto name_token = token; Loading Loading @@ -824,7 +824,7 @@ void LLVMParser::grammar_bool_operand( if (token.term.payload == "true") get_current_out() << "br label %" << label_true << std::endl; else get_current_out() << "br label %" << label_true << std::endl; get_current_out() << "br label %" << label_false << std::endl; } else { size_t loaded_storage_offset = grammar_relation_expression(); get_current_out() << "br i1 %" << loaded_storage_offset Loading
LLVMParser.hpp +2 −0 Original line number Diff line number Diff line Loading @@ -72,6 +72,8 @@ private: void write_label(const std::string& label) { get_current_out() << label << ":" << std::endl; if (symbols.find("metadata::current_offset").second.offset > 1) get_next_offset(); } size_t get_next_offset() { Loading
tests/Phase03_LLVMParser.cpp +12 −0 Original line number Diff line number Diff line Loading @@ -361,3 +361,15 @@ TEST(Phase03_LLVMParser, coercionsInt32ToDouble) EXPECT_THROW(string_to_integer(compile_and_run(input)), std::invalid_argument); } } TEST(Phase03_LLVMParser, if) { EXPECT_EQ(1, string_to_integer(compile_and_run("if true then return 1; fi; return 0;"))); EXPECT_EQ(0, string_to_integer(compile_and_run("if false then return 1; fi; return 0;"))); } TEST(Phase03_LLVMParser, ifElse) { EXPECT_EQ(1, string_to_integer(compile_and_run("if true then return 1; else return 0; fi;"))); EXPECT_EQ(0, string_to_integer(compile_and_run("if false then return 1; else return 0; fi;"))); }