jorts/scripts/make_exprs.py

60 lines
1.3 KiB
Python
Executable File

#!/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},')
res.append('};\n')
return '\n'.join(res)
def do_base_union(union_name: str):
res = [
'const Token = @import("token.zig").Token;\n'
]
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('};\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'))
if __name__ == '__main__':
main()