X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=c_generation.py;h=7fc416544f6775089843312f750dc367792003cc;hp=fba8f50aab973c3412024ed4b28b7a98b0b21907;hb=refs%2Fheads%2Fmaster;hpb=c7f381fbcb57ba1b7e33558a28fdb34f31234c07 diff --git a/c_generation.py b/c_generation.py index fba8f50..7fc4165 100644 --- a/c_generation.py +++ b/c_generation.py @@ -22,16 +22,26 @@ 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' +def generate_null_argument_from(argument_count): + def generator(argument): + assert isinstance(argument, int) + assert argument == argument_count + return 'NULL' + return generator + def generate_size_t_argument(argument): assert isinstance(argument, int) 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(')') @@ -40,19 +50,35 @@ def generate_symbol_argument(argument): def generate_argument(instruction): try: return { - 'add': generate_size_t_argument, + '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, - 'call': generate_size_t_argument, - 'idiv': generate_size_t_argument, - 'mod': generate_size_t_argument, - 'mul': generate_size_t_argument, - 'neg': generate_size_t_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), + 'mul': generate_null_argument_from(2), + 'neg': generate_null_argument_from(1), + 'neq': generate_null_argument_from(2), 'pop': generate_symbol_argument, 'push': generate_symbol_argument, 'push_integer': generate_integer_argument, 'push_string': generate_string_argument, - 'sub': generate_size_t_argument, + 'push_symbol': generate_symbol_argument, + 'return': generate_null_argument, + 'structure': generate_integer_argument, + 'sub': generate_null_argument_from(2), }[instruction.instruction](instruction.argument) except KeyError: