added if_statements
This commit is contained in:
@@ -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>()
|
||||||
|
|||||||
@@ -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))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user