Skip to content

Commit 4e047f2

Browse files
committed
error handling
1 parent a07b15f commit 4e047f2

File tree

1 file changed

+30
-9
lines changed

1 file changed

+30
-9
lines changed

Diff for: expr/src/main.rs

+30-9
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,19 @@ impl ExprParser {
119119
if op_pre <= pre {
120120
return false;
121121
}
122+
if self.num_stack.len() < 1 {
123+
return false;
124+
}
122125
let a = self.num_stack.pop().unwrap();
123126
self.num_stack.push(op.calc(a));
124127
}
125128
OpTypes::ForBin(ref op) => {
126129
if op_pre < pre {
127130
return false;
128131
}
132+
if self.num_stack.len() < 2 {
133+
return false;
134+
}
129135
let b = self.num_stack.pop().unwrap();
130136
let a = self.num_stack.pop().unwrap();
131137
self.num_stack.push(op.calc(a, b));
@@ -144,7 +150,7 @@ impl ExprParser {
144150
}
145151
}
146152

147-
fn parse(&mut self, expr: &str) -> f64{
153+
fn parse(&mut self, expr: &str) -> Result<f64, String>{
148154
let mut cur_pre = 0;
149155
let mut chars = expr.chars().peekable();
150156
let mut is_expect_bin_op = false;
@@ -177,7 +183,7 @@ impl ExprParser {
177183
self.op_stack.push(op);
178184
}
179185
None => {
180-
println!("expect binary op but got: {}", c);
186+
return Err(format!("expect binary op but got: {}", c));
181187
}
182188
}
183189
is_expect_bin_op = false;
@@ -206,21 +212,35 @@ impl ExprParser {
206212
chars.next();
207213
continue;
208214
}
209-
None => { println!("unexpect {}", c); }
215+
None => { return Err(format!("unexpect {}", c)); }
210216
}
211217
}
212218
}
213219
}
214220
}
215221
self.pop_op(0);
216222
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]);
218230
}
219231
}
220232

221233
fn test(expr: &str) {
222234
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+
}
224244
}
225245

226246
fn main() {
@@ -230,8 +250,9 @@ fn main() {
230250
// io::stdin().read_line(&mut expr)
231251
// .ok()
232252
// .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");
237258
}

0 commit comments

Comments
 (0)