Fix/refactor value handling: value strings are now parsed in ast_transformation and re-escaped in c_generator, and used raw in bytecode_generator
This commit is contained in:
@@ -504,9 +504,33 @@ obj ast_transformation (Object) {
|
||||
fun transform_value(node: *tree<symbol>, scope: *ast_node): *ast_node {
|
||||
var value_str = concat_symbol_tree(node)
|
||||
var value_type = null<type>()
|
||||
if (value_str[0] == '"') // " // Comment hack for emacs now
|
||||
if (value_str[0] == '"') { // " // Comment hack for emacs now
|
||||
value_type = type_ptr(base_type::character(), 1)
|
||||
else if (value_str[0] == '\'') //'// lol, comment hack for vim syntax highlighting (my fault, of course)
|
||||
var start = 1
|
||||
var end = value_str.length() -1
|
||||
if (value_str.length() > 3 && value_str[1] == '"' && value_str[2] == '"') {
|
||||
value_str = value_str.slice(3,-4)
|
||||
} else {
|
||||
var new_str.construct(end-start): string
|
||||
var escaped = false
|
||||
for (var i = 1; i < value_str.length()-1; i++;) {
|
||||
if (escaped) {
|
||||
escaped = false
|
||||
if (value_str[i] == 'n')
|
||||
new_str += '\n'
|
||||
else if (value_str[i] == 't')
|
||||
new_str += '\t'
|
||||
else
|
||||
new_str += value_str[i]
|
||||
} else if (value_str[i] == '\\') {
|
||||
escaped = true
|
||||
} else {
|
||||
new_str += value_str[i]
|
||||
}
|
||||
}
|
||||
value_str = new_str
|
||||
}
|
||||
} else if (value_str[0] == '\'') //'// lol, comment hack for vim syntax highlighting (my fault, of course)
|
||||
value_type = type_ptr(base_type::character())
|
||||
else if (value_str == "true" || value_str == "false")
|
||||
value_type = type_ptr(base_type::boolean())
|
||||
|
||||
@@ -577,9 +577,6 @@ obj bytecode_generator (Object) {
|
||||
return generate(node->cast.value)
|
||||
}
|
||||
fun generate_value(node: *ast_node): int {
|
||||
println("generating value " + node->value.string_value)
|
||||
println(node->value.value_type->base == base_type::character())
|
||||
println(node->value.value_type->indirection == 1)
|
||||
if (node->value.value_type->is_bool())
|
||||
return emit_imm((node->value.string_value == "true") cast long)
|
||||
else if (node->value.value_type->base == base_type::character() && node->value.value_type->indirection == 1)
|
||||
|
||||
@@ -291,19 +291,16 @@ obj c_generator (Object) {
|
||||
}
|
||||
fun generate_value(node: *ast_node): string {
|
||||
var value = node->value.string_value
|
||||
if (value[0] != '"')
|
||||
if (node->value.value_type->base != base_type::character() || node->value.value_type->indirection != 1)
|
||||
return value
|
||||
|
||||
var to_ret = string("\"")
|
||||
var triple_quoted = value.slice(0,3) == "\"\"\""
|
||||
if (triple_quoted)
|
||||
value = value.slice(3,-4)
|
||||
else
|
||||
value = value.slice(1,-2)
|
||||
var to_ret = string("\"") //"
|
||||
value.for_each(fun(c: char) {
|
||||
if (c == '\n')
|
||||
to_ret += "\\n"
|
||||
else if (c == '"' && triple_quoted)
|
||||
else if (c == '\\')
|
||||
to_ret += "\\\\"
|
||||
else if (c == '"')
|
||||
to_ret += "\\\""
|
||||
else
|
||||
to_ret += c
|
||||
@@ -373,7 +370,7 @@ obj c_generator (Object) {
|
||||
return "sizeof(" + type_to_c(node->compiler_intrinsic.type_parameters[0]) + ")"
|
||||
} else if (node->compiler_intrinsic.intrinsic == "link") {
|
||||
node->compiler_intrinsic.parameters.for_each(fun(value: *ast_node) {
|
||||
linker_string += string("-l") + value->value.string_value.slice(1,-2) + " "
|
||||
linker_string += string("-l") + value->value.string_value + " "
|
||||
})
|
||||
return string()
|
||||
}
|
||||
|
||||
@@ -108,6 +108,10 @@ obj string (Object, Serializable, Hashable) {
|
||||
data.construct();
|
||||
return this;
|
||||
}
|
||||
fun construct(ammt: int): *string {
|
||||
data.construct(ammt);
|
||||
return this;
|
||||
}
|
||||
fun construct(str: *char): *string {
|
||||
var len = 0
|
||||
while (str[len] != 0) len++
|
||||
|
||||
Reference in New Issue
Block a user