diff --git a/scripts/make_exprs.py b/scripts/make_exprs.py index 97ed36f..df4020f 100755 --- a/scripts/make_exprs.py +++ b/scripts/make_exprs.py @@ -4,7 +4,7 @@ from pathlib import Path EXPR_TYPES = { 'Binary': ('left: Expr', 'operator: Token', 'right: Expr'), - 'Grouping': ('expression: Expr'), + 'Grouping': ('expression: Expr',), 'Unary': ('operator: Token', 'right: Expr'), # NOTE: when adding new Literals, add new Literal types, instead of just @@ -18,7 +18,9 @@ def _gen_expr_decls(): res.append(f'pub const {expr_type} = struct {{') for param in expr_params: - res.append(f'{param},') + res.append(f' {param},') + + res.append('};\n') return '\n'.join(res) @@ -28,19 +30,27 @@ def do_base_union(union_name: str): 'const Token = @import("token.zig").Token;\n' ] - res.extend(_gen_expr_decls()) - res.append(f'pub const {union_name} = union {{') + res.append(_gen_expr_decls()) + + res.append(f'pub const {union_name}Type = enum {{') + for expr_type in EXPR_TYPES: + res.append(f' {expr_type},') + res.append('};\n') + + + res.append(f'pub const {union_name} = union({union_name}Type) {{') for expr_type in EXPR_TYPES: - res.append(f'{expr_type}: {expr_type},') + res.append(f' {expr_type}: {expr_type},') - res.append('}\n') + res.append('};\n') return '\n'.join(res) def main(): expr_file = Path('./src') / 'expr.zig' + expr_file.touch() expr_file.unlink() expr_file.write_text(do_base_union('Expr')) diff --git a/src/expr.zig b/src/expr.zig new file mode 100644 index 0000000..e00e76f --- /dev/null +++ b/src/expr.zig @@ -0,0 +1,28 @@ +const Token = @import("token.zig").Token; + +pub const Binary = struct { + left: Expr, + operator: Token, + right: Expr, +}; + +pub const Grouping = struct { + expression: Expr, +}; + +pub const Unary = struct { + operator: Token, + right: Expr, +}; + +pub const ExprType = enum { + Binary, + Grouping, + Unary, +}; + +pub const Expr = union(ExprType) { + Binary: Binary, + Grouping: Grouping, + Unary: Unary, +};