From 8d0996fb473ba80996a055b8d00c0aa5d64267f4 Mon Sep 17 00:00:00 2001 From: Nathan Braswell Date: Tue, 19 Apr 2016 18:39:01 -0400 Subject: [PATCH] Added in bitwise operators --- captain.sh | 3 +++ krakenGrammer.kgm | 5 ++++- stdlib/ast_transformation.krak | 3 ++- stdlib/c_generator.krak | 3 ++- stdlib/importer.krak | 4 +--- tests/test_badMath.expected_results | 3 +++ tests/test_badMath.krak | 3 +++ 7 files changed, 18 insertions(+), 6 deletions(-) diff --git a/captain.sh b/captain.sh index c780d68..411b06d 100755 --- a/captain.sh +++ b/captain.sh @@ -54,7 +54,10 @@ else cp deprecated_compiler/build_kraken/kraken/kraken ../${kraken}_bootstrap popd # Now make + mv ./krakenGrammer.kgm krakenGrammer.kgm_new + cp bootstrap_kalypso/krakenGrammer.kgm ./ ./${kraken}_bootstrap kraken.krak ${kraken}_deprecated + mv ./krakenGrammer.kgm_new krakenGrammer.kgm else echo "${kraken}_deprecated exists, calling" fi diff --git a/krakenGrammer.kgm b/krakenGrammer.kgm index 676b201..8f60d21 100644 --- a/krakenGrammer.kgm +++ b/krakenGrammer.kgm @@ -118,7 +118,10 @@ defer_statement = "defer" WS statement ; function_call = unarad WS "\(" WS opt_parameter_list WS "\)" ; boolean_expression = boolean_expression WS "\|\|" WS and_boolean_expression | and_boolean_expression ; -and_boolean_expression = and_boolean_expression WS "&&" WS bool_exp | bool_exp ; +and_boolean_expression = and_boolean_expression WS "&&" WS bitwise_or | bitwise_or ; +bitwise_or = bitwise_or WS "\|" WS bitwise_xor | bitwise_xor ; +bitwise_xor = bitwise_xor WS "^" WS bitwise_and | bitwise_and ; +bitwise_and = bitwise_and WS "&" WS bool_exp | bool_exp ; bool_exp = expression WS comparator WS expression | expression ; comparator = "==" | "<=" | ">=" | "!=" | "<" | ">" ; diff --git a/stdlib/ast_transformation.krak b/stdlib/ast_transformation.krak index 6fc84c5..863a099 100644 --- a/stdlib/ast_transformation.krak +++ b/stdlib/ast_transformation.krak @@ -457,6 +457,7 @@ obj ast_transformation (Object) { } else if (name == "lambda") { return transform_lambda(node, scope, template_replacements) } else if (name == "boolean_expression" || name == "and_boolean_expression" + || name == "bitwise_or" || name == "bitwise_xor" || name == "bitwise_and" || name == "bool_exp" || name == "expression" || name == "shiftand" || name == "term" || name == "factor" || name == "unarad" @@ -1096,7 +1097,7 @@ fun get_builtin_function(name: string, param_types: vector<*type>): *ast_node { return ast_function_ptr(name, type_ptr(param_types, param_types[1]), vector<*ast_node>()) if (name == "[]") return ast_function_ptr(name, type_ptr(param_types, param_types[0]->clone_with_decreased_indirection()), vector<*ast_node>()) - if (name == "&") + if (name == "&" && param_types.size == 1) return ast_function_ptr(name, type_ptr(param_types, param_types[0]->clone_with_increased_indirection()), vector<*ast_node>()) if (name == "\*" && param_types.size == 1) return ast_function_ptr(name, type_ptr(param_types, param_types[0]->clone_with_decreased_indirection()), vector<*ast_node>()) diff --git a/stdlib/c_generator.krak b/stdlib/c_generator.krak index 6193ca7..52fd151 100644 --- a/stdlib/c_generator.krak +++ b/stdlib/c_generator.krak @@ -776,7 +776,8 @@ obj c_generator (Object) { var parameters = node->function_call.parameters if ( parameters.size == 2 && (func_name == "+" || func_name == "-" || func_name == "*" || func_name == "/" || func_name == "<" || func_name == ">" || func_name == "<=" || func_name == ">=" - || func_name == "==" || func_name == "!=" || func_name == "%" + || func_name == "==" || func_name == "!=" || func_name == "%" || func_name == "^" + || func_name == "|" || func_name == "&" )) return code_triple("(") + generate(parameters[0], enclosing_object, enclosing_func, null>>>(), false) + func_name + generate(parameters[1], enclosing_object, enclosing_func, null>>>(), false) + string(")") if ( parameters.size == 2 && (func_name == "||" || func_name == "&&")) { diff --git a/stdlib/importer.krak b/stdlib/importer.krak index 9a95f78..80030e6 100644 --- a/stdlib/importer.krak +++ b/stdlib/importer.krak @@ -101,8 +101,6 @@ obj importer (Object) { // the terminals have " around them, which we have to escape remove_node(symbol("\"\\(\"", true), parse_tree) remove_node(symbol("\"\\)\"", true), parse_tree) - /*remove_node(symbol("\"var\"", true), parse_tree)*/ - // remove_node(symbol("\"fun\"", true), parse_tree) remove_node(symbol("\"template\"", true), parse_tree) remove_node(symbol("\"return\"", true), parse_tree) remove_node(symbol("\"defer\"", true), parse_tree) @@ -119,7 +117,7 @@ obj importer (Object) { remove_node(symbol("def_nonterm", false), parse_tree) remove_node(symbol("obj_nonterm", false), parse_tree) remove_node(symbol("adt_nonterm", false), parse_tree) - remove_node(symbol("\"\\|\"", true), parse_tree) + /*remove_node(symbol("\"\\|\"", true), parse_tree)*/ collapse_node(symbol("case_statement_list", false), parse_tree) collapse_node(symbol("opt_param_assign_list", false), parse_tree) diff --git a/tests/test_badMath.expected_results b/tests/test_badMath.expected_results index ec9ee53..20381cc 100644 --- a/tests/test_badMath.expected_results +++ b/tests/test_badMath.expected_results @@ -6,3 +6,6 @@ We'll find out. 34 woo not false +7 +6 +1 diff --git a/tests/test_badMath.krak b/tests/test_badMath.krak index 6df9422..4caf6ff 100644 --- a/tests/test_badMath.krak +++ b/tests/test_badMath.krak @@ -20,4 +20,7 @@ fun main(): int { if ( z > 20 && !boolean) simple_print::println("woo not") simple_print::println('b' == 'a') + println(3|5) + println(3^5) + println(3&5) }