r500/regs/assembler/fs/__main__.py

39 lines
1.1 KiB
Python

import sys
from assembler.lexer import Lexer, LexerError
from assembler.fs.parser import Parser, ParserError
from assembler.fs.keywords import find_keyword
from assembler.fs.validator import validate_instruction, ValidatorError
from assembler.fs.emitter import emit_instruction
from assembler.error import print_error
def frontend_inner(buf):
lexer = Lexer(buf, find_keyword, emit_newlines=False)
tokens = list(lexer.lex_tokens())
parser = Parser(tokens)
for ins_ast in parser.instructions():
ins = validate_instruction(ins_ast)
code = [0] * 6
emit_instruction(code, ins)
print("\n".join(f"0x{code[i]:08x}," for i in range(6)))
print()
def frontend(filename, buf):
try:
frontend_inner(buf)
except LexerError as e:
print_error(filename, buf, e)
raise
except ParserError as e:
print_error(filename, buf, e)
raise
except ValidatorError as e:
print_error(filename, buf, e)
raise
if __name__ == "__main__":
input_filename = sys.argv[1]
with open(input_filename, 'rb') as f:
buf = f.read()
frontend(input_filename, buf)