Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1 

2def data_type(value): 

3 if ':' in value: 

4 return [ x.strip() for x in value.rsplit(':', 1) ] 

5 return ('', value.strip()) 

6 

7START = '__start__' 

8END = '__end__' 

9SEQUENCE = 'sequence' 

10MAPPING = 'mapping' 

11RENAME = 'rename' 

12IGNORE = 'ignore' 

13TYPS = (SEQUENCE, MAPPING, RENAME, IGNORE) 

14 

15 

16def parse(tokens): 

17 """ Infer a data structure from the ordered set of fields and 

18 return it.""" 

19 target = typ = None 

20 out = [] # [(key, value)] 

21 stack = [] # [(target, typ, out)] 

22 

23 for token in tokens: 

24 key, val = token 

25 if key == START: 

26 stack.append((target, typ, out)) 

27 target, typ = data_type(val) 

28 if typ in TYPS: 

29 out = [] 

30 else: 

31 raise ValueError("Unknown start marker %s" % repr(token)) 

32 elif key == END: 

33 if typ == SEQUENCE: 

34 parsed = [v for (k, v) in out] 

35 elif typ == MAPPING: 

36 parsed = dict(out) 

37 elif typ == RENAME: 

38 parsed = out[0][1] if out else '' 

39 elif typ == IGNORE: 

40 parsed = None 

41 else: 

42 raise ValueError("Too many end markers") 

43 prev_target, prev_typ, out = stack.pop() 

44 if parsed is not None: 

45 out.append((target, parsed)) 

46 target = prev_target 

47 typ = prev_typ 

48 else: 

49 out.append(token) 

50 

51 if stack: 

52 raise ValueError("Not enough end markers") 

53 

54 return dict(out)