diff --git a/src/parse.py b/src/parse.py index ca1faa7..6f8aede 100644 --- a/src/parse.py +++ b/src/parse.py @@ -52,50 +52,50 @@ return s -# Parses a text syntax node -def parse_text(stream): - buffer = "" - s = read_token(stream, "StartText") - location = s.location - # Parse following tokens - while True: +# The recursive descent parser in a wrapper class for easy testing +class Parser: + # Parses a text syntax node + def parse_text(self, stream): + buffer = "" + s = read_token(stream, "StartText") + location = s.location + # Parse following tokens + while True: + s = read_token(stream, None) + # Don't allow StartText in text + if s.value in ["StartText"]: + raise ParseErrorException(ParseError.FOUND_STARTTEXT, s, None) + # EndText found, end things + elif s.value == "EndText": + break + else: + buffer += s.value + " " + type = SyntaxType.TEXT + value = buffer[:-1] # Drop trailing space + return Syntax(value, location, type) + + # Skip a note + def skip_note(self, stream): + read_token(stream, "StartNote") + while True: + s = read_token(stream, None) + # Don't allow StartNote in notes + if s.value in ["StartNote"]: + raise ParseErrorException(ParseError.FOUND_STARTNOTE, s, None) + # EndNote found, end things + elif s.value == "EndNote": + break + return None + + # Parses a boolean syntax node + def parse_bool(self, stream): s = read_token(stream, None) - # Don't allow StartText in text - if s.value in ["StartText"]: - raise ParseErrorException(ParseError.FOUND_STARTTEXT, s, None) - # EndText found, end things - elif s.value == "EndText": - break + if s.value == "True": + return Syntax(True, s.location, SyntaxType.BOOL) + elif s.value == "False": + return Syntax(False, s.location, SyntaxType.BOOL) else: - buffer += s.value + " " - type = SyntaxType.TEXT - value = buffer[:-1] # Drop trailing space - return Syntax(value, location, type) - - -# Skip a note -def skip_note(stream): - read_token(stream, "StartNote") - while True: - s = read_token(stream, None) - # Don't allow StartNote in notes - if s.value in ["StartNote"]: - raise ParseErrorException(ParseError.FOUND_STARTNOTE, s, None) - # EndNote found, end things - elif s.value == "EndNote": - break - return None - - -# Parses a boolean syntax node -def parse_bool(stream): - s = read_token(stream, None) - if s.value == "True": - return Syntax(True, s.location, SyntaxType.BOOL) - elif s.value == "False": - return Syntax(False, s.location, SyntaxType.BOOL) - else: - raise ParseErrorException(ParseError.NOT_BOOL, s, None) + raise ParseErrorException(ParseError.NOT_BOOL, s, None) # Parses tokens diff --git a/tests/test_parse.py b/tests/test_parse.py index 8711129..0c294e4 100644 --- a/tests/test_parse.py +++ b/tests/test_parse.py @@ -15,10 +15,8 @@ from src.parse import ( ParseError, ParseErrorException, + Parser, parse, - parse_bool, - parse_text, - skip_note, ) from src.syntax import Syntax, SyntaxStream, SyntaxType from tests.test_syntax import ( @@ -115,7 +113,7 @@ def test_parse_text_valid(canary, test_data): (tokens, result) = test_data stream = SyntaxStream(tokens + [canary]) - parsed = parse_text(stream) + parsed = Parser().parse_text(stream) assert parsed is not None assert parsed == result assert stream.pop() == canary @@ -197,7 +195,7 @@ (tokens, error) = test_data stream = SyntaxStream(tokens) try: - parsed = parse_text(stream) + parsed = Parser().parse_text(stream) raise AssertionError("Parsed invalid data: %s" % (parsed)) except ParseErrorException as e: assert e == error @@ -233,7 +231,7 @@ def test_parse_note_valid(canary, test_data): tokens = test_data stream = SyntaxStream(tokens + [canary]) - skipped = skip_note(stream) + skipped = Parser().skip_note(stream) assert skipped is None assert stream.pop() == canary assert stream.pop() is None @@ -300,7 +298,7 @@ (tokens, error) = test_data stream = SyntaxStream(tokens) try: - parsed = skip_note(stream) + parsed = Parser().skip_note(stream) raise AssertionError("Parsed invalid data: %s" % (parsed)) except ParseErrorException as e: assert e == error @@ -327,7 +325,7 @@ def test_parse_bool_valid(canary, test_data): (token, result) = test_data stream = SyntaxStream([token] + [canary]) - parsed = parse_bool(stream) + parsed = Parser().parse_bool(stream) assert parsed is not None assert parsed == result assert stream.pop() == canary @@ -362,7 +360,7 @@ (tokens, error) = test_data stream = SyntaxStream(tokens) try: - parsed = parse_bool(stream) + parsed = Parser().parse_bool(stream) raise AssertionError("Parsed invalid data: %s" % (parsed)) except ParseErrorException as e: assert e == error