Skip to content

Commit 8ea0e45

Browse files
committed
Merge branch 'dev-test-command'
2 parents 493eacb + 82aa17e commit 8ea0e45

File tree

5 files changed

+39
-66
lines changed

5 files changed

+39
-66
lines changed

src/elements/arithmetic_expr.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ use super::word::Word;
1919
pub struct ArithmeticExpr {
2020
pub text: String,
2121
elements: Vec<Elem>,
22-
paren_stack: Vec<char>,
2322
output_base: String,
2423
hide_base: bool,
2524
}
@@ -47,6 +46,18 @@ impl ArithmeticExpr {
4746
ans
4847
}
4948

49+
pub fn eval_elems(&mut self, core: &mut ShellCore) -> Result<Elem, String> {
50+
if self.elements.len() == 0 {
51+
return Err("operand expexted (error token: \")\")".to_string());
52+
}
53+
let es = match self.decompose_increments() {
54+
Ok(data) => data,
55+
Err(err_msg) => return Err(err_msg),
56+
};
57+
58+
calculate(&es, core)
59+
}
60+
5061
fn ans_to_string(&self, n: i64) -> Option<String> {
5162
let base_str = self.output_base.clone();
5263

@@ -168,7 +179,6 @@ impl ArithmeticExpr {
168179
ArithmeticExpr {
169180
text: String::new(),
170181
elements: vec![],
171-
paren_stack: vec![],
172182
output_base: "10".to_string(),
173183
hide_base: false,
174184
}

src/elements/arithmetic_expr/calculator.rs

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,12 @@ use super::elem::Elem;
66
use super::{elem, float, int, rev_polish, trenary, word};
77

88
pub fn pop_operand(stack: &mut Vec<Elem>, core: &mut ShellCore) -> Result<Elem, String> {
9-
let n = match stack.pop() {
10-
Some(Elem::Word(w, inc)) => {
11-
match word::to_operand(&w, 0, inc, core) {
12-
Ok(op) => op,
13-
Err(e) => return Err(e),
14-
}
15-
},
16-
Some(elem) => elem,
17-
None => return Err("no operand".to_string()),
18-
};
19-
Ok(n)
9+
match stack.pop() {
10+
Some(Elem::Word(w, inc)) => word::to_operand(&w, 0, inc, core),
11+
Some(Elem::InParen(mut a)) => a.eval_elems(core),
12+
Some(elem) => Ok(elem),
13+
None => Err("no operand".to_string()),
14+
}
2015
}
2116

2217
fn bin_operation(op: &str, stack: &mut Vec<Elem>, core: &mut ShellCore) -> Result<(), String> {
@@ -79,15 +74,14 @@ pub fn calculate(elements: &Vec<Elem>, core: &mut ShellCore) -> Result<Elem, Str
7974

8075
for e in rev_pol {
8176
let result = match e {
82-
Elem::Integer(_) | Elem::Float(_) | Elem::Word(_, _) => {
77+
Elem::Integer(_) | Elem::Float(_) | Elem::Word(_, _) | Elem::InParen(_) => {
8378
stack.push(e.clone());
8479
Ok(())
8580
},
8681
Elem::BinaryOp(ref op) => bin_operation(&op, &mut stack, core),
8782
Elem::UnaryOp(ref op) => unary_operation(&op, &mut stack, core),
8883
Elem::Increment(n) => inc(n, &mut stack, core),
8984
Elem::Ternary(left, right) => trenary::operation(&left, &right, &mut stack, core),
90-
_ => Err( error_message::syntax(&elem::to_string(&e)) ),
9185
};
9286

9387
if let Err(err_msg) = result {
@@ -98,12 +92,7 @@ pub fn calculate(elements: &Vec<Elem>, core: &mut ShellCore) -> Result<Elem, Str
9892
if stack.len() != 1 {
9993
return Err( format!("unknown syntax error_message (stack inconsistency)",) );
10094
}
101-
102-
match stack.pop() {
103-
Some(Elem::Word(w, inc)) => word::to_operand(&w, 0, inc, core),
104-
Some(elem) => Ok(elem),
105-
None => Err( format!("unknown syntax error_message",) ),
106-
}
95+
pop_operand(&mut stack, core)
10796
}
10897

10998
fn inc(inc: i64, stack: &mut Vec<Elem>, core: &mut ShellCore) -> Result<(), String> {

src/elements/arithmetic_expr/elem.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ pub enum Elem {
1212
Float(f64),
1313
Ternary(Box<Option<ArithmeticExpr>>, Box<Option<ArithmeticExpr>>),
1414
Word(Word, i64), // Word + post increment or decrement
15-
LeftParen,
16-
RightParen,
15+
InParen(ArithmeticExpr),
1716
Increment(i64), //pre increment
1817
}
1918

@@ -50,6 +49,7 @@ pub fn op_order(op: &Elem) -> u8 {
5049

5150
pub fn to_string(op: &Elem) -> String {
5251
match op {
52+
Elem::InParen(a) => a.text.to_string(),
5353
Elem::Integer(n) => n.to_string(),
5454
Elem::Float(f) => f.to_string(),
5555
Elem::Word(w, inc) => {
@@ -61,8 +61,6 @@ pub fn to_string(op: &Elem) -> String {
6161
},
6262
Elem::UnaryOp(s) => s.clone(),
6363
Elem::BinaryOp(s) => s.clone(),
64-
Elem::LeftParen => "(".to_string(),
65-
Elem::RightParen => ")".to_string(),
6664
Elem::Increment(1) => "++".to_string(),
6765
Elem::Increment(-1) => "--".to_string(),
6866
_ => "".to_string(),

src/elements/arithmetic_expr/parser.rs

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ impl ArithmeticExpr {
110110
Some(Elem::Integer(_))
111111
| Some(Elem::Float(_))
112112
| Some(Elem::Word(_, _))
113-
| Some(Elem::RightParen) => return false,
113+
| Some(Elem::InParen(_)) => return false,
114114
_ => {},
115115
}
116116

@@ -124,24 +124,23 @@ impl ArithmeticExpr {
124124
true
125125
}
126126

127-
fn eat_paren(feeder: &mut Feeder, ans: &mut Self) -> bool {
128-
if feeder.starts_with("(") {
129-
ans.paren_stack.push( '(' );
130-
ans.elements.push( Elem::LeftParen );
131-
ans.text += &feeder.consume(1);
132-
return true;
127+
fn eat_paren(feeder: &mut Feeder, core: &mut ShellCore, ans: &mut Self) -> bool {
128+
if ! feeder.starts_with("(") {
129+
return false;
133130
}
134131

135-
if feeder.starts_with(")") {
136-
if let Some('(') = ans.paren_stack.last() {
137-
ans.paren_stack.pop();
138-
ans.elements.push( Elem::RightParen );
139-
ans.text += &feeder.consume(1);
140-
return true;
141-
}
132+
ans.text += &feeder.consume(1);
133+
134+
let arith = Self::parse(feeder, core);
135+
if arith.is_none() || ! feeder.starts_with(")") {
136+
return false;
142137
}
143138

144-
false
139+
ans.text += &arith.as_ref().unwrap().text;
140+
ans.elements.push( Elem::InParen(arith.unwrap()) );
141+
142+
ans.text += &feeder.consume(1);
143+
return true;
145144
}
146145

147146
fn eat_binary_operator(feeder: &mut Feeder, ans: &mut Self, core: &mut ShellCore) -> bool {
@@ -170,7 +169,7 @@ impl ArithmeticExpr {
170169
|| Self::eat_conditional_op(feeder, &mut ans, core)
171170
|| Self::eat_incdec(feeder, &mut ans)
172171
|| Self::eat_unary_operator(feeder, &mut ans, core)
173-
|| Self::eat_paren(feeder, &mut ans)
172+
|| Self::eat_paren(feeder, core, &mut ans)
174173
|| Self::eat_binary_operator(feeder, &mut ans, core)
175174
|| Self::eat_word(feeder, &mut ans, core) {
176175
continue;

src/elements/arithmetic_expr/rev_polish.rs

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,17 @@ use super::elem::Elem;
77
pub fn rearrange(elements: &[Elem]) -> Result<Vec<Elem>, Elem> {
88
let mut ans = vec![];
99
let mut stack = vec![];
10-
let mut last = None;
1110

1211
for e in elements {
1312
let ok = match e {
14-
Elem::Float(_) | Elem::Integer(_) | Elem::Word(_, _)
13+
Elem::Float(_) | Elem::Integer(_) | Elem::Word(_, _) | Elem::InParen(_)
1514
=> {ans.push(e.clone()); true},
16-
Elem::LeftParen => {stack.push(e.clone()); true},
17-
Elem::RightParen => rev_polish_paren(&mut stack, &mut ans),
1815
op => rev_polish_op(&op, &mut stack, &mut ans),
1916
};
2017

2118
if !ok {
2219
return Err(e.clone());
2320
}
24-
25-
match (last, e) {
26-
( Some(Elem::LeftParen), Elem::RightParen ) => return Err(e.clone()),
27-
_ => {},
28-
}
29-
30-
last = Some(e.clone());
3121
}
3222

3323
while stack.len() > 0 {
@@ -37,24 +27,11 @@ pub fn rearrange(elements: &[Elem]) -> Result<Vec<Elem>, Elem> {
3727
Ok(ans)
3828
}
3929

40-
fn rev_polish_paren(stack: &mut Vec<Elem>, ans: &mut Vec<Elem>) -> bool {
41-
loop {
42-
match stack.last() {
43-
None => return false,
44-
Some(Elem::LeftParen) => {
45-
stack.pop();
46-
return true;
47-
},
48-
Some(_) => ans.push(stack.pop().unwrap()),
49-
}
50-
}
51-
}
52-
5330
fn rev_polish_op(elem: &Elem,
5431
stack: &mut Vec<Elem>, ans: &mut Vec<Elem>) -> bool {
5532
loop {
5633
match stack.last() {
57-
None | Some(Elem::LeftParen) => {
34+
None => {
5835
stack.push(elem.clone());
5936
break;
6037
},

0 commit comments

Comments
 (0)