-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinit_parser.py
83 lines (75 loc) · 3.32 KB
/
init_parser.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
from parser import Parser
from general_token import GeneralTokenType
from errors import GeneralError
class InitParser(Parser):
def __init__(self,scanner,graph_vertices):
Parser.__init__(self,scanner)
self.existing_vertices = graph_vertices
self.vertex_set = list()
self.vertex_dict = dict()
#need to have a dictionary which tracks the state of each unique vertex
def parse(self):
return self.parse_initializer()
def parse_initializer(self):
self.match(GeneralTokenType.DELIMITER, '(')
self.parse_state_associations()#
self.match(GeneralTokenType.DELIMITER, ')')
return self.vertex_dict
def parse_state_associations(self):
self.parse_state_association()#
next_token = self.scanner.peek()
while next_token.getValue() == ',':
self.match(GeneralTokenType.DELIMITER, ',')
self.parse_state_association()#
next_token = self.scanner.peek()
return True
def parse_state_association(self):
self.match(GeneralTokenType.DELIMITER, '{')
initialized_vertices = self.parse_vertex_set()
self.match(GeneralTokenType.DELIMITER, ':')
state_list = self.parse_state_list()
self.match(GeneralTokenType.DELIMITER, '}')
#loop and add to dict
for vertex in initialized_vertices:
self.vertex_dict[vertex] = state_list
return True
def parse_vertex_set(self):
self.match(GeneralTokenType.DELIMITER, '{')
initialized_vertices = list()
initialized_vertices.append(self.parse_vertex())
next_token = self.scanner.peek()
while next_token.getValue() == ',':
self.match(GeneralTokenType.DELIMITER, ',')
initialized_vertices.append(self.parse_vertex())
next_token = self.scanner.peek()
self.match(GeneralTokenType.DELIMITER, '}')
return initialized_vertices
def parse_vertex(self):
next_token = self.match(GeneralTokenType.STRING)
if next_token.getValue() in self.existing_vertices:
if next_token.getValue() not in self.vertex_set:
self.vertex_set.append(next_token.getValue())
return next_token.getValue()
else:
error_msg = "Error with vertex in Init set. "
error_msg += "Duplicate Vertex '"+next_token.getValue()+"' "
error_msg += "found in vertex sets."
GeneralError(error_msg, "")
else:
error_msg = "Error with vertex in Init Set. "
error_msg += "Vertex '"+next_token.getValue()+"' "
error_msg += "not in graph vertex set."
GeneralError(error_msg, "")
def parse_state_list(self):
state_list = list()
self.match(GeneralTokenType.DELIMITER, '[')
next_token = self.match(GeneralTokenType.STRING)
state_list.append(next_token.getValue())
next_token = self.scanner.peek()
while next_token.getValue() == ',':
self.match(GeneralTokenType.DELIMITER, ',')
next_token = self.match(GeneralTokenType.STRING)
state_list.append(next_token.getValue())
next_token = self.scanner.peek()
self.match(GeneralTokenType.DELIMITER, ']')
return state_list