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)