62 lines
1.4 KiB
Python
62 lines
1.4 KiB
Python
from __future__ import unicode_literals
|
|
import pytest # noqa
|
|
|
|
# Grammar
|
|
from arpeggio import ZeroOrMore, OneOrMore, UnorderedGroup, \
|
|
ParserPython, NoMatch, EOF
|
|
|
|
|
|
def test_zeroormore_with_separator():
|
|
|
|
def grammar():
|
|
return ZeroOrMore(['a', 'b'], sep=','), EOF
|
|
|
|
parser = ParserPython(grammar, reduce_tree=False)
|
|
result = parser.parse('a, b, b, b, a')
|
|
assert result
|
|
|
|
with pytest.raises(NoMatch):
|
|
parser.parse('a, b a')
|
|
|
|
|
|
def test_oneormore_with_ordered_choice_separator():
|
|
|
|
def grammar():
|
|
return OneOrMore(['a', 'b'], sep=[',', ';']), EOF
|
|
|
|
parser = ParserPython(grammar, reduce_tree=False)
|
|
result = parser.parse('a, a; a, b, a; a')
|
|
assert result
|
|
|
|
with pytest.raises(NoMatch):
|
|
parser.parse('a, b a')
|
|
|
|
with pytest.raises(NoMatch):
|
|
parser.parse('a, b: a')
|
|
|
|
|
|
def test_unordered_group_with_separator():
|
|
|
|
def grammar():
|
|
return UnorderedGroup('a', 'b', 'c', sep=[',', ';']), EOF
|
|
|
|
parser = ParserPython(grammar, reduce_tree=False)
|
|
result = parser.parse('b , a, c')
|
|
assert result
|
|
result = parser.parse('b , c; a')
|
|
assert result
|
|
|
|
# Check separator matching
|
|
with pytest.raises(NoMatch):
|
|
parser.parse('a, b c')
|
|
|
|
with pytest.raises(NoMatch):
|
|
parser.parse('a, c: a')
|
|
|
|
# Each element must be matched exactly once
|
|
with pytest.raises(NoMatch):
|
|
parser.parse('a, b, b; c')
|
|
|
|
with pytest.raises(NoMatch):
|
|
parser.parse('a, c')
|