diff --git a/src/parse.py b/src/parse.py index b04a3fd..e0ec360 100644 --- a/src/parse.py +++ b/src/parse.py @@ -8,6 +8,7 @@ # Tasks that happen during parsing class ParseTask(enum.Enum): TEST_TASK = enum.auto() # pragma: no mutate + PARSE_NOTE = enum.auto() # pragma: no mutate # Context used for parse error exception @@ -91,12 +92,13 @@ class NoteSkipper: # Skip a note def skip_note(self, stream): - read_token(stream, "StartNote", None) + context = ParseContext(ParseTask.PARSE_NOTE, stream.peek(), None) + read_token(stream, "StartNote", context) while True: - s = read_token(stream, None, None) + s = read_token(stream, None, context) # Don't allow StartNote in notes if s.value in ["StartNote"]: - raise ParseErrorException(ParseError.FOUND_STARTNOTE, s, None, None) + raise ParseErrorException(ParseError.FOUND_STARTNOTE, s, None, context) # EndNote found, end things elif s.value == "EndNote": break diff --git a/tests/parse/test_note.py b/tests/parse/test_note.py index 7acd9d2..84f2142 100644 --- a/tests/parse/test_note.py +++ b/tests/parse/test_note.py @@ -12,8 +12,10 @@ from src.parse import ( NoteSkipper, + ParseContext, ParseError, ParseErrorException, + ParseTask, ) from src.syntax import SyntaxStream, SyntaxType from tests.test_syntax import ( @@ -75,15 +77,17 @@ token = draw(draw_syntax_random()) assume(not (token.type == SyntaxType.TOKEN and token.value == "StartNote")) new_tokens = [token] + tokens[1:0] + context = ParseContext(ParseTask.PARSE_NOTE, new_tokens[0], None) if token.type == SyntaxType.TOKEN: error = ParseErrorException( - ParseError.WRONG_TOKEN, token, "StartNote", None + ParseError.WRONG_TOKEN, token, "StartNote", context ) else: - error = ParseErrorException(ParseError.NOT_TOKEN, token, None, None) + error = ParseErrorException(ParseError.NOT_TOKEN, token, None, context) return (new_tokens, error) else: - error = ParseErrorException(ParseError.NO_TOKEN, None, None, None) + context = ParseContext(ParseTask.PARSE_NOTE, None, None) + error = ParseErrorException(ParseError.NO_TOKEN, None, None, context) return ([], error) @@ -95,7 +99,8 @@ tokens = draw(draw_syntax_note_valid()) start = draw(draw_token_by_value("StartNote")) new_tokens = insert_random(draw, tokens, start) - error = ParseErrorException(ParseError.FOUND_STARTNOTE, start, None, None) + context = ParseContext(ParseTask.PARSE_NOTE, new_tokens[0], None) + error = ParseErrorException(ParseError.FOUND_STARTNOTE, start, None, context) return (new_tokens, error) @@ -105,7 +110,8 @@ @composite def draw_syntax_note_invalid_noendnote(draw): tokens = draw(draw_syntax_note_valid()) - error = ParseErrorException(ParseError.NO_TOKEN, None, None, None) + context = ParseContext(ParseTask.PARSE_NOTE, tokens[0], None) + error = ParseErrorException(ParseError.NO_TOKEN, None, None, context) return (tokens[0:-1], error)