10 import match as _match |
10 import match as _match |
11 |
11 |
12 elements = { |
12 elements = { |
13 "(": (20, ("group", 1, ")"), ("func", 1, ")")), |
13 "(": (20, ("group", 1, ")"), ("func", 1, ")")), |
14 "-": (19, ("negate", 19), ("minus", 19)), |
14 "-": (19, ("negate", 19), ("minus", 19)), |
15 "..": (17, None, ("dagrange", 17)), |
15 "::": (17, ("dagrangepre", 17), ("dagrange", 17), |
16 ":": (15, None, ("range", 15)), |
16 ("dagrangepost", 17)), |
|
17 "..": (17, ("dagrangepre", 17), ("dagrange", 17), |
|
18 ("dagrangepost", 17)), |
|
19 ":": (15, ("rangepre", 15), ("range", 15), ("rangepost", 15)), |
17 "not": (10, ("not", 10)), |
20 "not": (10, ("not", 10)), |
18 "!": (10, ("not", 10)), |
21 "!": (10, ("not", 10)), |
19 "and": (5, None, ("and", 5)), |
22 "and": (5, None, ("and", 5)), |
20 "&": (5, None, ("and", 5)), |
23 "&": (5, None, ("and", 5)), |
21 "or": (4, None, ("or", 4)), |
24 "or": (4, None, ("or", 4)), |
34 pos, l = 0, len(program) |
37 pos, l = 0, len(program) |
35 while pos < l: |
38 while pos < l: |
36 c = program[pos] |
39 c = program[pos] |
37 if c.isspace(): # skip inter-token whitespace |
40 if c.isspace(): # skip inter-token whitespace |
38 pass |
41 pass |
39 elif c in "():,-|&+!": # handle simple operators |
42 elif c == ':' and program[pos:pos + 2] == '::': # look ahead carefully |
40 yield (c, None) |
43 yield ('::', None) |
|
44 pos += 1 # skip ahead |
41 elif c == '.' and program[pos:pos + 2] == '..': # look ahead carefully |
45 elif c == '.' and program[pos:pos + 2] == '..': # look ahead carefully |
42 yield ('..', None) |
46 yield ('..', None) |
43 pos += 1 # skip ahead |
47 pos += 1 # skip ahead |
|
48 elif c in "():,-|&+!": # handle simple operators |
|
49 yield (c, None) |
44 elif c in '"\'': # handle quoted strings |
50 elif c in '"\'': # handle quoted strings |
45 pos += 1 |
51 pos += 1 |
46 s = pos |
52 s = pos |
47 while pos < l: # find closing quote |
53 while pos < l: # find closing quote |
48 d = program[pos] |
54 d = program[pos] |
124 n = getset(repo, subset, y)[-1] |
130 n = getset(repo, subset, y)[-1] |
125 if m < n: |
131 if m < n: |
126 return range(m, n + 1) |
132 return range(m, n + 1) |
127 return range(m, n - 1, -1) |
133 return range(m, n - 1, -1) |
128 |
134 |
|
135 def rangepreset(repo, subset, x): |
|
136 return range(0, getset(repo, subset, x)[-1] + 1) |
|
137 |
|
138 def rangepostset(repo, subset, x): |
|
139 return range(getset(repo, subset, x)[0], len(repo)) |
|
140 |
129 def dagrangeset(repo, subset, x, y): |
141 def dagrangeset(repo, subset, x, y): |
130 return andset(repo, subset, |
142 return andset(repo, subset, |
131 ('func', ('symbol', 'descendants'), x), |
143 ('func', ('symbol', 'descendants'), x), |
132 ('func', ('symbol', 'ancestors'), y)) |
144 ('func', ('symbol', 'ancestors'), y)) |
133 |
145 |