From 3b73978f40c5b198b1769ffc6c67547afe535ec0 Mon Sep 17 00:00:00 2001 From: Luna Date: Fri, 31 May 2019 23:37:45 -0300 Subject: [PATCH] add make_exprs.py script --- scripts/make_exprs.py | 49 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100755 scripts/make_exprs.py diff --git a/scripts/make_exprs.py b/scripts/make_exprs.py new file mode 100755 index 0000000..97ed36f --- /dev/null +++ b/scripts/make_exprs.py @@ -0,0 +1,49 @@ +#!/usr/bin/python3.6 + +from pathlib import Path + +EXPR_TYPES = { + 'Binary': ('left: Expr', 'operator: Token', 'right: Expr'), + 'Grouping': ('expression: Expr'), + 'Unary': ('operator: Token', 'right: Expr'), + + # NOTE: when adding new Literals, add new Literal types, instead of just + # doing Literal with an 'Object value'. it won't work. +} + +def _gen_expr_decls(): + res = [] + + for expr_type, expr_params in EXPR_TYPES.items(): + res.append(f'pub const {expr_type} = struct {{') + + for param in expr_params: + res.append(f'{param},') + + return '\n'.join(res) + + +def do_base_union(union_name: str): + res = [ + 'const Token = @import("token.zig").Token;\n' + ] + + res.extend(_gen_expr_decls()) + res.append(f'pub const {union_name} = union {{') + + for expr_type in EXPR_TYPES: + res.append(f'{expr_type}: {expr_type},') + + res.append('}\n') + + return '\n'.join(res) + + +def main(): + expr_file = Path('./src') / 'expr.zig' + expr_file.unlink() + expr_file.write_text(do_base_union('Expr')) + + +if __name__ == '__main__': + main()