X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=c_generation.py;h=7fc416544f6775089843312f750dc367792003cc;hp=a1e4e599ad0911dd6cf6612dd25c0156b1dc746c;hb=refs%2Fheads%2Fmaster;hpb=edc05c8d2d465653c02c350592eff62c542a37ed diff --git a/c_generation.py b/c_generation.py index a1e4e59..7fc4165 100644 --- a/c_generation.py +++ b/c_generation.py @@ -22,6 +22,9 @@ def generate_integer_argument(argument): assert isinstance(argument, int) return '(int32_t){}'.format(argument) +def generate_label_argument(argument): + return 'LABEL_{}'.format(argument) + def generate_null_argument(argument): assert argument is None return 'NULL' @@ -38,7 +41,7 @@ def generate_size_t_argument(argument): return '(size_t){}'.format(argument) def generate_string_argument(argument): - return argument + return argument[0] + ''.join('\\"' if ch == '"' else ch for ch in argument[1:-1]) + argument[-1] def generate_symbol_argument(argument): assert argument.startswith('sym(') and argument.endswith(')') @@ -49,12 +52,19 @@ def generate_argument(instruction): return { 'add': generate_null_argument_from(2), 'call': generate_size_t_argument, + 'close': generate_label_argument, + 'concat': generate_integer_argument, 'drop': generate_null_argument, 'end': generate_null_argument, 'eq': generate_null_argument_from(2), + 'field': generate_null_argument_from(2), + 'get': generate_null_argument_from(2), 'gt': generate_null_argument_from(2), 'gte': generate_null_argument_from(2), 'idiv': generate_null_argument_from(2), + 'jump': generate_label_argument, + 'jump_if_false': generate_label_argument, + 'list': generate_integer_argument, 'lt': generate_null_argument_from(2), 'lte': generate_null_argument_from(2), 'mod': generate_null_argument_from(2), @@ -65,6 +75,9 @@ def generate_argument(instruction): 'push': generate_symbol_argument, 'push_integer': generate_integer_argument, 'push_string': generate_string_argument, + 'push_symbol': generate_symbol_argument, + 'return': generate_null_argument, + 'structure': generate_integer_argument, 'sub': generate_null_argument_from(2), }[instruction.instruction](instruction.argument)