def test_full_program(self):
     pgrm = """
 entry:
   mov 5.0, rans
   mov rans, [rsp + 2]
   add 0, rsp
   call function_fact_5150388492262006291
   sub 0, rsp
 """
     self.assertEqual(parse_rasm(pgrm), [
         Label("entry"),
         Mov(Imm(5), Rans()),
         Mov(Rans(), StackOff(2)),
         Add(Imm(0), Rsp()),
         Call("function_fact_5150388492262006291"),
         Sub(Imm(0), Rsp()),
     ])
 def test_parse_errors(self):
     with self.assertRaises(ParseError):
         parse_rasm("jmp 16")
     with self.assertRaises(ParseError):
         parse_rasm("je add")
     with self.assertRaises(ParseError):
         parse_rasm("jne ]")
     with self.assertRaises(ParseError):
         parse_rasm("mov 2,")
     with self.assertRaises(ParseError):
         parse_rasm("add 3, [rsp + ]")
     with self.assertRaises(ParseError):
         parse_rasm("mov [rsp + 2.3], rans")
     with self.assertRaises(ParseError):
         parse_rasm("cmp ,")
     with self.assertRaises(ParseError):
         parse_rasm("not_an_instr")
 def test_empty(self):
     self.assertEqual(parse_rasm(""), [])
 def test_ret(self):
     self.assertEqual(parse_rasm("ret"), [Ret()])
 def test_print(self):
     self.assertEqual(parse_rasm("print 10"), [Print(Imm(10))])
     self.assertEqual(parse_rasm("print [rsp + 40]"), [Print(StackOff(40))])
 def test_labels(self):
     self.assertEqual(parse_rasm("this_is_a_label:"),
                      [Label("this_is_a_label")])
     self.assertEqual(parse_rasm("a:"), [Label("a")])
 def test_call(self):
     self.assertEqual(parse_rasm("call function_name"),
                      [Call("function_name")])
     self.assertEqual(parse_rasm("call f01"), [Call("f01")])
 def test_jmp(self):
     self.assertEqual(parse_rasm("jmp target_name"), [Jmp("target_name")])
     self.assertEqual(parse_rasm("jmp lbl123"), [Jmp("lbl123")])
 def test_jne(self):
     self.assertEqual(parse_rasm("jne target_name"), [Jne("target_name")])
     self.assertEqual(parse_rasm("jne lbl123"), [Jne("lbl123")])
 def test_mul(self):
     self.assertEqual(parse_rasm("mul 62, rans"), [Mul(Imm(62), Rans())])
     self.assertEqual(parse_rasm("mul rsp, rans"), [Mul(Rsp(), Rans())])
     self.assertEqual(parse_rasm("mul [rsp + 3], [rsp + 1]"),
                      [Mul(StackOff(3), StackOff(1))])
 def test_cmp(self):
     self.assertEqual(parse_rasm("cmp 10, 3"), [Cmp(Imm(10), Imm(3))])
     self.assertEqual(parse_rasm("cmp rans, rsp"), [Cmp(Rans(), Rsp())])
     self.assertEqual(parse_rasm("cmp [rsp + 100], [rsp + 17]"),
                      [Cmp(StackOff(100), StackOff(17))])
 def test_sub(self):
     self.assertEqual(parse_rasm("sub 300, rans"), [Sub(Imm(300), Rans())])
     self.assertEqual(parse_rasm("sub rsp, rans"), [Sub(Rsp(), Rans())])
     self.assertEqual(parse_rasm("sub [rsp + 5], [rsp + 9]"),
                      [Sub(StackOff(5), StackOff(9))])
 def test_add(self):
     self.assertEqual(parse_rasm("add 17, rsp"), [Add(Imm(17), Rsp())])
     self.assertEqual(parse_rasm("add rsp, rsp"), [Add(Rsp(), Rsp())])
     self.assertEqual(parse_rasm("add [rsp + 0], [rsp + 2]"),
                      [Add(StackOff(0), StackOff(2))])
 def test_lexer_errors(self):
     with self.assertRaises(LexError):
         parse_rasm("#@*&$*&#*$&")
     with self.assertRaises(LexError):
         parse_rasm("___")
 def test_mov(self):
     self.assertEqual(parse_rasm("mov 10, rans"), [Mov(Imm(10), Rans())])
     self.assertEqual(parse_rasm("mov rsp, rans"), [Mov(Rsp(), Rans())])
     self.assertEqual(parse_rasm("mov [rsp + 2], [rsp + 8]"),
                      [Mov(StackOff(2), StackOff(8))])
import sys
import argparse
from rasm.VirtualMachine import *
from parsing.parse_rasm import *
from parsing.Parser import ParseError
from parsing.Lexer import LexError
from .util import *

argparser = argparse.ArgumentParser(description="Run a rasm file")
argparser.add_argument('file', type=str, nargs=1, help='a rasm file to run')

args = argparser.parse_args()
filename = args.file[0]

try:
    file = open(filename, "r")
    pgrm = file.read()

    try:
        instrs = parse_rasm(pgrm)
        vm = VirtualMachine()
        vm.execute(instrs)
    except (LexError, ParseError, VMError) as err:
        print(err)
    except Exception as err:
        print(f"InternalError: {err}")
except FileNotFoundError:
    print(f"{filename} not found")