-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgpParser.py
139 lines (106 loc) · 3.93 KB
/
gpParser.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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
from config import Config
from utils import Utils
class GpParser(Utils):
def __init__(self, data, config=Config()):
super().__init__(config)
self.data = data
self.iterator = 0
self.length = len(data)
self.result = ''
def _increment_iterator(self):
self.iterator += 1
def _current_token(self):
return self.data[self.iterator]
def _next_token(self):
self._increment_iterator()
return self._current_token()
def _add_to_result(self, parsed_string):
self.result += parsed_string
def _parse_expression(self):
expression_token = self._current_token()
self._increment_iterator()
left_side = self.traverse()
self._increment_iterator()
right_side = self.traverse()
parsed = f"({left_side} {expression_token} {right_side})"
return parsed
def _parse_operation(self):
return self._parse_expression()
def _parse_condition(self):
return self._parse_expression()
def _parse_logic(self):
return self._parse_expression()
def _parse_equation(self):
left_side = self._next_token()
self._increment_iterator()
right_side = self.traverse()
parsed = f"{left_side} = {right_side};"
return parsed
def _parse_output(self):
output_token = self._current_token()
variable_token = self._next_token()
parsed = f"{output_token} {variable_token};"
return parsed
def _parse_not(self):
not_token = self._current_token()
self._increment_iterator()
expression = self.traverse()
parsed = f"({not_token} {expression})"
return parsed
def _parse_conditional_block(self):
block_token = self._current_token()
self._increment_iterator()
condition = self.traverse()
self._increment_iterator()
scope = self._traverse_scope()
parsed = f"{block_token} ({condition}) {scope}"
return parsed
def _parse_while(self):
return self._parse_conditional_block()
def _parse_if(self):
return self._parse_conditional_block()
def _traverse_scope(self):
open_scope = self._current_token()
self._increment_iterator()
content = ''
while not self.is_close_scope(self._current_token()):
content += self.traverse()
self._increment_iterator()
close_scope = self._current_token()
parsed = f"{open_scope} {content} {close_scope}"
return parsed
def traverse(self):
token = self._current_token()
if self.is_equation(token):
return self._parse_equation()
elif self.is_output(token):
return self._parse_output()
elif self.is_logic(token):
return self._parse_logic()
elif self.is_if(token):
return self._parse_if()
elif self.is_while(token):
return self._parse_while()
elif self.is_not(token):
return self._parse_not()
elif self.is_condition(token):
return self._parse_condition()
elif self.is_operation(token):
return self._parse_operation()
else:
return token
def parse(self):
while self.iterator < self.length:
parsed = self.traverse()
self._add_to_result(parsed)
self._increment_iterator()
return self.result
# # read from output.txt
# with open('output.txt', 'r') as f:
# data = f.read()
# data = [elem.strip().replace("'", "") for elem in data.strip()[1:-1].split(',')]
data = ['=', 'var1', '+', '-', '*', '4', '5', '6', '7', 'if', '<', 'var3', '10', '{', '=', 'var3', 'input', 'while', 'not', 'and', 'false', '<', '4', '5', '{', 'output', '5', '}', '}']
data2 = ['while', '<', '4', '5', '{', 'output', '5', '}']
gpParser = GpParser(data)
res = gpParser.parse()
print("RES: ", res)