-
Notifications
You must be signed in to change notification settings - Fork 0
/
bracket.h
139 lines (117 loc) · 3.68 KB
/
bracket.h
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
#ifndef BRACKET_H
#define BRACKET_H
#include "types.h"
#include "calcurate.h"
#define BEGIN_BRACKET 1
#define END_BRACKET 2
#define NO_MORE_BRACKETS -1
#define BRACKET_MISMATCH -2
int bracket_count(list<string> expressions, int type)
{
list<string>::iterator it = expressions.begin();
int result = 0;
while (it != expressions.end()) {
switch (type) {
case BEGIN_BRACKET:
if (*it == "(") {
result++;
}
break;
case END_BRACKET:
if (*it == ")") {
result++;
}
break;
default:
;
}
it++;
}
return result;
}
int process_brackets(struct PROGRESSION_FLAGS *pflags)
{
list<string> partial_expressions;
list<string>::iterator it, pair_match_seek_it;
list<string>::iterator last_begin_bracket_it,
pair_end_bracket_it;
list<string>::iterator statement_begin,
statement_end;
list<string>::iterator delete_back_it;
list<string>::iterator insert_position;
bool begin_bracket_found,
end_bracket_found;
int begin_bracket_counter = 0,
end_bracket_counter = 0;
int bracket_value = 0;
begin_bracket_counter = bracket_count(pflags->expressions, BEGIN_BRACKET);
end_bracket_counter = bracket_count(pflags->expressions, END_BRACKET);
if (begin_bracket_counter != end_bracket_counter) {
return BRACKET_MISMATCH;
}
if (!begin_bracket_counter || !end_bracket_counter) {
return NO_MORE_BRACKETS;
}
it = pflags->expressions.begin();
while (it != pflags->expressions.end()) {
begin_bracket_found = false;
end_bracket_found = false;
if (*it == "(") {
begin_bracket_found = true;
last_begin_bracket_it = it;
pair_match_seek_it = it;
while (pair_match_seek_it != pflags->expressions.end()) {
pair_match_seek_it++;
if (*pair_match_seek_it == "(") {
break;
}
if (*pair_match_seek_it == ")") {
end_bracket_found = true;
pair_match_seek_it++;
pair_end_bracket_it = pair_match_seek_it;
break;
}
}
}
if (begin_bracket_found && end_bracket_found) {
break;
}
it++;
}
statement_begin = last_begin_bracket_it;
statement_begin++;
statement_end = pair_end_bracket_it;
statement_end--;
bracket_value = calcurate(statement_begin, statement_end);
delete_back_it = pair_end_bracket_it;
delete_back_it++;
insert_position = pflags->expressions.erase(last_begin_bracket_it, delete_back_it);
insert_position = pflags->expressions.insert(insert_position, _itos(bracket_value));
// Clean up waste element that is added after inserting bracket_value
insert_position--;
pflags->expressions.erase(insert_position);
cout << stringify_list(pflags->expressions) << endl;
return 0;
}
void exec_bracket_processing(struct PROGRESSION_FLAGS *pflags)
{
bool exit_bracket_processing = false;
while (1) {
cout << "------" << endl;
switch (process_brackets(pflags)) {
case NO_MORE_BRACKETS:
exit_bracket_processing = true;
break;
case BRACKET_MISMATCH:
cout << "Bracket mis-match" << endl;
return;
default:
break;
}
if (exit_bracket_processing) {
break;
}
}
return;
}
#endif