diff --git a/main.py b/main.py index d3dd979..7374701 100644 --- a/main.py +++ b/main.py @@ -5,15 +5,25 @@ from time import time from generators import x86_64 from os import system, remove from error import traceback +from argparse import ArgumentParser def main(): - in_path = "test2.grnd" - out_path = "out" - arch = "x86_64" + arg_parser = ArgumentParser(prog="GroundPY", description="A compiler for the Ground Programming Language.") + arg_parser.add_argument("input", help="ground source file path") + arg_parser.add_argument("--output", "-o", default="out", help="output file name") + arg_parser.add_argument("--arch", "-a", default="x86_64", choices=["x86_64"], help="the architecture to compile for") + arg_parser.add_argument("-S", "--save-asm", help="only generate an asm file, don't actually assemble it", action="store_true") + args = arg_parser.parse_args() + in_path = args.input + out_path = args.output + arch = args.arch start = time() - file = open(in_path, "r") + try: + file = open(in_path, "r") + except FileNotFoundError: + traceback("", "fatal", f"no such file or directory \"{in_path}\"") code = file.read() file.close() @@ -23,15 +33,14 @@ def main(): if arch == "x86_64": generator = x86_64.X86_64Generator(ast, code, out_path) - else: - traceback(code, "fatal error", f"unkown architecture \"{arch}\"") generator.init() - system(f"nasm -felf64 {out_path}.asm") - system(f"ld -m elf_{arch} -o {out_path} {out_path}.o") - remove(out_path + ".o") - #remove(out_path + ".asm") + if not args.save_asm: + system(f"nasm -felf64 {out_path}.asm") + system(f"ld -m elf_{arch} -o {out_path} {out_path}.o") + remove(out_path + ".o") + remove(out_path + ".asm") compile_time = time()-start print(f"Compiled in {round(compile_time, 3)} seconds.") diff --git a/out b/out index 4c6a48b..b73af82 100644 Binary files a/out and b/out differ diff --git a/out.asm b/out.asm deleted file mode 100644 index f101d66..0000000 --- a/out.asm +++ /dev/null @@ -1,47 +0,0 @@ -; ~~~ Auto generated by the GroundPY compiler for Linux x86_64 targets. ~~~ - -section .data -LC0: db "yep!", 10, 0 -LC1: equ $ - LC0 -LC2: db "nope...", 10, 0 -LC3: equ $ - LC2 -section .text -global _start -_start: -mov rdi, 1 -mov rsi, 3 -call greater -test eax, eax -jnz .yes -jmp .no -.yes: -mov rsi, LC0 -mov rdx, LC1 -push rdi -mov rax, 1 -mov rdi, 1 -syscall -pop rdi -mov rdi, 0 -mov rax, 60 -syscall -.no: -mov rsi, LC2 -mov rdx, LC3 -push rdi -mov rax, 1 -mov rdi, 1 -syscall -pop rdi -mov rdi, 0 -mov rax, 60 -syscall -greater: -push rbp -mov rbp, rsp -mov rax, rdi -cmp rax, rsi -setg al -movzx eax, al -pop rbp -ret diff --git a/test2.grnd b/test2.grnd index 21ebe6d..af77f5a 100644 --- a/test2.grnd +++ b/test2.grnd @@ -1,17 +1,2 @@ -fun -bool !greater -int &x -int &y - greater $x $y &x - return $x -endfun - -pusharg 1 -pusharg 3 -call !greater &bigger - -if $bigger %yes -jump %no -@yes -stdout "yep!\n" -end 0 -@no -stdout "nope...\n" +stdout "Hello, World!\n" end 0 \ No newline at end of file