-
Notifications
You must be signed in to change notification settings - Fork 0
/
promql_ast.py
48 lines (38 loc) · 1.3 KB
/
promql_ast.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import io
class ASTNode:
def __new__(cls, grammar_type):
if grammar_type == 'label_selector':
return super().__new__(LabelSelector)
return super().__new__(ASTNode)
def __init__(self, grammar_type):
self.grammar_type = grammar_type
self.children = []
def __str__(self):
sio = io.StringIO()
for child in self.children:
if isinstance(child, ASTNode):
sio.write(str(child))
elif isinstance(child, str):
sio.write(child)
else:
raise RuntimeError('unknown ast node')
s = sio.getvalue()
sio.close()
return s
class LabelSelector(ASTNode):
def __str__(self):
return ','.join([k + '=' + v + '' for k, v in self.children])
def recur_print(root: ASTNode):
for child in root.children:
if isinstance(child, ASTNode):
recur_print(child)
elif isinstance(child, str):
print(child)
else:
raise RuntimeError('unknown ast node')
def recur_add_label(root: ASTNode, label, value):
if isinstance(root, LabelSelector):
root.children.append((label, value))
for child in root.children:
if isinstance(child, ASTNode):
recur_add_label(child, label, value)