示例#1
0
def main():
    inpt = Path(sys.argv[1])
    if inpt.is_dir():
        input_paths = inpt.glob("*.jack")

        for src in OS_LIB.glob("*.vm"):
            dst = inpt.joinpath(src.name)
            shutil.copy(src, dst)

        for src in EXTRA_OS_LIBS:
            dst = inpt.joinpath(src.name)
            shutil.copy(src, dst)
    else:
        input_paths = [inpt]

    for input_path in input_paths:
        output_path = input_path.parent.joinpath(f"{input_path.stem}.vm")
        lines = (line for line in input_path.read_text().split("\n"))
        # lines = print_gen(lines)
        tokens = gen_tokens_for_lines(lines=lines)
        parser = Parser(tokens)
        cls = parser.parse_class()
        code_generator = CodeGenerator()
        code = code_generator.generate(cls)
        output_path.write_text("\n".join(code))
示例#2
0
def test_expression_with_ops():
    toks = gen_tokens_for_lines(lines=["1 * 2 + 3;"])
    parsed = Parser(toks).parse_expression()
    code_gen = CodeGenerator()
    code = code_gen.generate_expression(parsed)
    assert code == [
        "push constant 1",
        "push constant 2",
        "push constant 3",
        "add",
        "call Math.multiply 2",
    ]
示例#3
0
def test_expression_with_ops_and_fn_call():
    toks = gen_tokens_for_lines(lines=["x + Klass.g(2, y, -z) * 5;"])
    parsed = Parser(toks).parse_expression()
    code_gen = CodeGenerator()
    code_gen._symbol_tables.push_new()
    code_gen._symbol_tables.add("x", TypeInt(), Kind.ARGUMENT)
    code_gen._symbol_tables.add("y", TypeInt(), Kind.ARGUMENT)
    code_gen._symbol_tables.add("z", TypeInt(), Kind.ARGUMENT)
    code = code_gen.generate_expression(parsed)
    assert code == [
        "push argument 0",
        "push constant 2",
        "push argument 1",
        "push argument 2",
        "neg",
        "call Klass.g 3",
        "push constant 5",
        "call Math.multiply 2",
        "add",
    ]
示例#4
0
def test_parser_let(lines):
    toks = gen_tokens_for_lines(lines=lines)
    assert isinstance(Parser(toks).parse_let_statement(), LetStatement)
示例#5
0
def test_parser_expression_with_tail():
    toks = gen_tokens_for_lines(lines=["1 + 1 + 1;"])
    parsed = Parser(toks).parse_expression()
    assert isinstance(parsed.term, ConstantTerm)
    assert all(isinstance(t, ConstantTerm) for _, t in parsed.tail)
    assert all(o.value == "+" for o, _ in parsed.tail)
示例#6
0
def test_parser_expression_unary_term():
    toks = gen_tokens_for_lines(lines=["-1;"])
    parsed = Parser(toks).parse_expression()
    assert isinstance(parsed.term, UnaryOpTerm)
    assert parsed.term.op.value == "-"
示例#7
0
def test_parser_expression_paren_term():
    toks = gen_tokens_for_lines(lines=["(1);"])
    parsed = Parser(toks).parse_expression()
    assert isinstance(parsed.term, ParenTerm)
示例#8
0
def test_gen_tokens_for_lines(lines, expected):
    toks = gen_tokens_for_lines(lines=lines)
    assert list(toks) == expected