@@ -12,21 +12,21 @@ public enum OperatorType: CustomStringConvertible {
12
12
case multiply
13
13
case percent
14
14
case exponent
15
-
15
+
16
16
public var description : String {
17
17
switch self {
18
- case . add:
19
- return " + "
20
- case . subtract:
21
- return " - "
22
- case . divide:
23
- return " / "
24
- case . multiply:
25
- return " * "
26
- case . percent:
27
- return " % "
28
- case . exponent:
29
- return " ^ "
18
+ case . add:
19
+ return " + "
20
+ case . subtract:
21
+ return " - "
22
+ case . divide:
23
+ return " / "
24
+ case . multiply:
25
+ return " * "
26
+ case . percent:
27
+ return " % "
28
+ case . exponent:
29
+ return " ^ "
30
30
}
31
31
}
32
32
}
@@ -36,48 +36,48 @@ public enum TokenType: CustomStringConvertible {
36
36
case closeBracket
37
37
case Operator( OperatorToken )
38
38
case operand( Double )
39
-
39
+
40
40
public var description : String {
41
41
switch self {
42
- case . openBracket:
43
- return " ( "
44
- case . closeBracket:
45
- return " ) "
46
- case . Operator( let operatorToken) :
47
- return operatorToken. description
48
- case . operand( let value) :
49
- return " \( value) "
42
+ case . openBracket:
43
+ return " ( "
44
+ case . closeBracket:
45
+ return " ) "
46
+ case . Operator( let operatorToken) :
47
+ return operatorToken. description
48
+ case . operand( let value) :
49
+ return " \( value) "
50
50
}
51
51
}
52
52
}
53
53
54
54
public struct OperatorToken : CustomStringConvertible {
55
55
let operatorType : OperatorType
56
-
56
+
57
57
init ( operatorType: OperatorType ) {
58
58
self . operatorType = operatorType
59
59
}
60
-
60
+
61
61
var precedence : Int {
62
62
switch operatorType {
63
- case . add, . subtract:
64
- return 0
65
- case . divide, . multiply, . percent:
66
- return 5
67
- case . exponent:
68
- return 10
63
+ case . add, . subtract:
64
+ return 0
65
+ case . divide, . multiply, . percent:
66
+ return 5
67
+ case . exponent:
68
+ return 10
69
69
}
70
70
}
71
-
71
+
72
72
var associativity : OperatorAssociativity {
73
73
switch operatorType {
74
- case . add, . subtract, . divide, . multiply, . percent:
75
- return . leftAssociative
76
- case . exponent:
77
- return . rightAssociative
74
+ case . add, . subtract, . divide, . multiply, . percent:
75
+ return . leftAssociative
76
+ case . exponent:
77
+ return . rightAssociative
78
78
}
79
79
}
80
-
80
+
81
81
public var description : String {
82
82
return operatorType. description
83
83
}
@@ -93,74 +93,74 @@ func < (left: OperatorToken, right: OperatorToken) -> Bool {
93
93
94
94
public struct Token : CustomStringConvertible {
95
95
let tokenType : TokenType
96
-
96
+
97
97
init ( tokenType: TokenType ) {
98
98
self . tokenType = tokenType
99
99
}
100
-
100
+
101
101
init ( operand: Double ) {
102
102
tokenType = . operand( operand)
103
103
}
104
-
104
+
105
105
init ( operatorType: OperatorType ) {
106
106
tokenType = . Operator( OperatorToken ( operatorType: operatorType) )
107
107
}
108
-
108
+
109
109
var isOpenBracket : Bool {
110
110
switch tokenType {
111
- case . openBracket:
112
- return true
113
- default :
114
- return false
111
+ case . openBracket:
112
+ return true
113
+ default :
114
+ return false
115
115
}
116
116
}
117
-
117
+
118
118
var isOperator : Bool {
119
119
switch tokenType {
120
- case . Operator( _) :
121
- return true
122
- default :
123
- return false
120
+ case . Operator( _) :
121
+ return true
122
+ default :
123
+ return false
124
124
}
125
125
}
126
-
126
+
127
127
var operatorToken : OperatorToken ? {
128
128
switch tokenType {
129
- case . Operator( let operatorToken) :
130
- return operatorToken
131
- default :
132
- return nil
129
+ case . Operator( let operatorToken) :
130
+ return operatorToken
131
+ default :
132
+ return nil
133
133
}
134
134
}
135
-
135
+
136
136
public var description : String {
137
137
return tokenType. description
138
138
}
139
139
}
140
140
141
141
public class InfixExpressionBuilder {
142
142
private var expression = [ Token] ( )
143
-
143
+
144
144
public func addOperator( _ operatorType: OperatorType ) -> InfixExpressionBuilder {
145
145
expression. append ( Token ( operatorType: operatorType) )
146
146
return self
147
147
}
148
-
148
+
149
149
public func addOperand( _ operand: Double ) -> InfixExpressionBuilder {
150
150
expression. append ( Token ( operand: operand) )
151
151
return self
152
152
}
153
-
153
+
154
154
public func addOpenBracket( ) -> InfixExpressionBuilder {
155
155
expression. append ( Token ( tokenType: . openBracket) )
156
156
return self
157
157
}
158
-
158
+
159
159
public func addCloseBracket( ) -> InfixExpressionBuilder {
160
160
expression. append ( Token ( tokenType: . closeBracket) )
161
161
return self
162
162
}
163
-
163
+
164
164
public func build( ) -> [ Token ] {
165
165
// Maybe do some validation here
166
166
return expression
@@ -169,46 +169,46 @@ public class InfixExpressionBuilder {
169
169
170
170
// This returns the result of the shunting yard algorithm
171
171
public func reversePolishNotation( _ expression: [ Token ] ) -> String {
172
-
172
+
173
173
var tokenStack = Stack < Token > ( )
174
174
var reversePolishNotation = [ Token] ( )
175
-
175
+
176
176
for token in expression {
177
177
switch token. tokenType {
178
- case . operand( _) :
179
- reversePolishNotation. append ( token)
180
-
181
- case . openBracket:
182
- tokenStack. push ( token)
183
-
184
- case . closeBracket:
185
- while tokenStack. count > 0 , let tempToken = tokenStack. pop ( ) , !tempToken. isOpenBracket {
186
- reversePolishNotation. append ( tempToken)
178
+ case . operand( _) :
179
+ reversePolishNotation. append ( token)
180
+
181
+ case . openBracket:
182
+ tokenStack. push ( token)
183
+
184
+ case . closeBracket:
185
+ while tokenStack. count > 0 , let tempToken = tokenStack. pop ( ) , !tempToken. isOpenBracket {
186
+ reversePolishNotation. append ( tempToken)
187
+ }
188
+
189
+ case . Operator( let operatorToken) :
190
+ for tempToken in tokenStack. makeIterator ( ) {
191
+ if !tempToken. isOperator {
192
+ break
187
193
}
188
-
189
- case . Operator( let operatorToken) :
190
- for tempToken in tokenStack. makeIterator ( ) {
191
- if !tempToken. isOperator {
194
+
195
+ if let tempOperatorToken = tempToken. operatorToken {
196
+ if operatorToken. associativity == . leftAssociative && operatorToken <= tempOperatorToken
197
+ || operatorToken. associativity == . rightAssociative && operatorToken < tempOperatorToken {
198
+ reversePolishNotation. append ( tokenStack. pop ( ) !)
199
+ } else {
192
200
break
193
201
}
194
-
195
- if let tempOperatorToken = tempToken. operatorToken {
196
- if operatorToken. associativity == . leftAssociative && operatorToken <= tempOperatorToken
197
- || operatorToken. associativity == . rightAssociative && operatorToken < tempOperatorToken {
198
- reversePolishNotation. append ( tokenStack. pop ( ) !)
199
- } else {
200
- break
201
- }
202
- }
203
202
}
204
- tokenStack. push ( token)
203
+ }
204
+ tokenStack. push ( token)
205
205
}
206
206
}
207
-
207
+
208
208
while tokenStack. count > 0 {
209
209
reversePolishNotation. append ( tokenStack. pop ( ) !)
210
210
}
211
-
211
+
212
212
return reversePolishNotation. map ( { token in token. description} ) . joined ( separator: " " )
213
213
}
214
214
0 commit comments