From ffc60f8a0654060a717c2c8e726f89ea6422c2fa Mon Sep 17 00:00:00 2001 From: Nikolaj Date: Mon, 13 Apr 2026 11:07:29 +0200 Subject: [PATCH] :goat: Small fixes --- .gitignore | 3 ++ cent | 112 ++++++++++++++++++++++++++--------------------------- 2 files changed, 59 insertions(+), 56 deletions(-) diff --git a/.gitignore b/.gitignore index 65c6d15..4cf6b7a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,8 @@ __pycache__/ .pytest_cache/ +examples/* +!examples/*.cent + .claude/ CLAUDE.md \ No newline at end of file diff --git a/cent b/cent index c639e8e..0593552 100755 --- a/cent +++ b/cent @@ -1,16 +1,16 @@ -#! /home/nikolaj/.pyenv/shims/python +#! /usr/bin/env python """ Usage: - cent (-h|--help) - cent -i FILE - cent -c [--keep-c] FILE + cent (-h|--help) + cent -i FILE + cent -c [-k|--keep-c] FILE Options: - -h --help Print this help screen - -i Run the interpreter - -c Run the compiler - --keep-c Keep the generated C file alongside the binary - FILE The file to compile/interpret + -h --help Print this help screen + -i Run the interpreter + -c Run the compiler + -k --keep-c Keep the generated C file alongside the binary + FILE The file to compile/interpret """ import os import subprocess @@ -27,56 +27,56 @@ from centvrion.ast_nodes import Program from centvrion.compiler.emitter import compile_program def main(): - args = docopt(__doc__) - file_path = args["FILE"] - with open(file_path, "r", encoding="utf-8") as file_pointer: - program_text = file_pointer.read() + "\n" + args = docopt(__doc__) + file_path = args["FILE"] + with open(file_path, "r", encoding="utf-8") as file_pointer: + program_text = file_pointer.read() + "\n" - lexer = Lexer().get_lexer() - parser = Parser() + lexer = Lexer().get_lexer() + parser = Parser() - try: - tokens = lexer.lex(program_text) - program = parser.parse(tokens) - except LexingError as e: - pos = e.source_pos - char = program_text[pos.idx] if pos.idx < len(program_text) else "?" - sys.exit(f"CENTVRION error: Invalid character {char!r} at line {pos.lineno}, column {pos.colno}") + try: + tokens = lexer.lex(program_text) + program = parser.parse(tokens) + except LexingError as e: + pos = e.source_pos + char = program_text[pos.idx] if pos.idx < len(program_text) else "?" + sys.exit(f"CENTVRION error: Invalid character {char!r} at line {pos.lineno}, column {pos.colno}") - if isinstance(program, Program): - if args["-i"]: - try: - program.eval() - except CentvrionError as e: - sys.exit(f"CENTVRION error: {e}") - else: - c_source = compile_program(program) - runtime_c = os.path.join( - os.path.dirname(__file__), - "centvrion", "compiler", "runtime", "cent_runtime.c" - ) - out_path = os.path.splitext(file_path)[0] - if args["--keep-c"]: - tmp_path = out_path + ".c" - with open(tmp_path, "w") as f: - f.write(c_source) - subprocess.run( - ["gcc", "-O2", tmp_path, runtime_c, "-o", out_path], - check=True, - ) - else: - with tempfile.NamedTemporaryFile(suffix=".c", delete=False, mode="w") as tmp: - tmp.write(c_source) - tmp_path = tmp.name - try: - subprocess.run( - ["gcc", "-O2", tmp_path, runtime_c, "-o", out_path], - check=True, - ) - finally: - os.unlink(tmp_path) + if isinstance(program, Program): + if args["-i"]: + try: + program.eval() + except CentvrionError as e: + sys.exit(f"CENTVRION error: {e}") else: - raise Exception("Output not of type 'Program'", type(program)) + c_source = compile_program(program) + runtime_c = os.path.join( + os.path.dirname(__file__), + "centvrion", "compiler", "runtime", "cent_runtime.c" + ) + out_path = os.path.splitext(file_path)[0] + if args["--keep-c"]: + tmp_path = out_path + ".c" + with open(tmp_path, "w") as f: + f.write(c_source) + subprocess.run( + ["gcc", "-O2", tmp_path, runtime_c, "-o", out_path], + check=True, + ) + else: + with tempfile.NamedTemporaryFile(suffix=".c", delete=False, mode="w") as tmp: + tmp.write(c_source) + tmp_path = tmp.name + try: + subprocess.run( + ["gcc", "-O2", tmp_path, runtime_c, "-o", out_path], + check=True, + ) + finally: + os.unlink(tmp_path) + else: + raise Exception("Output not of type 'Program'", type(program)) if __name__ == "__main__": - main() + main()