瀏覽代碼

Restored nice error reports

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.5.1
Erez Shinan 7 年之前
父節點
當前提交
c8e6122148
共有 2 個文件被更改,包括 8 次插入3 次删除
  1. +2
    -0
      lark/common.py
  2. +6
    -3
      lark/parsers/lalr_parser.py

+ 2
- 0
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 = "<no context>"
message = ("Unexpected token %r at line %s, column %s.\n"
"Expected: %s\n"
"Context: %s" % (token, self.line, self.column, expected, context))


+ 6
- 3
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:


Loading…
取消
儲存