diff --git a/parse.py b/parse.py index 15391c8..da48b8b 100644 --- a/parse.py +++ b/parse.py @@ -3,6 +3,24 @@ import log +class ParseContext: + def __init__(self, parent, context, token): + self.parent = parent + self.context = context + self.line = token.line + self.column = token.column + + def __repr__(self): + return "ParseContext(parent %s, context '%s', line %i, column %i)" % (self.parent, self.context, self.line, self.column) + +class ParseError(BaseException): + def __init__(self, context, error): + self.context = context + self.error = error + + def __repr__(self): + return "ParseError(context %s, error '%s')" % (self.context, self.error) + class Token: def __init__(self, type, value, line, column): self.type = type @@ -62,6 +80,8 @@ (token, _, _) = self.read_token() while token and token != "EndNote": (token, _, _) = self.read_token() + if not token: + raise ParseError(None, "Hit end of file when reading note") def read_text(self): log.log(log.LEXER, log.TRACE, "Reading characters until EndText") @@ -70,7 +90,7 @@ while token and token != "EndText": (token, _, _) = self.read_token() if not token: - return self.code[start:self.pos] + raise ParseError(None, "Hit end of file when reading text") else: return self.code[start:self.pos - len(" EndText") - 1] @@ -150,24 +170,6 @@ def __repr__(self): return "Conditional(test %s, success %s, failure %s)" % (self.test, self.success, self.failure) -class ParseContext: - def __init__(self, parent, context, token): - self.parent = parent - self.context = context - self.line = token.line - self.column = token.column - - def __repr__(self): - return "ParseContext(parent %s, context '%s', line %i, column %i)" % (self.parent, self.context, self.line, self.column) - -class ParseError(BaseException): - def __init__(self, context, error): - self.context = context - self.error = error - - def __repr__(self): - return "ParseError(context %s, error '%s')" % (self.context, self.error) - class Parser: def __init__(self, tokens): self.tokens = tokens @@ -328,9 +330,9 @@ def parse_file(filename): code = open(filename).read() - tokenizer = Tokenizer(code) - tokens = tokenizer.tokenize() try: + tokenizer = Tokenizer(code) + tokens = tokenizer.tokenize() parser = Parser(tokens) return parser.parse_file() except ParseError as e: