@@ -119,13 +119,19 @@ impl ExprParser {
119
119
if op_pre <= pre {
120
120
return false ;
121
121
}
122
+ if self . num_stack . len ( ) < 1 {
123
+ return false ;
124
+ }
122
125
let a = self . num_stack . pop ( ) . unwrap ( ) ;
123
126
self . num_stack . push ( op. calc ( a) ) ;
124
127
}
125
128
OpTypes :: ForBin ( ref op) => {
126
129
if op_pre < pre {
127
130
return false ;
128
131
}
132
+ if self . num_stack . len ( ) < 2 {
133
+ return false ;
134
+ }
129
135
let b = self . num_stack . pop ( ) . unwrap ( ) ;
130
136
let a = self . num_stack . pop ( ) . unwrap ( ) ;
131
137
self . num_stack . push ( op. calc ( a, b) ) ;
@@ -144,7 +150,7 @@ impl ExprParser {
144
150
}
145
151
}
146
152
147
- fn parse ( & mut self , expr : & str ) -> f64 {
153
+ fn parse ( & mut self , expr : & str ) -> Result < f64 , String > {
148
154
let mut cur_pre = 0 ;
149
155
let mut chars = expr. chars ( ) . peekable ( ) ;
150
156
let mut is_expect_bin_op = false ;
@@ -177,7 +183,7 @@ impl ExprParser {
177
183
self . op_stack . push ( op) ;
178
184
}
179
185
None => {
180
- println ! ( "expect binary op but got: {}" , c) ;
186
+ return Err ( format ! ( "expect binary op but got: {}" , c) ) ;
181
187
}
182
188
}
183
189
is_expect_bin_op = false ;
@@ -206,21 +212,35 @@ impl ExprParser {
206
212
chars. next ( ) ;
207
213
continue ;
208
214
}
209
- None => { println ! ( "unexpect {}" , c) ; }
215
+ None => { return Err ( format ! ( "unexpect {}" , c) ) ; }
210
216
}
211
217
}
212
218
}
213
219
}
214
220
}
215
221
self . pop_op ( 0 ) ;
216
222
println ! ( "{:?}" , self . num_stack) ;
217
- return self . num_stack [ 0 ] ;
223
+ if self . op_stack . len ( ) > 0 {
224
+ return Err ( format ! ( "lack of number" ) ) ;
225
+ }
226
+ if self . num_stack . len ( ) != 1 {
227
+ return Err ( format ! ( "lack of operator" ) ) ;
228
+ }
229
+ return Ok ( self . num_stack [ 0 ] ) ;
218
230
}
219
231
}
220
232
221
233
fn test ( expr : & str ) {
222
234
let mut parser = ExprParser :: new ( ) ;
223
- println ! ( "{}={}" , expr, parser. parse( expr) ) ;
235
+ print ! ( "{}=" , expr) ;
236
+ match parser. parse ( expr) {
237
+ Ok ( r) => {
238
+ println ! ( "{}" , r) ;
239
+ } ,
240
+ Err ( s) => {
241
+ println ! ( "{}" , s) ;
242
+ }
243
+ }
224
244
}
225
245
226
246
fn main ( ) {
@@ -230,8 +250,9 @@ fn main() {
230
250
// io::stdin().read_line(&mut expr)
231
251
// .ok()
232
252
// .expect("failed to read line");
233
- test ( "23.4 + 32 * 5" ) ;
234
- test ( "1++++----212" ) ;
235
- test ( "2*(2-(9.3-2.3))" ) ;
236
- test ( "1+2*--3.67 * (5.34 - 2)/+.5" ) ;
253
+ test ( "((12-2)" ) ;
254
+ test ( "23.4 + 32 * 5+" ) ;
255
+ test ( "1++++----212 67" ) ;
256
+ // test("2*(2-(9.3-2.3))");
257
+ // test("1+2*--3.67 * (5.34 - 2)/+.5");
237
258
}
0 commit comments