Skip to content

Commit 9e7f047

Browse files
author
Allen Short
committed
renovate error handling slightly. tests pass again.
1 parent bbc9728 commit 9e7f047

File tree

4 files changed

+30
-40
lines changed

4 files changed

+30
-40
lines changed

ometa/interp.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,6 @@ def end(self):
6767
self.callback(*x)
6868

6969

70-
def error(self, typ, val, trail=None):
71-
raise ParseError(''.join(self.input.data), typ, val, trail=trail)
72-
7370
## Implementation note: each method, instead of being a function
7471
## returning a value, is a generator that will yield '_feed_me' an
7572
## arbitrary number of times, then finally yield the value of the
@@ -127,7 +124,7 @@ def _apply(self, rule, ruleName, args):
127124

128125
elif isinstance(memoRec, LeftRecursion):
129126
memoRec.detected = True
130-
self.error(None, None)
127+
raise self.input.nullError()
131128
self.input = memoRec[1]
132129
yield memoRec[0]
133130

@@ -188,7 +185,7 @@ def parse_Exactly(self, spec):
188185
if val == c:
189186
self.input = self.input.tail()
190187
else:
191-
self.error(''.join(result), expected(None, wanted))
188+
raise self.err(p.withMessage(expected(None, wanted)))
192189
yield ''.join(result), p
193190

194191

@@ -217,7 +214,7 @@ def parse_Token(self, spec):
217214
if val == c:
218215
self.input = self.input.tail()
219216
else:
220-
self.error(''.join(result), expected(None, wanted))
217+
raise self.err(p.withMessage(expected("token", wanted)))
221218
yield ''.join(result), p
222219

223220

@@ -254,7 +251,7 @@ def parse_Or(self, expr):
254251
except ParseError, err:
255252
errors.append(err)
256253
self.input = i
257-
self.error(*joinErrors(errors))
254+
raise self.err(joinErrors(errors))
258255

259256

260257
def parse_Many(self, expr, ans=None):
@@ -358,7 +355,7 @@ def parse_Not(self, expr):
358355
self.input = m
359356
yield True, self.input.nullError()
360357
else:
361-
self.error(*self.input.nullError())
358+
raise self.err(self.input.nullError())
362359

363360

364361
def parse_Label(self, expr, label_term):
@@ -370,11 +367,11 @@ def parse_Label(self, expr, label_term):
370367
for x in self._eval(expr):
371368
if x is _feed_me:
372369
yield x
373-
self.currentError = x[1]
374-
self.currentError.withMessage([("Custom Exception:", label, None)])
375-
yield x
370+
print "^^", label
371+
self.currentError = x[1].withMessage([("Custom Exception:", label, None)])
372+
yield x[0], self.currentError
376373
except ParseError, e:
377-
raise e.withMessage([("Custom Exception:", label, None)])
374+
raise self.err(e.withMessage([("Custom Exception:", label, None)]))
378375

379376

380377
def parse_Lookahead(self, expr):
@@ -409,7 +406,7 @@ def parse_Predicate(self, expr):
409406
if x is _feed_me: yield x
410407
val, err = x
411408
if not val:
412-
self.error(*err)
409+
raise self.err(err)
413410
else:
414411
yield True, err
415412

@@ -458,7 +455,7 @@ def rule_letter(self):
458455
self.input = self.input.tail()
459456
yield val, p
460457
else:
461-
self.error(val, expected(None, "a letter"))
458+
raise self.err(p.withMessage(expected("letter")))
462459

463460
def rule_digit(self):
464461
"""
@@ -473,8 +470,11 @@ def rule_digit(self):
473470
self.input = self.input.tail()
474471
yield val, p
475472
else:
476-
self.error(val, expected(None, "a digit"))
473+
raise self.err(p.withMessage(expected("digit")))
477474

475+
def err(self, e):
476+
e.input = ''.join(e.input)
477+
raise e
478478

479479
class GrammarInterpreter(object):
480480

ometa/runtime.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ def head(self):
221221
data = self.data.__class__('').join(self.data)
222222
else:
223223
data = self.data
224-
raise EOFError(data, self.position)
224+
raise EOFError(data, self.position + 1)
225225
return self.data[self.position], self.error
226226

227227
def nullError(self, msg=None):

ometa/test/test_pymeta.py

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -828,18 +828,6 @@ def test_label2(self):
828828
e = self.assertRaises(ParseError, g.xs, "xy")
829829
self.assertEqual(e, ParseError(0, 1, expected(label)).withMessage([("Custom Exception:", label, None)]))
830830

831-
def test_caret_position(self):
832-
"""
833-
Custom labels change the 'expected' in the raised exceptions.
834-
"""
835-
g = self.compile("xs = 'x'*")
836-
self.assertEqual(g.xs(""), "")
837-
self.assertEqual(g.xs("x"), "x")
838-
self.assertEqual(g.xs("xxxx"), "xxxx")
839-
g.xs('xy')
840-
self.assertRaises(ParseError, g.xs, "xy")
841-
842-
test_caret_position.todo = 'When ran as a trampolined test, the caret is in the wrong spot'
843831

844832
def test_listConsumedBy(self):
845833
"""
@@ -1121,8 +1109,8 @@ def test_brokenGrammar(self):
11211109
"""
11221110
e = self.assertRaises(ParseError, OMeta.makeGrammar, grammar,
11231111
"Foo")
1124-
self.assertEquals(e.position, 56)
1125-
self.assertEquals(e.error, [("expected", None, "\r\n"), ("message", "end of input")])
1112+
self.assertEquals(e.position, 57)
1113+
self.assertEquals(e.error, [("message", "end of input")])
11261114

11271115

11281116
def test_subclassing(self):
@@ -1293,7 +1281,7 @@ def test_failure(self):
12931281
tree, 'foo', callback=lambda x: setattr(self, 'result', x))
12941282
e = self.assertRaises(ParseError, i.receive, 'foobar')
12951283
self.assertEqual(str(e),
1296-
"\nfoobar\n^\nParse error at line 2, column 0:"
1284+
"\nfoobar\n^\nParse error at line 1, column 0:"
12971285
" expected the character 'a'. trail: []\n")
12981286

12991287

@@ -1559,21 +1547,19 @@ def test_customLabelsFormatting(self):
15591547

15601548
def test_eof(self):
15611549
"""
1562-
Custom labels replace the 'expected' part of the exception.
1550+
EOF should raise a nice error.
15631551
"""
1564-
g = self.compile("""
1552+
import parsley
1553+
g = parsley.makeGrammar("""
15651554
dig = '1' | '2' | '3'
15661555
bits = <dig>+
1567-
""")
1556+
""", {})
15681557

15691558
input = '123x321'
1570-
1571-
e = self.assertRaises(ParseError, g.dig, input)
1559+
e = self.assertRaises(ParseError, g(input).dig)
15721560
self.assertEqual(e.formatError(),
15731561
dedent("""
15741562
123x321
15751563
^
1576-
Parse error at line 1, column 0: expected EOF. trail: []
1564+
Parse error at line 1, column 1: expected EOF. trail: []
15771565
"""))
1578-
1579-
test_eof.todo = 'We need to catch EOF and raise a better exception'

parsley.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from ometa.grammar import OMeta
2-
from ometa.runtime import ParseError, EOFError, OMetaBase
2+
from ometa.runtime import ParseError, EOFError, OMetaBase, expected
33
from terml.parser import parseTerm as term
44
from terml.nodes import termMaker
55
from terml.quasiterm import quasiterm
@@ -82,6 +82,10 @@ def invokeRule(*args, **kwargs):
8282
extra, _ = self._grammar.input.head()
8383
except EOFError:
8484
return ret
85+
else:
86+
# problem is that input remains, so:
87+
err = ParseError(err.input, err.position + 1,
88+
[["message", "expected EOF"]], err.trail)
8589
raise err
8690
return invokeRule
8791

0 commit comments

Comments
 (0)