def parse_character(*chars, **kwargs):
    """
    returns parser that match one of the strings given
    """
    label = kwargs.get('label', None)
    if len(chars) == 1 and len(chars[0]) > 1:
        return cmb.or_else(*[bp.LParser(char) for char in chars[0]], label=label)
    return cmb.or_else(*[bp.LParser(char) for char in chars], label=label)
 def test_AddingLabel(self):
     # Arrange
     parser1 = bpr.LParser('l')
     parser2 = bpr.LParser('o')
     parser3 = bpr.LParser('r')
     parser = cmb.or_else(parser1, parser2, parser3, label='Parser: lor')
     parser_default_label = cmb.or_else(parser1, parser2, parser3)
     # Assert
     self.assertEqual(parser.label, 'Parser: lor')
     self.assertEqual(parser_default_label.label, '[lor]')
 def test_CorrectlyHandlesDifferentNumberOfArguments(self):
     # Arrange
     txt1 = 'lorem ipsum dolor sit amet'
     txt2 = 'ipsum dolor sit amet'
     txt3 = 'dolor sit amet'
     txt4 = 'sit amet'
     parser_l = bpr.LParser('l')
     parser_o = bpr.LParser('i')
     parser_r = bpr.LParser('d')
     parser_e = bpr.LParser('s')
     parser = cmb.or_else(parser_l, parser_o, parser_r, parser_e)
     # Act
     result1 = parser(txt1)
     result2 = parser(txt2)
     result3 = parser(txt3)
     result4 = parser(txt4)
     expected1 = res.Success(('l', 'orem ipsum dolor sit amet'))
     expected2 = res.Success(('i', 'psum dolor sit amet'))
     expected3 = res.Success(('d', 'olor sit amet'))
     expected4 = res.Success(('s', 'it amet'))
     # Assert
     self.assertEqual(result1, expected1)
     self.assertEqual(result2, expected2)
     self.assertEqual(result3, expected3)
     self.assertEqual(result4, expected4)
def parse_float(label='FLOAT'):
    """
    returns parser for floating point number
    """
    sign = cmb.opt(bp.LParser('-'))
    coma = bp.LParser('.')
    e = cmb.or_else(bp.LParser('e'), bp.LParser('E'))
    exponent = cmb.opt(cmb.and_then(e, parse_integer()))
    integer = parse_integer()
    return cmb.and_then(sign, cmb.opt(integer), coma, parse_digits(), exponent, label=label)
 def test_FailureCase(self):
     # Arrange
     txt = 'Lorem'
     parser1 = bpr.LParser('l')
     parser2 = bpr.LParser('x')
     parser3 = bpr.LParser('i')
     # Act
     parser = cmb.or_else(parser1, parser2, parser3)
     result = parser(txt)
     expected = res.Failure('error')
     # Assert
     self.assertEqual(result, expected)
 def test_SuccessCase(self):
     # Arrange
     txt1 = 'Lorem'
     txt2 = 'ipsum'
     parser1 = bpr.LParser('L')
     parser2 = bpr.LParser('x')
     parser3 = bpr.LParser('i')
     # Act
     parser = cmb.or_else(parser1, parser2, parser3)
     result1 = parser(txt1)
     result2 = parser(txt2)
     expected1 = res.Success(('L', 'orem'))
     expected2 = res.Success(('i', 'psum'))
     # Assert
     self.assertEqual(result1, expected1)
     self.assertEqual(result2, expected2)
def parse_alphanumeric(label='[A-Za-z0-9]'):
    """
    returns parser parsing single letter or digit: [A-Za-z0-9]
    """
    return cmb.or_else(*[bp.LParser(char) for char in (string.ascii_letters + string.digits)], label=label)
def parse_letter(label='[A-Za-z]'):
    """
    returns parser parsing single latter: [A-Za-z]
    """
    return cmb.or_else(*[bp.LParser(char) for char in string.ascii_letters], label=label)
def parse_lowercase(label='[a-z]'):
    """
    returns parser parsing single small latter: [a-z]
    """
    return cmb.or_else(*[bp.LParser(char) for char in string.ascii_lowercase], label=label)
def parse_uppercase(label='[A-Z]'):
    """
    returns parser parsing single capital letter: [A-Z]
    """
    return cmb.or_else(*[bp.LParser(char) for char in string.ascii_uppercase], label=label)
def parse_digit(label='[0-9]'):
    """
    returns parser parsing single digit: [0-9]
    """
    return cmb.or_else(*[bp.LParser(char) for char in string.digits], label=label)
def parse_one_of_strings(*strings, **kwargs):
    """
    returns parser that match one of the strings given
    """
    label = kwargs.get('label', '(' + '|'.join(strings) + ')')
    return cmb.or_else(*[parse_string(s) for s in strings], label=label)