Advertisement
zamotivator

Untitled

Nov 1st, 2012
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import copy
  2.  
  3. def p_empty(_, position=0):
  4.     return 0
  5.  
  6. def p_is(predictor):
  7.     if isinstance(predictor, basestring):
  8.         def p_is(line, position=0):
  9.             if len(line) > position and line[position:].startswith(predictor):
  10.                 return len(predictor), predictor
  11.             else:
  12.                 return 0, None
  13.     else:
  14.         def p_is(line, position=0):
  15.             if len(line) > position:
  16.                 result = predictor(line[position:])
  17.             else:
  18.                 result = 0
  19.             if result:
  20.                 return result, line[position:position+result]
  21.             else:
  22.                 return 0, None
  23.     return p_is
  24.  
  25. def string_to_p_is(original):
  26.     if isinstance(original, basestring):
  27.         return p_is(original)
  28.     else:
  29.         return original
  30.  
  31. def p_while(original):
  32.     original = string_to_p_is(original)
  33.     def p_while(line, position=0):
  34.         start = position
  35.         result = []
  36.         while len(line) > position:
  37.             current = original(line, position=position)
  38.             if current[0]:
  39.                 position += current[0]
  40.                 result.append(current[1])
  41.             else:
  42.                 break
  43.         if position > start:
  44.             assert(len(result))
  45.             return position - start, result
  46.         else:
  47.             assert(not len(result))
  48.             return 0, None
  49.     return p_while
  50.  
  51. def p_any(*plist):
  52.     plist = map(string_to_p_is, plist)
  53.     def p_any(line, position=0):
  54.         if len(line) > position:
  55.             for p in plist:
  56.                 current = p(line, position=position)
  57.                 if current[0]:
  58.                     return current
  59.             else:
  60.                 return 0, None
  61.     return p_any
  62.  
  63. def p_for(*plist):
  64.     plist = map(string_to_p_is, plist)
  65.     def p_for(line, position=0):
  66.         start = position
  67.         result = []
  68.         for p in plist:
  69.             if len(line) > position:
  70.                 current = p(line, position=position)
  71.                 if current[0]:
  72.                     position += current[0]
  73.                     result.append(current[1])
  74.                     continue
  75.                 else:
  76.                     break
  77.             else:
  78.                 break
  79.         else:
  80.             if position > start:
  81.                 return position - start, result
  82.         return 0, None
  83.     return p_for
  84.  
  85. def p_until(original):
  86.     original = string_to_p_is(original)
  87.     def p_until(line, position=0):
  88.         start = position
  89.         while len(line) > position:
  90.             current = original(line, position=position)
  91.             if current[0]:
  92.                 break
  93.             else:
  94.                 position += 1
  95.         if position > start:
  96.             return position - start, line[start:position]
  97.         else:
  98.             return 0, None
  99.     return p_until
  100.  
  101. def p_digit():
  102.     def predictor(line):
  103.         if line[0].isdigit():
  104.             return 1
  105.         else:
  106.             return 0
  107.     return p_is(predictor)
  108.  
  109. def p_number():
  110.     return p_apply(p_while(p_digit()), lambda r: int(''.join(r)))
  111.  
  112. def p_in(*pset):
  113.     pset = set(filter(lambda p: len(p), pset))
  114.     for p in pset:
  115.         for a in pset:
  116.             if a != p and a.startswith(p):
  117.                 raise RuntimeError("p_in: %s is prefix for %s" % (p, a))
  118.     return p_any(pset)
  119.  
  120. def p_not_in(pset):
  121.     return p_until(p_in(pset))
  122.  
  123. def p_apply(original, true, false=None):
  124.     def p_apply(line, position=0):
  125.         result = original(line, position=position)
  126.         if result[0]:
  127.             result = (result[0], true(result[1]))
  128.         else:
  129.             result = (result[0], false)
  130.         return result
  131.     return p_apply
  132.  
  133. def p_between(prefix, suffix):
  134.     return p_apply(p_for(prefix, p_until(suffix), suffix), lambda r: r[1])
  135.  
  136. def p_scidbtestharness():
  137. # Example of lines for parse:
  138. # [1][Wed Oct 31 12:08:30 2012]: t.checkin.repart_unbounded ______________________________________________________________ Executing
  139. # [1][Wed Oct 31 12:08:30 2012]: t.checkin.repart_unbounded .............................................................. PASS
  140.     status = dict(Executing='START',
  141.                   PASS='PASS',
  142.                   EXECUTOR_FAILED='FAIL',
  143.                   FILES_DIFFER='DIFF')
  144.     return p_apply(p_for(p_between('[', ']'),
  145.                          p_between('[', ']'),
  146.                          p_between(': t.', ' '),
  147.                          p_apply(p_any(p_for(p_while('_'),
  148.                                              ' ',
  149.                                              'Executing'),
  150.                                        p_for(p_while('.'),
  151.                                              ' ',
  152.                                              p_any('PASS', 'EXECUTOR_FAILED', 'FILES_DIFFER')
  153.                                              )
  154.                                        ),
  155.                                  lambda v: status.get(v[-1])
  156.                                  )
  157.                          ),
  158.                    lambda v: (v[2], v[3])
  159.                    )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement