Browse Source

Merge branch 'pr_accept' (Containing #129 with corrections)

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.6.0
Erez Shinan 6 years ago
parent
commit
d46318c725
2 changed files with 34 additions and 6 deletions
  1. +33
    -3
      lark/common.py
  2. +1
    -3
      lark/parsers/lalr_parser.py

+ 33
- 3
lark/common.py View File

@@ -1,7 +1,7 @@
import re
import sys

from .utils import get_regexp_width
from .utils import get_regexp_width, STRING_TYPE

Py36 = (sys.version_info[:2] >= (3, 6))

@@ -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,36 @@ 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.
"""
assert self.state, "Not supported for this exception"

candidate = None
for label, example in examples.items():
assert not isinstance(example, STRING_TYPE)

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

return candidate

def get_context(self, text, span=10):
pos = self.token.pos_in_stream
start = max(pos - span, 0)
end = pos + span
before = text[start:pos].rsplit('\n', 1)[-1]
after = text[pos:end].split('\n', 1)[0]
return before + after + '\n' + ' ' * len(before) + '^\n'
###}




+ 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