MCPcopy Index your code
hub / github.com/endbasic/endbasic / parse_step

Method parse_step

core/src/parser.rs:1200–1248  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

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> {

Callers 1

parse_forMethod · 0.80

Calls 2

consume_peekedMethod · 0.80
peekMethod · 0.45

Tested by

no test coverage detected