From 2690bbde5c5cd5ca60ec472c932cba5d6904555b Mon Sep 17 00:00:00 2001 From: Ian Fisher Date: Thu, 13 Dec 2018 16:27:18 -0500 Subject: [PATCH] Print error for data statement after non-data statement Resolves #10 --- hera/typechecker.py | 10 ++++++++++ test/test_typechecker.py | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/hera/typechecker.py b/hera/typechecker.py index 68050d8..a7fd2fa 100644 --- a/hera/typechecker.py +++ b/hera/typechecker.py @@ -8,9 +8,19 @@ from .utils import emit_error, is_symbol, register_to_index +DATA_STATEMENTS = set(["CONSTANT", "DLABEL", "INTEGER", "LP_STRING", "DSKIP"]) + + def typecheck(program): """Type-check the program and emit errors as appropriate.""" + end_of_data = False for op in program: + if not end_of_data: + if op.name not in DATA_STATEMENTS: + end_of_data = True + else: + if op.name in DATA_STATEMENTS: + emit_error("data statement after instruction", line=op.name.line) typecheck_one(op) diff --git a/test/test_typechecker.py b/test/test_typechecker.py index ad1b347..e5695af 100644 --- a/test/test_typechecker.py +++ b/test/test_typechecker.py @@ -677,3 +677,12 @@ def test_typecheck_multiple_errors(): call_args = mock_emit_error.call_args_list[2][0] assert "INC" in call_args[0] assert "too few" in call_args[0] + + +def test_typecheck_data_statement_after_instruction(): + program = [Op("SET", [R("R1"), 42]), Op(SYM("DLABEL"), [SYM("N")])] + + with patch("hera.utils._emit_msg") as mock_emit_error: + typecheck(program) + assert mock_emit_error.call_count == 1 + assert "data statement after instruction" in mock_emit_error.call_args[0][0]