Skip to content

Commit ff33d0e

Browse files
committed
V 0.5.0: Remove parsimonious, and use a a Lark-based parser without additional dependencies
1 parent 6d6a1f0 commit ff33d0e

File tree

5 files changed

+3201
-52
lines changed

5 files changed

+3201
-52
lines changed

build_parser

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#!/bin/sh
2+
python -m lark.tools.standalone nodeset.lark > vfio_isolate/nodeset_parser.py

nodeset.lark

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
?start : list_form | mask_form
2+
list_form : list_entry ("," list_entry)*
3+
list_entry : range | NUMBER
4+
mask_form : MASK_ENTRY ("," MASK_ENTRY)*
5+
range : NUMBER "-" NUMBER
6+
NUMBER.0 : /0|[1-9][0-9]*/
7+
MASK_ENTRY.1 : /[0-9a-f]{8}/

setup.py

+9-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
setup(
1212
name='vfio-isolate',
13-
version='0.4.0',
13+
version='0.5.0',
1414
description='Commandline tool to facilitate CPU core isolation',
1515
long_description=long_description,
1616
long_description_content_type='text/markdown',
@@ -26,12 +26,17 @@
2626
'Programming Language :: Python :: 3.6',
2727
'Programming Language :: Python :: 3.7',
2828
'Programming Language :: Python :: 3.8',
29+
'Programming Language :: Python :: 3.9',
30+
'Programming Language :: Python :: 3.9',
31+
'Programming Language :: Python :: 3.10',
2932
],
3033
keywords='vfio cpu isolation',
34+
extras_require={"dev": [
35+
"lark>=1.1.5"
36+
]},
3137
install_requires=[
32-
'click~=7.1.2',
33-
'psutil~=5.7.0',
34-
'parsimonious~=0.8.1',
38+
'click>=7.1.2',
39+
'psutil>=5.7.0',
3540
],
3641
packages=find_packages(),
3742
python_requires='>=3.6, <4',

vfio_isolate/nodeset.py

+18-48
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import os
22

3-
from parsimonious.grammar import Grammar
4-
from parsimonious.nodes import NodeVisitor
3+
from nodeset_parser import Transformer, Lark_StandAlone
54

65
_base_path = "/sys/devices/system"
76

@@ -15,30 +14,28 @@ def wrapper():
1514
return wrapper
1615

1716

18-
class _NodeSetVisitor(NodeVisitor):
17+
class _LarkTransformer(Transformer):
1918

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)
2723
return value
2824

29-
def visit_list_entry(self, _, children):
25+
def list_entry(self, children):
3026
v = children[0]
31-
if isinstance(v, int):
32-
return {v}
27+
if isinstance(v, str):
28+
return {int(v)}
3329
elif isinstance(v, range):
3430
return set(v)
3531
else:
3632
raise Exception("don't know how to handle")
3733

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))
4239
bit = 0
4340
result = set()
4441
for value in values:
@@ -49,38 +46,15 @@ def visit_mask_form(self, _, children):
4946
bit = bit + 1
5047
return result
5148

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)
6451

6552

6653
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-
8054
@classmethod
8155
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)
8458

8559

8660
class NodeSet:
@@ -189,7 +163,3 @@ def get_cpu_nodeset(self):
189163
with open(self.__node_path(node, "/cpulist")) as f:
190164
cpus = cpus.union(CPUNodeSet(f.read()))
191165
return cpus
192-
193-
194-
if __name__ == "__main__":
195-
print(NUMANodeSet("0").negation().get_cpu_nodeset().negation())

0 commit comments

Comments
 (0)