Skip to content

Commit 2e97d51

Browse files
committed
Raise specific exception #7
1 parent 44eb93a commit 2e97d51

File tree

4 files changed

+59
-5
lines changed

4 files changed

+59
-5
lines changed

simplepeg/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
from .speg import SPEG
2+
from .exceptions import GrammarParseError, TextParseError

simplepeg/exceptions.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class GrammarParseError(ValueError):
2+
"""Something is wrong with your PEG grammar"""
3+
def __init__(self, message, *args):
4+
self.message = message
5+
super(GrammarParseError, self).__init__(message, *args)
6+
7+
8+
class TextParseError(ValueError):
9+
"""Something is wrong with your text"""
10+
def __init__(self, message, *args):
11+
self.message = message
12+
super(TextParseError, self).__init__(message, *args)

simplepeg/speg.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from . import speg_visitor as sv
22
from . import speg_parser as sp
33
from . import rd_parser as rd
4-
4+
from . import exceptions as ex
55

66
class SPEG(object):
77
def __init__(self):
@@ -15,7 +15,7 @@ def parse_grammar(self, grammar):
1515
if speg_ast:
1616
self.speg_parser = self.visitor.visit(speg_ast)
1717
else:
18-
raise Exception('Failed to parse grammar: \n\n' + self.parser.get_last_error())
18+
raise ex.GrammarParseError('Failed to parse grammar: \n\n' + self.parser.get_last_error())
1919

2020
def parse_text(self, text):
2121
if self.speg_parser:
@@ -27,7 +27,7 @@ def parse_text(self, text):
2727
if ast:
2828
return ast
2929
else:
30-
raise Exception('Failed to parse text: \n\n' + rd.get_last_error(state))
30+
raise ex.TextParseError('Failed to parse text: \n\n' + rd.get_last_error(state))
3131
else:
3232
raise Exception('You need grammar to parse text. Call parseGrammar first')
3333

@@ -44,9 +44,9 @@ def parse(self, grammar, text):
4444
if ast:
4545
return ast
4646
else:
47-
raise Exception('Failed to parse text: \n\n' + rd.get_last_error(state))
47+
raise ex.TextParseError('Failed to parse text: \n\n' + rd.get_last_error(state))
4848
else:
49-
raise Exception('Failed to parse grammar: \n\n' + self.parser.get_last_error())
49+
raise ex.GrammarParseError('Failed to parse grammar: \n\n' + self.parser.get_last_error())
5050

5151

5252
class SimplePegActions(object):
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from unittest import TestCase
2+
3+
from .. import speg as s
4+
5+
6+
class TestSPEGExceptions(TestCase):
7+
def test_grammar_parser_exception(self):
8+
speg = s.SPEG()
9+
try:
10+
speg.parse_grammar('!!!')
11+
except Exception as ex:
12+
self.assertEqual(type(ex).__name__, 'GrammarParseError')
13+
14+
def test_text_parser_exception(self):
15+
speg = s.SPEG()
16+
try:
17+
speg.parse_grammar('GRAMMAR test a -> "A";')
18+
speg.parse_text('B')
19+
except Exception as ex:
20+
self.assertEqual(type(ex).__name__, 'TextParseError')
21+
22+
def test_grammar_before_text(self):
23+
speg = s.SPEG()
24+
try:
25+
speg.parse_text('B')
26+
except Exception as ex:
27+
self.assertEqual(type(ex).__name__, 'Exception')
28+
29+
def test_speg_parse_grammar_parser_exception(self):
30+
speg = s.SPEG()
31+
try:
32+
speg.parse('!!!', 'B')
33+
except Exception as ex:
34+
self.assertEqual(type(ex).__name__, 'GrammarParseError')
35+
36+
def test_speg_parse_text_parser_exception(self):
37+
speg = s.SPEG()
38+
try:
39+
speg.parse('GRAMMAR test a -> "A";', 'B')
40+
except Exception as ex:
41+
self.assertEqual(type(ex).__name__, 'TextParseError')

0 commit comments

Comments
 (0)