lambda-graphs 0.1.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lambda_graphs/__init__.py +18 -0
- lambda_graphs/__main__.py +7 -0
- lambda_graphs/cli.py +183 -0
- lambda_graphs/codeviews/AST/AST.py +120 -0
- lambda_graphs/codeviews/AST/AST_driver.py +37 -0
- lambda_graphs/codeviews/AST/__init__.py +0 -0
- lambda_graphs/codeviews/CFG/CFG.py +42 -0
- lambda_graphs/codeviews/CFG/CFG_c.py +1182 -0
- lambda_graphs/codeviews/CFG/CFG_cpp.py +5604 -0
- lambda_graphs/codeviews/CFG/CFG_driver.py +45 -0
- lambda_graphs/codeviews/CFG/CFG_java.py +1722 -0
- lambda_graphs/codeviews/CFG/__init__.py +0 -0
- lambda_graphs/codeviews/CST/CST_driver.py +70 -0
- lambda_graphs/codeviews/CST/__init__.py +0 -0
- lambda_graphs/codeviews/DFG/DFG_driver.py +42 -0
- lambda_graphs/codeviews/DFG/__init__.py +0 -0
- lambda_graphs/codeviews/SDFG/SDFG.py +135 -0
- lambda_graphs/codeviews/SDFG/SDFG_c.py +2041 -0
- lambda_graphs/codeviews/SDFG/SDFG_cpp.py +4030 -0
- lambda_graphs/codeviews/SDFG/SDFG_java.py +1618 -0
- lambda_graphs/codeviews/SDFG/__init__.py +0 -0
- lambda_graphs/codeviews/__init__.py +0 -0
- lambda_graphs/codeviews/combined_graph/__init__.py +0 -0
- lambda_graphs/codeviews/combined_graph/combined_driver.py +163 -0
- lambda_graphs/tree_parser/__init__.py +0 -0
- lambda_graphs/tree_parser/c_parser.py +565 -0
- lambda_graphs/tree_parser/cpp_parser.py +424 -0
- lambda_graphs/tree_parser/custom_parser.py +66 -0
- lambda_graphs/tree_parser/java_parser.py +254 -0
- lambda_graphs/tree_parser/parser_driver.py +54 -0
- lambda_graphs/utils/DFG_utils.py +44 -0
- lambda_graphs/utils/__init__.py +0 -0
- lambda_graphs/utils/c_nodes.py +431 -0
- lambda_graphs/utils/cpp_nodes.py +1331 -0
- lambda_graphs/utils/java_nodes.py +756 -0
- lambda_graphs/utils/multi_file_merger.py +444 -0
- lambda_graphs/utils/postprocessor.py +83 -0
- lambda_graphs/utils/preprocessor.py +68 -0
- lambda_graphs/utils/src_parser.py +23 -0
- lambda_graphs-0.1.4.dist-info/METADATA +380 -0
- lambda_graphs-0.1.4.dist-info/RECORD +45 -0
- lambda_graphs-0.1.4.dist-info/WHEEL +5 -0
- lambda_graphs-0.1.4.dist-info/entry_points.txt +2 -0
- lambda_graphs-0.1.4.dist-info/licenses/LICENSE +21 -0
- lambda_graphs-0.1.4.dist-info/top_level.txt +1 -0
|
File without changes
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
import networkx as nx
|
|
4
|
+
from ...tree_parser.parser_driver import ParserDriver
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class CSTGraph:
|
|
8
|
+
def __init__(self, src_language, src_code, root_node):
|
|
9
|
+
self.src_language = src_language
|
|
10
|
+
self.src_code = src_code
|
|
11
|
+
self.root_node = root_node
|
|
12
|
+
self.index = {}
|
|
13
|
+
self.create_CST_id(self.root_node, self.index, [0])
|
|
14
|
+
self.graph = self.to_networkx()
|
|
15
|
+
grandparent_folder = os.path.abspath(
|
|
16
|
+
os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
def postorder_traversal(self, node):
|
|
20
|
+
if node.children:
|
|
21
|
+
for child in node.children:
|
|
22
|
+
self.postorder_traversal(child)
|
|
23
|
+
|
|
24
|
+
def create_CST_id(self, root_node, CST_index, CST_id):
|
|
25
|
+
current_node_id = CST_id[0]
|
|
26
|
+
CST_id[0] += 1
|
|
27
|
+
CST_index[(root_node.start_point, root_node.end_point, root_node.type)] = (
|
|
28
|
+
current_node_id
|
|
29
|
+
)
|
|
30
|
+
for child in root_node.children:
|
|
31
|
+
|
|
32
|
+
child_id = self.create_CST_id(child, CST_index, CST_id)
|
|
33
|
+
return current_node_id
|
|
34
|
+
|
|
35
|
+
def get_CST_nodes(self, root_node, CST, CST_index):
|
|
36
|
+
current_node_id = CST_index[
|
|
37
|
+
(root_node.start_point, root_node.end_point, root_node.type)
|
|
38
|
+
]
|
|
39
|
+
label = str(root_node.start_point[0]) + "_" + root_node.type
|
|
40
|
+
CST.add_node(
|
|
41
|
+
current_node_id,
|
|
42
|
+
label=label,
|
|
43
|
+
shape="box",
|
|
44
|
+
style="rounded, filled",
|
|
45
|
+
fillcolor="#BFE6D3",
|
|
46
|
+
color="white",
|
|
47
|
+
)
|
|
48
|
+
for child in root_node.children:
|
|
49
|
+
|
|
50
|
+
child_id = self.get_CST_nodes(child, CST, CST_index)
|
|
51
|
+
if child_id != None:
|
|
52
|
+
CST.add_edge(current_node_id, child_id)
|
|
53
|
+
return current_node_id
|
|
54
|
+
|
|
55
|
+
def to_networkx(self):
|
|
56
|
+
G = nx.MultiDiGraph()
|
|
57
|
+
self.get_CST_nodes(self.root_node, G, self.index)
|
|
58
|
+
nx.set_edge_attributes(G, "CST_edge", "edge_type")
|
|
59
|
+
nx.set_edge_attributes(G, "blue", "color")
|
|
60
|
+
nx.set_edge_attributes(G, "vee", "shape")
|
|
61
|
+
return G
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class CSTDriver:
|
|
65
|
+
def __init__(self, src_language="c", src_code=""):
|
|
66
|
+
self.src_language = src_language
|
|
67
|
+
self.src_code = src_code
|
|
68
|
+
self.parser = ParserDriver(src_language, src_code).parser
|
|
69
|
+
self.root_node, self.tree = self.parser.parse()
|
|
70
|
+
self.graph = CSTGraph(self.src_language, self.src_code, self.root_node)
|
|
File without changes
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import networkx as nx
|
|
2
|
+
from ...tree_parser.parser_driver import ParserDriver
|
|
3
|
+
from ...utils import postprocessor
|
|
4
|
+
from ..SDFG.SDFG import DfgRda
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class DFGDriver:
|
|
8
|
+
def __init__(
|
|
9
|
+
self,
|
|
10
|
+
src_language="c",
|
|
11
|
+
src_code="",
|
|
12
|
+
output_file="DFG_output.json",
|
|
13
|
+
properties={},
|
|
14
|
+
):
|
|
15
|
+
self.src_language = src_language
|
|
16
|
+
|
|
17
|
+
self.parser = ParserDriver(src_language, src_code).parser
|
|
18
|
+
self.root_node = self.parser.root_node
|
|
19
|
+
self.src_code = self.parser.src_code
|
|
20
|
+
self.properties = properties.get("DFG", {})
|
|
21
|
+
|
|
22
|
+
self.graph = nx.MultiDiGraph()
|
|
23
|
+
self.rda_table = None
|
|
24
|
+
self.rda_result = None
|
|
25
|
+
|
|
26
|
+
if self.properties.get("statements", False):
|
|
27
|
+
result = DfgRda(
|
|
28
|
+
src_language=src_language,
|
|
29
|
+
src_code=src_code,
|
|
30
|
+
properties=properties,
|
|
31
|
+
)
|
|
32
|
+
self.rda_table = result.rda_table
|
|
33
|
+
self.rda_result = result.rda_result
|
|
34
|
+
self.graph = result.graph
|
|
35
|
+
if output_file:
|
|
36
|
+
self.json = postprocessor.write_networkx_to_json(self.graph, output_file)
|
|
37
|
+
postprocessor.write_to_dot(
|
|
38
|
+
self.graph,
|
|
39
|
+
output_file.split(".")[0] + ".dot",
|
|
40
|
+
output_png=True,
|
|
41
|
+
src_language=self.src_language,
|
|
42
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import os.path
|
|
2
|
+
import time
|
|
3
|
+
|
|
4
|
+
import networkx as nx
|
|
5
|
+
from loguru import logger
|
|
6
|
+
|
|
7
|
+
from lambda_graphs.codeviews.CFG.CFG_driver import CFGDriver
|
|
8
|
+
from lambda_graphs.codeviews.SDFG.SDFG_c import dfg_c
|
|
9
|
+
from lambda_graphs.codeviews.SDFG.SDFG_cpp import dfg_cpp
|
|
10
|
+
from lambda_graphs.codeviews.SDFG.SDFG_java import dfg_java
|
|
11
|
+
from lambda_graphs.utils import postprocessor, DFG_utils
|
|
12
|
+
|
|
13
|
+
debug = False
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class DfgRda:
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
src_language="c",
|
|
20
|
+
src_code="",
|
|
21
|
+
output_file=None,
|
|
22
|
+
graph_format="dot",
|
|
23
|
+
properties=None,
|
|
24
|
+
):
|
|
25
|
+
if not properties:
|
|
26
|
+
properties = {
|
|
27
|
+
"CFG": {},
|
|
28
|
+
"DFG": {
|
|
29
|
+
"last_use": True,
|
|
30
|
+
"last_def": True,
|
|
31
|
+
"alex_algo": True,
|
|
32
|
+
},
|
|
33
|
+
}
|
|
34
|
+
self.src_language = src_language
|
|
35
|
+
self.src_code = src_code
|
|
36
|
+
self.properties = properties
|
|
37
|
+
self.graph = nx.MultiDiGraph()
|
|
38
|
+
start = time.time()
|
|
39
|
+
self.CFG_Results = CFGDriver(
|
|
40
|
+
self.src_language, self.src_code, "", self.properties["CFG"]
|
|
41
|
+
)
|
|
42
|
+
end = time.time()
|
|
43
|
+
self.CFG = self.CFG_Results.graph
|
|
44
|
+
self.rda_table = None
|
|
45
|
+
self.rda_result = None
|
|
46
|
+
start_dfg = time.time()
|
|
47
|
+
self.graph, self.debug_graph, self.rda_table, self.rda_result = self.rda(
|
|
48
|
+
self.properties["DFG"]
|
|
49
|
+
)
|
|
50
|
+
end_dfg = time.time()
|
|
51
|
+
if debug:
|
|
52
|
+
logger.warning(
|
|
53
|
+
"CFG time: "
|
|
54
|
+
+ str(end - start)
|
|
55
|
+
+ " DFG time: "
|
|
56
|
+
+ str(end_dfg - start_dfg)
|
|
57
|
+
)
|
|
58
|
+
if output_file:
|
|
59
|
+
if graph_format == "all" or graph_format == "json":
|
|
60
|
+
self.json = postprocessor.write_networkx_to_json(
|
|
61
|
+
self.graph, output_file
|
|
62
|
+
)
|
|
63
|
+
if graph_format == "all" or graph_format == "dot":
|
|
64
|
+
postprocessor.write_to_dot(
|
|
65
|
+
self.graph,
|
|
66
|
+
output_file.rsplit(".", 1)[0] + ".dot",
|
|
67
|
+
output_png=True,
|
|
68
|
+
src_language=self.src_language,
|
|
69
|
+
)
|
|
70
|
+
if graph_format == "all" or graph_format == "dot":
|
|
71
|
+
postprocessor.write_to_dot(
|
|
72
|
+
self.debug_graph,
|
|
73
|
+
output_file.rsplit(".", 1)[0] + "_debug.dot",
|
|
74
|
+
output_png=True,
|
|
75
|
+
src_language=self.src_language,
|
|
76
|
+
)
|
|
77
|
+
self.json = postprocessor.write_networkx_to_json(self.graph, output_file)
|
|
78
|
+
|
|
79
|
+
def get_graph(self):
|
|
80
|
+
return self.graph
|
|
81
|
+
|
|
82
|
+
def index_to_code(self):
|
|
83
|
+
tokens_index = DFG_utils.tree_to_token_index(self.CFG_Results.root_node)
|
|
84
|
+
code = self.src_code.split("\n")
|
|
85
|
+
code_tokens = [DFG_utils.index_to_code_token(x, code) for x in tokens_index]
|
|
86
|
+
index_to_code = {}
|
|
87
|
+
|
|
88
|
+
for ind, code in zip(tokens_index, code_tokens):
|
|
89
|
+
if ind in self.CFG_Results.parser.index:
|
|
90
|
+
idx = self.CFG_Results.parser.index[ind]
|
|
91
|
+
else:
|
|
92
|
+
idx = -1
|
|
93
|
+
index_to_code[ind] = (idx, code)
|
|
94
|
+
|
|
95
|
+
return index_to_code
|
|
96
|
+
|
|
97
|
+
def rda(self, properties):
|
|
98
|
+
lang_map = {
|
|
99
|
+
"c": dfg_c,
|
|
100
|
+
"cpp": dfg_cpp,
|
|
101
|
+
"java": dfg_java,
|
|
102
|
+
}
|
|
103
|
+
driver = lang_map[self.src_language]
|
|
104
|
+
return driver(properties, self.CFG_Results)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
if __name__ == "__main__":
|
|
108
|
+
for extension in ("c", "cpp"):
|
|
109
|
+
file = f"data/test_manual.{extension}"
|
|
110
|
+
if not os.path.isfile(file):
|
|
111
|
+
continue
|
|
112
|
+
with open(file, "r") as f:
|
|
113
|
+
sample_file = f.read()
|
|
114
|
+
|
|
115
|
+
output_file = f"data/{extension}_test.json"
|
|
116
|
+
src_code = sample_file
|
|
117
|
+
result = DfgRda(
|
|
118
|
+
src_language=extension,
|
|
119
|
+
src_code=src_code,
|
|
120
|
+
output_file=None,
|
|
121
|
+
)
|
|
122
|
+
graph = result.graph
|
|
123
|
+
postprocessor.write_to_dot(
|
|
124
|
+
graph,
|
|
125
|
+
output_file.rsplit(".", 1)[0] + ".dot",
|
|
126
|
+
output_png=True,
|
|
127
|
+
src_language=extension,
|
|
128
|
+
)
|
|
129
|
+
debug_graph = result.debug_graph
|
|
130
|
+
postprocessor.write_to_dot(
|
|
131
|
+
debug_graph,
|
|
132
|
+
output_file.rsplit(".", 1)[0] + "_debug.dot",
|
|
133
|
+
output_png=True,
|
|
134
|
+
src_language=extension,
|
|
135
|
+
)
|