Browse Source

example driven parser errors

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.6.0
DrSlump 6 years ago
committed by Erez Shinan
parent
commit
e69d567bce
2 changed files with 29 additions and 5 deletions
  1. +28
    -2
      lark/common.py
  2. +1
    -3
      lark/parsers/lalr_parser.py

+ 28
- 2
lark/common.py View File

@@ -17,12 +17,13 @@ class ParseError(Exception):
pass

class UnexpectedToken(ParseError):
def __init__(self, token, expected, seq, index, considered_rules=None):
def __init__(self, token, expected, seq, index, considered_rules=None, state=None):
self.token = token
self.expected = expected
self.line = getattr(token, 'line', '?')
self.column = getattr(token, 'column', '?')
self.considered_rules = considered_rules
self.state = state

try:
context = ' '.join(['%r(%s)' % (t.value, t.type) for t in seq[index:index+5]])
@@ -36,7 +37,32 @@ class UnexpectedToken(ParseError):

super(UnexpectedToken, self).__init__(message)


def match_examples(self, parse_fn, examples):
""" Given a parser instance and a dictionary mapping some label with
some malformed syntax examples, it'll return the label for the
example that bests matches the current error.
"""
if not self.state:
return None

candidate = None
for label,example in examples.items():
if not isinstance(example, (tuple, list)):
example = [example]

for malformed in example:
try:
parse_fn(malformed)
except UnexpectedToken as ut:
if ut.state == self.state:
if ut.token == self.token:
return label
elif not candidate:
candidate = label
except:
pass

return candidate
###}




+ 1
- 3
lark/parsers/lalr_parser.py View File

@@ -2,7 +2,6 @@
"""
# Author: Erez Shinan (2017)
# Email : erezshin@gmail.com

from ..common import UnexpectedToken

from .lalr_analysis import LALR_Analyzer, Shift
@@ -47,8 +46,7 @@ class _Parser:
return states[state][key]
except KeyError:
expected = states[state].keys()

raise UnexpectedToken(token, expected, seq, i)
raise UnexpectedToken(token, expected, seq, i, state=state)

def reduce(rule):
size = len(rule.expansion)


Loading…
Cancel
Save