added if_statements

This commit is contained in:
Nathan Braswell
2016-01-19 02:06:30 -05:00
parent 458299abe1
commit 4493dfd861
4 changed files with 37 additions and 5 deletions

View File

@@ -363,8 +363,8 @@ obj statement (Object) {
return child == other.child return child == other.child
} }
} }
fun ast_if_statement_ptr(): *ast_node { fun ast_if_statement_ptr(condition: *ast_node): *ast_node {
var to_ret.construct(): if_statement var to_ret.construct(condition): if_statement
var ptr = new<ast_node>() var ptr = new<ast_node>()
ptr->copy_construct(&ast_node::if_statement(to_ret)) ptr->copy_construct(&ast_node::if_statement(to_ret))
return ptr return ptr
@@ -376,12 +376,22 @@ fun is_if_statement(node: *ast_node): bool {
return false return false
} }
obj if_statement (Object) { obj if_statement (Object) {
var condition: *ast_node
// these are not a part of the constructor because they have to be trnasformed with this as its scope
var then_part: *ast_node
var else_part: *ast_node
var scope: map<string, vector<*ast_node>> var scope: map<string, vector<*ast_node>>
fun construct(): *if_statement { fun construct(condition_in: *ast_node): *if_statement {
condition = condition_in
then_part = null<ast_node>()
else_part = null<ast_node>()
scope.construct() scope.construct()
return this return this
} }
fun copy_construct(old: *if_statement) { fun copy_construct(old: *if_statement) {
condition = old->condition
then_part = old->then_part
else_part = old->else_part
scope.copy_construct(&old->scope) scope.copy_construct(&old->scope)
} }
fun destruct() { fun destruct() {
@@ -392,7 +402,7 @@ obj if_statement (Object) {
copy_construct(&other) copy_construct(&other)
} }
fun operator==(other: ref if_statement): bool { fun operator==(other: ref if_statement): bool {
return true return condition == other.condition && then_part == other.then_part && else_part == other.else_part
} }
} }
fun ast_match_statement_ptr(): *ast_node { fun ast_match_statement_ptr(): *ast_node {
@@ -877,7 +887,7 @@ fun get_ast_children(node: *ast_node): vector<*ast_node> {
ast_node::function(backing) return backing.parameters + backing.body_statement ast_node::function(backing) return backing.parameters + backing.body_statement
ast_node::code_block(backing) return backing.children ast_node::code_block(backing) return backing.children
ast_node::statement(backing) return vector<*ast_node>(backing.child) ast_node::statement(backing) return vector<*ast_node>(backing.child)
ast_node::if_statement(backing) return vector<*ast_node>() ast_node::if_statement(backing) return vector(backing.condition, backing.then_part, backing.else_part)
ast_node::match_statement(backing) return vector<*ast_node>() ast_node::match_statement(backing) return vector<*ast_node>()
ast_node::case_statement(backing) return vector<*ast_node>() ast_node::case_statement(backing) return vector<*ast_node>()
ast_node::while_loop(backing) return vector<*ast_node>() ast_node::while_loop(backing) return vector<*ast_node>()

View File

@@ -188,6 +188,8 @@ obj ast_transformation (Object) {
return transform_declaration_statement(node, scope) return transform_declaration_statement(node, scope)
} else if (name == "assignment_statement") { } else if (name == "assignment_statement") {
return transform_assignment_statement(node, scope) return transform_assignment_statement(node, scope)
} else if (name == "if_statement") {
return transform_if_statement(node, scope)
} else if (name == "return_statement") { } else if (name == "return_statement") {
return transform_return_statement(node, scope) return transform_return_statement(node, scope)
} else if (name == "function_call") { } else if (name == "function_call") {
@@ -287,6 +289,17 @@ obj ast_transformation (Object) {
var assignment = ast_assignment_statement_ptr(transform(get_node("factor", node), scope), transform(get_node("boolean_expression", node), scope)) var assignment = ast_assignment_statement_ptr(transform(get_node("factor", node), scope), transform(get_node("boolean_expression", node), scope))
return assignment return assignment
} }
fun transform_if_statement(node: *tree<symbol>, scope: *ast_node): *ast_node {
var if_statement = ast_if_statement_ptr(transform_expression(get_node("boolean_expression", node), scope))
// one variable declarations might be in a code_block-less if statement
add_to_scope("~enclosing_scope", scope, if_statement)
var statements = transform_all(get_nodes("statement", node), if_statement)
if_statement->if_statement.then_part = statements[0]
// we have an else
if (statements.size == 2)
if_statement->if_statement.else_part = statements[1]
return if_statement
}
fun transform_return_statement(node: *tree<symbol>, scope: *ast_node): *ast_node { fun transform_return_statement(node: *tree<symbol>, scope: *ast_node): *ast_node {
return ast_return_statement_ptr(transform(node->children[0], scope)) return ast_return_statement_ptr(transform(node->children[0], scope))
} }

View File

@@ -93,6 +93,12 @@ obj c_generator (Object) {
fun generate_assignment_statement(node: *ast_node): string { fun generate_assignment_statement(node: *ast_node): string {
return generate(node->assignment_statement.to) + " = " + generate(node->assignment_statement.from) return generate(node->assignment_statement.to) + " = " + generate(node->assignment_statement.from)
} }
fun generate_if_statement(node: *ast_node): string {
var if_str = string("if (") + generate(node->if_statement.condition) + ") {\n" + generate(node->if_statement.then_part) + "}"
if (node->if_statement.else_part)
if_str += string(" else {\n") + generate(node->if_statement.else_part) + "}"
return if_str + "\n"
}
fun generate_identifier(node: *ast_node): string { fun generate_identifier(node: *ast_node): string {
return node->identifier.name return node->identifier.name
} }
@@ -133,6 +139,7 @@ obj c_generator (Object) {
ast_node::statement(backing) return generate_statement(node) ast_node::statement(backing) return generate_statement(node)
ast_node::declaration_statement(backing) return generate_declaration_statement(node) ast_node::declaration_statement(backing) return generate_declaration_statement(node)
ast_node::assignment_statement(backing) return generate_assignment_statement(node) ast_node::assignment_statement(backing) return generate_assignment_statement(node)
ast_node::if_statement(backing) return generate_if_statement(node)
ast_node::function(backing) return generate_function(node) ast_node::function(backing) return generate_function(node)
ast_node::function_call(backing) return generate_function_call(node) ast_node::function_call(backing) return generate_function_call(node)
ast_node::code_block(backing) return generate_code_block(node) ast_node::code_block(backing) return generate_code_block(node)

View File

@@ -24,6 +24,8 @@ fun main(): int {
simple_print(yet_another_declaration) simple_print(yet_another_declaration)
simple_print("Hello World!\n") simple_print("Hello World!\n")
simple_print(1337) simple_print(1337)
if (1 + 2 && false) simple_print("its true!")
else simple_print("its false!")
return 0 return 0
} }