partial rollback, might still not work
This commit is contained in:
@@ -9,6 +9,7 @@ import serialize:*
|
||||
import interpreter:*
|
||||
import os:*
|
||||
import ast_transformation:*
|
||||
/*import adt_lower:**/
|
||||
import defer_lower:*
|
||||
import c_line_control:*
|
||||
import c_generator:*
|
||||
@@ -99,6 +100,8 @@ fun main(argc: int, argv: **char):int {
|
||||
var importer.construct(parsers, ast_pass, vector(string(), base_dir + "/stdlib/")): importer
|
||||
importer.import(kraken_file_name)
|
||||
// Passes
|
||||
/*printlnerr("Lowering ADTs")*/
|
||||
/*adt_lower(&importer.name_ast_map, &importer.ast_pass.ast_to_syntax)*/
|
||||
printlnerr("Lowering Defer")
|
||||
defer_lower(&importer.name_ast_map, &importer.ast_pass.ast_to_syntax)
|
||||
if (interpret_instead) {
|
||||
|
||||
@@ -83,8 +83,9 @@ opt_parameter_list = parameter_list | ;
|
||||
parameter_list = parameter_list WS "," WS parameter | parameter ;
|
||||
parameter = boolean_expression ;
|
||||
|
||||
obj_nonterm = "obj" | "uni" ;
|
||||
type_def = obj_nonterm WS identifier WS template_dec WS "{" WS declaration_block WS "}" | obj_nonterm WS identifier WS "{" WS declaration_block WS "}" | obj_nonterm WS identifier WS template_dec WS traits WS "{" WS declaration_block WS "}" | obj_nonterm WS identifier WS traits WS "{" WS declaration_block WS "}" ;
|
||||
def_nonterm = "def" ;
|
||||
obj_nonterm = "obj" ;
|
||||
type_def = def_nonterm WS identifier WS type | obj_nonterm WS identifier WS template_dec WS "{" WS declaration_block WS "}" | obj_nonterm WS identifier WS "{" WS declaration_block WS "}" | obj_nonterm WS identifier WS template_dec WS traits WS "{" WS declaration_block WS "}" | obj_nonterm WS identifier WS traits WS "{" WS declaration_block WS "}" ;
|
||||
|
||||
declaration_block = declaration_statement line_end WS declaration_block | function WS declaration_block | declaration_statement line_end | function | ;
|
||||
traits = "\(" WS trait_list WS "\)" ;
|
||||
|
||||
33
stdlib/adt_lower.krak
Normal file
33
stdlib/adt_lower.krak
Normal file
@@ -0,0 +1,33 @@
|
||||
import symbol:*
|
||||
import tree:*
|
||||
import vector:*
|
||||
import map:*
|
||||
import util:*
|
||||
import string:*
|
||||
import mem:*
|
||||
import io:*
|
||||
import ast_nodes:*
|
||||
import ast_transformation:*
|
||||
|
||||
import pass_common:*
|
||||
|
||||
fun adt_lower(name_ast_map: *map<string, pair<*tree<symbol>,*ast_node>>, ast_to_syntax: *map<*ast_node, *tree<symbol>>) {
|
||||
name_ast_map->for_each(fun(name: string, syntax_ast_pair: pair<*tree<symbol>,*ast_node>) {
|
||||
var helper_before = fun(node: *ast_node, parent_chain: *stack<*ast_node>) {
|
||||
match(*node) {
|
||||
ast_node::adt_def(backing) {
|
||||
println(backing.name + ": entered!")
|
||||
}
|
||||
}
|
||||
}
|
||||
var helper_after = fun(node: *ast_node, parent_chain: *stack<*ast_node>) {
|
||||
match(*node) {
|
||||
ast_node::adt_def(backing) {
|
||||
println(backing.name + ": exited!")
|
||||
}
|
||||
}
|
||||
}
|
||||
run_on_tree(helper_before, helper_after, syntax_ast_pair.second)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -190,10 +190,12 @@ obj identifier (Object) {
|
||||
return name == other.name && type == other.type && enclosing_scope == other.enclosing_scope
|
||||
}
|
||||
}
|
||||
fun ast_type_def_ptr(name: ref string): *ast_node
|
||||
fun ast_type_def_ptr(name: ref string): *ast_node {
|
||||
return ast_type_def_ptr(name, false)
|
||||
}
|
||||
fun ast_type_def_ptr(name: ref string, is_union: bool): *ast_node {
|
||||
var to_ret.construct(name, is_union): type_def
|
||||
/*var to_ret.construct(name, is_union): type_def*/
|
||||
var to_ret.construct(name): type_def
|
||||
var ptr = new<ast_node>()
|
||||
ptr->copy_construct(&ast_node::type_def(to_ret))
|
||||
return ptr
|
||||
@@ -211,10 +213,11 @@ obj type_def (Object) {
|
||||
var self_type: *type
|
||||
var variables: vector<*ast_node>
|
||||
var methods: vector<*ast_node>
|
||||
fun construct(nameIn: ref string, is_unionIn: bool): *type_def {
|
||||
/*fun construct(nameIn: ref string, is_unionIn: bool): *type_def {*/
|
||||
fun construct(nameIn: ref string): *type_def {
|
||||
scope.construct()
|
||||
name.copy_construct(&nameIn)
|
||||
is_union = is_unionIn
|
||||
/*is_union = is_unionIn*/
|
||||
self_type = null<type>()
|
||||
variables.construct()
|
||||
methods.construct()
|
||||
@@ -224,7 +227,7 @@ obj type_def (Object) {
|
||||
self_type = old->self_type
|
||||
scope.copy_construct(&old->scope)
|
||||
name.copy_construct(&old->name)
|
||||
is_union = old->is_union
|
||||
/*is_union = old->is_union*/
|
||||
variables.copy_construct(&old->variables)
|
||||
methods.copy_construct(&old->methods)
|
||||
}
|
||||
@@ -239,7 +242,8 @@ obj type_def (Object) {
|
||||
copy_construct(&other)
|
||||
}
|
||||
fun operator==(other: ref type_def): bool {
|
||||
return name == other.name && is_union == other.is_union && self_type == other.self_type && variables == other.variables && methods == other.methods
|
||||
/*return name == other.name && is_union == other.is_union && self_type == other.self_type && variables == other.variables && methods == other.methods*/
|
||||
return name == other.name && self_type == other.self_type && variables == other.variables && methods == other.methods
|
||||
}
|
||||
}
|
||||
fun ast_adt_def_ptr(name: string): *ast_node {
|
||||
@@ -1133,7 +1137,12 @@ fun get_ast_name(node: *ast_node): string {
|
||||
ast_node::translation_unit(backing) return string("translation_unit: ") + backing.name
|
||||
ast_node::import(backing) return string("import: ") + backing.name + "; [" + backing.imported.reduce(fun(name: string, acc: string): string return acc + " " + name;, string()) + " ]"
|
||||
ast_node::identifier(backing) return string("identifier: ") + backing.name + ": " + backing.type->to_string()
|
||||
ast_node::type_def(backing) return string("type_def: ") + backing.name + " union?:" + backing.is_union
|
||||
ast_node::type_def(backing) {
|
||||
/*if (backing.is_union)*/
|
||||
/*return string("type_def union: ") + backing.name*/
|
||||
/*else*/
|
||||
return string("type_def: ") + backing.name
|
||||
}
|
||||
ast_node::adt_def(backing) return string("adt_def: ") + backing.name
|
||||
ast_node::function(backing) {
|
||||
if (backing.is_extern)
|
||||
|
||||
@@ -104,7 +104,9 @@ obj ast_transformation (Object) {
|
||||
return template
|
||||
} else {
|
||||
// pass in whether or not this is a union
|
||||
var type_def_node = ast_type_def_ptr(name, concat_symbol_tree(get_node("obj_nonterm", child)) == "uni")
|
||||
/*var type_def_node = ast_type_def_ptr(name, concat_symbol_tree(get_node("obj_nonterm", child)) == "uni")*/
|
||||
/*var type_def_node = ast_type_def_ptr(name, false)*/
|
||||
var type_def_node = ast_type_def_ptr(name)
|
||||
type_def_node->type_def.self_type = type_ptr(type_def_node, transform_traits(get_node("traits", child)))
|
||||
ast_to_syntax.set(type_def_node, child)
|
||||
add_to_scope("~enclosing_scope", scope, type_def_node)
|
||||
|
||||
@@ -446,13 +446,13 @@ obj c_generator (Object) {
|
||||
/*var base_name = vert->type_def.name*/
|
||||
var base_name = get_name(vert)
|
||||
plain_typedefs += string("typedef ")
|
||||
if (vert->type_def.is_union) {
|
||||
plain_typedefs += "union "
|
||||
structs += "union "
|
||||
} else {
|
||||
/*if (is_type_def(vert) && vert->type_def.is_union) {*/
|
||||
/*plain_typedefs += "union "*/
|
||||
/*structs += "union "*/
|
||||
/*} else {*/
|
||||
plain_typedefs += "struct "
|
||||
structs += "struct "
|
||||
}
|
||||
/*}*/
|
||||
plain_typedefs += base_name + "_dummy " + base_name + ";\n"
|
||||
structs += base_name + "_dummy {\n"
|
||||
if (is_type_def(vert)) {
|
||||
|
||||
@@ -4,9 +4,9 @@ import mem
|
||||
import serialize
|
||||
import io
|
||||
|
||||
fun to_string(in: bool): string
|
||||
if (in) return string("true")
|
||||
else return string("false")
|
||||
/*fun to_string(in: bool): string*/
|
||||
/*if (in) return string("true")*/
|
||||
/*else return string("false")*/
|
||||
fun to_string(in: uchar): string
|
||||
return to_string_num(in)
|
||||
fun to_string(in: short): string
|
||||
@@ -171,7 +171,7 @@ obj string (Object, Serializable) {
|
||||
}
|
||||
|
||||
fun operator+(integer: int): string return *this + to_string(integer);
|
||||
fun operator+(b: bool): string return *this + to_string(b);
|
||||
/*fun operator+(b: bool): string return *this + to_string(b);*/
|
||||
|
||||
fun operator+(str: *char): string {
|
||||
var newStr.construct(str):string
|
||||
@@ -185,7 +185,7 @@ obj string (Object, Serializable) {
|
||||
}
|
||||
|
||||
fun operator+=(integer: int) *this += to_string(integer);
|
||||
fun operator+=(b: bool) *this += to_string(b);
|
||||
/*fun operator+=(b: bool) *this += to_string(b);*/
|
||||
|
||||
fun operator+=(character: char): void {
|
||||
data += character
|
||||
|
||||
Reference in New Issue
Block a user