1
1
import os
2
2
3
- from parsimonious .grammar import Grammar
4
- from parsimonious .nodes import NodeVisitor
3
+ from nodeset_parser import Transformer , Lark_StandAlone
5
4
6
5
_base_path = "/sys/devices/system"
7
6
@@ -15,30 +14,28 @@ def wrapper():
15
14
return wrapper
16
15
17
16
18
- class _NodeSetVisitor ( NodeVisitor ):
17
+ class _LarkTransformer ( Transformer ):
19
18
20
- def visit_sentence (self , _ , children ):
21
- return children [0 ]
22
-
23
- def visit_list_form (self , _ , children ):
24
- value = children [0 ]
25
- for item in children [1 ]:
26
- value = value .union (item [1 ])
19
+ def list_form (self , children ):
20
+ value = set ()
21
+ for item in children :
22
+ value = value .union (item )
27
23
return value
28
24
29
- def visit_list_entry (self , _ , children ):
25
+ def list_entry (self , children ):
30
26
v = children [0 ]
31
- if isinstance (v , int ):
32
- return {v }
27
+ if isinstance (v , str ):
28
+ return {int ( v ) }
33
29
elif isinstance (v , range ):
34
30
return set (v )
35
31
else :
36
32
raise Exception ("don't know how to handle" )
37
33
38
- def visit_mask_form (self , _ , children ):
39
- values = [children [0 ]]
40
- for item in children [1 ]:
41
- values .insert (0 , item [1 ])
34
+
35
+ def mask_form (self , children ):
36
+ values = []
37
+ for item in children :
38
+ values .insert (0 , int (item .value , 16 ))
42
39
bit = 0
43
40
result = set ()
44
41
for value in values :
@@ -49,38 +46,15 @@ def visit_mask_form(self, _, children):
49
46
bit = bit + 1
50
47
return result
51
48
52
- def visit_mask_entry (self , value , _ ):
53
- return int (value .text , 16 )
54
-
55
- def visit_range (self , _ , children ):
56
- low , _ , high = children
57
- return range (low , high + 1 )
58
-
59
- def visit_number (self , number , _ ):
60
- return int (number .text )
61
-
62
- def generic_visit (self , node , children ):
63
- return children or node
49
+ def range (self , children ):
50
+ return range (int (children [0 ].value ), int (children [1 ].value ) + 1 )
64
51
65
52
66
53
class NodeSetParser :
67
- grammar = Grammar (
68
- """
69
- sentence = (mask_form / list_form)
70
- list_form = list_entry (comma list_entry)*
71
- list_entry = (range / number)
72
- mask_form = mask_entry (comma mask_entry)*
73
- mask_entry = ~"[0-9a-f]{8}"
74
- range = number minus number
75
- number = ~"(0|[1-9][0-9]*)"
76
- comma = ","
77
- minus = "-"
78
- """ )
79
-
80
54
@classmethod
81
55
def parse (cls , string_representation ):
82
- tree = cls . grammar . parse ( string_representation . strip ())
83
- return _NodeSetVisitor (). visit ( tree )
56
+ parser = Lark_StandAlone ( transformer = _LarkTransformer ())
57
+ return parser . parse ( string_representation )
84
58
85
59
86
60
class NodeSet :
@@ -189,7 +163,3 @@ def get_cpu_nodeset(self):
189
163
with open (self .__node_path (node , "/cpulist" )) as f :
190
164
cpus = cpus .union (CPUNodeSet (f .read ()))
191
165
return cpus
192
-
193
-
194
- if __name__ == "__main__" :
195
- print (NUMANodeSet ("0" ).negation ().get_cpu_nodeset ().negation ())
0 commit comments