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.
Files changed (45) hide show
  1. lambda_graphs/__init__.py +18 -0
  2. lambda_graphs/__main__.py +7 -0
  3. lambda_graphs/cli.py +183 -0
  4. lambda_graphs/codeviews/AST/AST.py +120 -0
  5. lambda_graphs/codeviews/AST/AST_driver.py +37 -0
  6. lambda_graphs/codeviews/AST/__init__.py +0 -0
  7. lambda_graphs/codeviews/CFG/CFG.py +42 -0
  8. lambda_graphs/codeviews/CFG/CFG_c.py +1182 -0
  9. lambda_graphs/codeviews/CFG/CFG_cpp.py +5604 -0
  10. lambda_graphs/codeviews/CFG/CFG_driver.py +45 -0
  11. lambda_graphs/codeviews/CFG/CFG_java.py +1722 -0
  12. lambda_graphs/codeviews/CFG/__init__.py +0 -0
  13. lambda_graphs/codeviews/CST/CST_driver.py +70 -0
  14. lambda_graphs/codeviews/CST/__init__.py +0 -0
  15. lambda_graphs/codeviews/DFG/DFG_driver.py +42 -0
  16. lambda_graphs/codeviews/DFG/__init__.py +0 -0
  17. lambda_graphs/codeviews/SDFG/SDFG.py +135 -0
  18. lambda_graphs/codeviews/SDFG/SDFG_c.py +2041 -0
  19. lambda_graphs/codeviews/SDFG/SDFG_cpp.py +4030 -0
  20. lambda_graphs/codeviews/SDFG/SDFG_java.py +1618 -0
  21. lambda_graphs/codeviews/SDFG/__init__.py +0 -0
  22. lambda_graphs/codeviews/__init__.py +0 -0
  23. lambda_graphs/codeviews/combined_graph/__init__.py +0 -0
  24. lambda_graphs/codeviews/combined_graph/combined_driver.py +163 -0
  25. lambda_graphs/tree_parser/__init__.py +0 -0
  26. lambda_graphs/tree_parser/c_parser.py +565 -0
  27. lambda_graphs/tree_parser/cpp_parser.py +424 -0
  28. lambda_graphs/tree_parser/custom_parser.py +66 -0
  29. lambda_graphs/tree_parser/java_parser.py +254 -0
  30. lambda_graphs/tree_parser/parser_driver.py +54 -0
  31. lambda_graphs/utils/DFG_utils.py +44 -0
  32. lambda_graphs/utils/__init__.py +0 -0
  33. lambda_graphs/utils/c_nodes.py +431 -0
  34. lambda_graphs/utils/cpp_nodes.py +1331 -0
  35. lambda_graphs/utils/java_nodes.py +756 -0
  36. lambda_graphs/utils/multi_file_merger.py +444 -0
  37. lambda_graphs/utils/postprocessor.py +83 -0
  38. lambda_graphs/utils/preprocessor.py +68 -0
  39. lambda_graphs/utils/src_parser.py +23 -0
  40. lambda_graphs-0.1.4.dist-info/METADATA +380 -0
  41. lambda_graphs-0.1.4.dist-info/RECORD +45 -0
  42. lambda_graphs-0.1.4.dist-info/WHEEL +5 -0
  43. lambda_graphs-0.1.4.dist-info/entry_points.txt +2 -0
  44. lambda_graphs-0.1.4.dist-info/licenses/LICENSE +21 -0
  45. 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
+ )