Correct position of negative numbers.

This commit is contained in:
Stephen Chung 2021-04-16 21:59:05 +08:00
parent 208e5fdbf4
commit 2b10c5c6c1
2 changed files with 10 additions and 7 deletions

View File

@ -1328,7 +1328,7 @@ fn parse_unary(
match parse_unary(input, state, lib, settings.level_up())? { match parse_unary(input, state, lib, settings.level_up())? {
// Negative integer // Negative integer
Expr::IntegerConstant(num, pos) => num Expr::IntegerConstant(num, _) => num
.checked_neg() .checked_neg()
.map(|i| Expr::IntegerConstant(i, pos)) .map(|i| Expr::IntegerConstant(i, pos))
.or_else(|| { .or_else(|| {
@ -1341,7 +1341,7 @@ fn parse_unary(
// Negative float // Negative float
#[cfg(not(feature = "no_float"))] #[cfg(not(feature = "no_float"))]
Expr::FloatConstant(x, pos) => Ok(Expr::FloatConstant((-(*x)).into(), pos)), Expr::FloatConstant(x, _) => Ok(Expr::FloatConstant((-(*x)).into(), pos)),
// Call negative function // Call negative function
expr => { expr => {

View File

@ -1240,7 +1240,7 @@ fn get_next_token_inner(
); );
} }
let mut negated = false; let mut negated_pos = Position::NONE;
while let Some(c) = stream.get_next() { while let Some(c) = stream.get_next() {
pos.advance(); pos.advance();
@ -1349,9 +1349,12 @@ fn get_next_token_inner(
} }
} }
if negated { let num_pos = if !negated_pos.is_none() {
result.insert(0, '-'); result.insert(0, '-');
} negated_pos
} else {
start_pos
};
// Parse number // Parse number
return Some(( return Some((
@ -1388,7 +1391,7 @@ fn get_next_token_inner(
Token::LexError(LERR::MalformedNumber(result.into_iter().collect())) Token::LexError(LERR::MalformedNumber(result.into_iter().collect()))
}) })
}, },
start_pos, num_pos,
)); ));
} }
@ -1507,7 +1510,7 @@ fn get_next_token_inner(
('+', _) if !state.non_unary => return Some((Token::UnaryPlus, start_pos)), ('+', _) if !state.non_unary => return Some((Token::UnaryPlus, start_pos)),
('+', _) => return Some((Token::Plus, start_pos)), ('+', _) => return Some((Token::Plus, start_pos)),
('-', '0'..='9') if !state.non_unary => negated = true, ('-', '0'..='9') if !state.non_unary => negated_pos = start_pos,
('-', '0'..='9') => return Some((Token::Minus, start_pos)), ('-', '0'..='9') => return Some((Token::Minus, start_pos)),
('-', '=') => { ('-', '=') => {
eat_next(stream, pos); eat_next(stream, pos);