diff --git a/lark/common.py b/lark/common.py index a8f2975..53b6a86 100644 --- a/lark/common.py +++ b/lark/common.py @@ -17,6 +17,8 @@ class UnexpectedToken(ParseError): context = ' '.join(['%r(%s)' % (t.value, t.type) for t in seq[index:index+5]]) except AttributeError: context = seq[index:index+5] + except TypeError: + context = "" message = ("Unexpected token %r at line %s, column %s.\n" "Expected: %s\n" "Context: %s" % (token, self.line, self.column, expected, context)) diff --git a/lark/parsers/lalr_parser.py b/lark/parsers/lalr_parser.py index f87ad7d..313d808 100644 --- a/lark/parsers/lalr_parser.py +++ b/lark/parsers/lalr_parser.py @@ -9,8 +9,9 @@ class Parser(object): for rule in analysis.rules} self.state = self.analysis.init_state_idx - def parse(self, stream, set_state=False): # XXX no set_state - stream = iter(stream) + def parse(self, seq, set_state=False): + i = 0 + stream = iter(seq) states_idx = self.analysis.states_idx state_stack = [self.analysis.init_state_idx] @@ -23,7 +24,7 @@ class Parser(object): except KeyError: expected = states_idx[state].keys() - raise UnexpectedToken(token, expected, [], 0) + raise UnexpectedToken(token, expected, seq, i) def reduce(rule, size): if size: @@ -46,6 +47,7 @@ class Parser(object): # Main LALR-parser loop try: token = next(stream) + i += 1 while True: action, arg = get_action(token.type) @@ -54,6 +56,7 @@ class Parser(object): value_stack.append(token) if set_state: self.state = arg token = next(stream) + i += 1 else: reduce(*arg) except StopIteration: