Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import copy
- def p_empty(_, position=0):
- return 0
- def p_is(predictor):
- if isinstance(predictor, basestring):
- def p_is(line, position=0):
- if len(line) > position and line[position:].startswith(predictor):
- return len(predictor), predictor
- else:
- return 0, None
- else:
- def p_is(line, position=0):
- if len(line) > position:
- result = predictor(line[position:])
- else:
- result = 0
- if result:
- return result, line[position:position+result]
- else:
- return 0, None
- return p_is
- def string_to_p_is(original):
- if isinstance(original, basestring):
- return p_is(original)
- else:
- return original
- def p_while(original):
- original = string_to_p_is(original)
- def p_while(line, position=0):
- start = position
- result = []
- while len(line) > position:
- current = original(line, position=position)
- if current[0]:
- position += current[0]
- result.append(current[1])
- else:
- break
- if position > start:
- assert(len(result))
- return position - start, result
- else:
- assert(not len(result))
- return 0, None
- return p_while
- def p_any(*plist):
- plist = map(string_to_p_is, plist)
- def p_any(line, position=0):
- if len(line) > position:
- for p in plist:
- current = p(line, position=position)
- if current[0]:
- return current
- else:
- return 0, None
- return p_any
- def p_for(*plist):
- plist = map(string_to_p_is, plist)
- def p_for(line, position=0):
- start = position
- result = []
- for p in plist:
- if len(line) > position:
- current = p(line, position=position)
- if current[0]:
- position += current[0]
- result.append(current[1])
- continue
- else:
- break
- else:
- break
- else:
- if position > start:
- return position - start, result
- return 0, None
- return p_for
- def p_until(original):
- original = string_to_p_is(original)
- def p_until(line, position=0):
- start = position
- while len(line) > position:
- current = original(line, position=position)
- if current[0]:
- break
- else:
- position += 1
- if position > start:
- return position - start, line[start:position]
- else:
- return 0, None
- return p_until
- def p_digit():
- def predictor(line):
- if line[0].isdigit():
- return 1
- else:
- return 0
- return p_is(predictor)
- def p_number():
- return p_apply(p_while(p_digit()), lambda r: int(''.join(r)))
- def p_in(*pset):
- pset = set(filter(lambda p: len(p), pset))
- for p in pset:
- for a in pset:
- if a != p and a.startswith(p):
- raise RuntimeError("p_in: %s is prefix for %s" % (p, a))
- return p_any(pset)
- def p_not_in(pset):
- return p_until(p_in(pset))
- def p_apply(original, true, false=None):
- def p_apply(line, position=0):
- result = original(line, position=position)
- if result[0]:
- result = (result[0], true(result[1]))
- else:
- result = (result[0], false)
- return result
- return p_apply
- def p_between(prefix, suffix):
- return p_apply(p_for(prefix, p_until(suffix), suffix), lambda r: r[1])
- def p_scidbtestharness():
- # Example of lines for parse:
- # [1][Wed Oct 31 12:08:30 2012]: t.checkin.repart_unbounded ______________________________________________________________ Executing
- # [1][Wed Oct 31 12:08:30 2012]: t.checkin.repart_unbounded .............................................................. PASS
- status = dict(Executing='START',
- PASS='PASS',
- EXECUTOR_FAILED='FAIL',
- FILES_DIFFER='DIFF')
- return p_apply(p_for(p_between('[', ']'),
- p_between('[', ']'),
- p_between(': t.', ' '),
- p_apply(p_any(p_for(p_while('_'),
- ' ',
- 'Executing'),
- p_for(p_while('.'),
- ' ',
- p_any('PASS', 'EXECUTOR_FAILED', 'FILES_DIFFER')
- )
- ),
- lambda v: status.get(v[-1])
- )
- ),
- lambda v: v[2], v[3]
- )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement