Extracts the optional `STEP` part of a `FOR` statement, with a default of 1. Returns the step as an expression, an `Ordering` value representing how the step value compares to zero, and whether the step is a double or not.
(&mut self, default_pos: LineCol)
| 1198 | /// Returns the step as an expression, an `Ordering` value representing how the step value |
| 1199 | /// compares to zero, and whether the step is a double or not. |
| 1200 | fn parse_step(&mut self, default_pos: LineCol) -> Result<(Expr, Ordering, bool)> { |
| 1201 | let peeked = self.lexer.peek()?; |
| 1202 | match peeked.token { |
| 1203 | Token::Step => self.lexer.consume_peeked(), |
| 1204 | _ => { |
| 1205 | // Anchor the implicit STEP to the FOR token so later debug info remains stable |
| 1206 | // if the rest of the loop header changes width. |
| 1207 | return Ok(( |
| 1208 | Expr::Integer(IntegerSpan { value: 1, pos: default_pos }), |
| 1209 | Ordering::Greater, |
| 1210 | false, |
| 1211 | )); |
| 1212 | } |
| 1213 | }; |
| 1214 | |
| 1215 | let peeked = self.lexer.peek()?; |
| 1216 | match peeked.token { |
| 1217 | Token::Double(d) => { |
| 1218 | let peeked = self.lexer.consume_peeked(); |
| 1219 | let sign = if d == 0.0 { Ordering::Equal } else { Ordering::Greater }; |
| 1220 | Ok((Expr::Double(DoubleSpan { value: d, pos: peeked.pos }), sign, true)) |
| 1221 | } |
| 1222 | Token::Integer(i) => { |
| 1223 | let peeked = self.lexer.consume_peeked(); |
| 1224 | Ok((Expr::Integer(IntegerSpan { value: i, pos: peeked.pos }), i.cmp(&0), false)) |
| 1225 | } |
| 1226 | Token::Minus => { |
| 1227 | self.lexer.consume_peeked(); |
| 1228 | let peeked = self.lexer.peek()?; |
| 1229 | match peeked.token { |
| 1230 | Token::Double(d) => { |
| 1231 | let peeked = self.lexer.consume_peeked(); |
| 1232 | let sign = if d == 0.0 { Ordering::Equal } else { Ordering::Less }; |
| 1233 | Ok((Expr::Double(DoubleSpan { value: -d, pos: peeked.pos }), sign, true)) |
| 1234 | } |
| 1235 | Token::Integer(i) => { |
| 1236 | let peeked = self.lexer.consume_peeked(); |
| 1237 | Ok(( |
| 1238 | Expr::Integer(IntegerSpan { value: -i, pos: peeked.pos }), |
| 1239 | (-i).cmp(&0), |
| 1240 | false, |
| 1241 | )) |
| 1242 | } |
| 1243 | _ => Err(Error::Bad(peeked.pos, "STEP needs a literal number".to_owned())), |
| 1244 | } |
| 1245 | } |
| 1246 | _ => Err(Error::Bad(peeked.pos, "STEP needs a literal number".to_owned())), |
| 1247 | } |
| 1248 | } |
| 1249 | |
| 1250 | /// Parses a `FOR` statement. |
| 1251 | fn parse_for(&mut self, for_pos: LineCol) -> Result<Statement> { |
no test coverage detected