Fix parse positions.

This commit is contained in:
Stephen Chung 2020-06-11 23:08:00 +08:00
parent e4cca7620f
commit d92613eaf6

View File

@ -16,7 +16,7 @@ use crate::stdlib::{
char, char,
collections::HashMap, collections::HashMap,
format, format,
iter::{empty, Peekable}, iter::empty,
mem, mem,
num::NonZeroUsize, num::NonZeroUsize,
ops::{Add, Deref, DerefMut}, ops::{Add, Deref, DerefMut},
@ -751,15 +751,13 @@ fn parse_paren_expr(
// ( xxx ) // ( xxx )
(Token::RightParen, _) => Ok(expr), (Token::RightParen, _) => Ok(expr),
// ( <error> // ( <error>
(Token::LexError(err), pos) => { (Token::LexError(err), pos) => return Err(PERR::BadInput(err.to_string()).into_err(pos)),
return Err(PERR::BadInput(err.to_string()).into_err(settings.pos))
}
// ( xxx ??? // ( xxx ???
(_, pos) => Err(PERR::MissingToken( (_, pos) => Err(PERR::MissingToken(
Token::RightParen.into(), Token::RightParen.into(),
"for a matching ( in this expression".into(), "for a matching ( in this expression".into(),
) )
.into_err(settings.pos)), .into_err(pos)),
} }
} }
@ -769,10 +767,9 @@ fn parse_call_expr(
state: &mut ParseState, state: &mut ParseState,
id: String, id: String,
mut modules: Option<Box<ModuleRef>>, mut modules: Option<Box<ModuleRef>>,
mut settings: ParseSettings, settings: ParseSettings,
) -> Result<Expr, ParseError> { ) -> Result<Expr, ParseError> {
let (token, token_pos) = input.peek().unwrap(); let (token, _) = input.peek().unwrap();
settings.pos = *token_pos;
settings.ensure_level_within_max_limit(state.max_expr_depth)?; settings.ensure_level_within_max_limit(state.max_expr_depth)?;
let mut args = StaticVec::new(); let mut args = StaticVec::new();
@ -888,7 +885,7 @@ fn parse_index_chain(
input: &mut TokenStream, input: &mut TokenStream,
state: &mut ParseState, state: &mut ParseState,
lhs: Expr, lhs: Expr,
settings: ParseSettings, mut settings: ParseSettings,
) -> Result<Expr, ParseError> { ) -> Result<Expr, ParseError> {
settings.ensure_level_within_max_limit(state.max_expr_depth)?; settings.ensure_level_within_max_limit(state.max_expr_depth)?;
@ -1031,11 +1028,12 @@ fn parse_index_chain(
match input.peek().unwrap() { match input.peek().unwrap() {
// If another indexing level, right-bind it // If another indexing level, right-bind it
(Token::LeftBracket, _) => { (Token::LeftBracket, _) => {
let idx_pos = eat_token(input, Token::LeftBracket); let prev_pos = settings.pos;
settings.pos = eat_token(input, Token::LeftBracket);
// Recursively parse the indexing chain, right-binding each // Recursively parse the indexing chain, right-binding each
let idx_expr = parse_index_chain(input, state, idx_expr, settings.level_up())?; let idx_expr = parse_index_chain(input, state, idx_expr, settings.level_up())?;
// Indexing binds to right // Indexing binds to right
Ok(Expr::Index(Box::new((lhs, idx_expr, settings.pos)))) Ok(Expr::Index(Box::new((lhs, idx_expr, prev_pos))))
} }
// Otherwise terminate the indexing chain // Otherwise terminate the indexing chain
_ => { _ => {
@ -1257,11 +1255,13 @@ fn parse_primary(
} }
let (token, token_pos) = input.next().unwrap(); let (token, token_pos) = input.next().unwrap();
settings.pos = token_pos;
root_expr = match (root_expr, token) { root_expr = match (root_expr, token) {
// Function call // Function call
(Expr::Variable(x), Token::LeftParen) => { (Expr::Variable(x), Token::LeftParen) => {
let ((name, pos), modules, _, _) = *x; let ((name, pos), modules, _, _) = *x;
settings.pos = pos;
parse_call_expr(input, state, name, modules, settings.level_up())? parse_call_expr(input, state, name, modules, settings.level_up())?
} }
(Expr::Property(_), _) => unreachable!(), (Expr::Property(_), _) => unreachable!(),
@ -1269,6 +1269,7 @@ fn parse_primary(
(Expr::Variable(x), Token::DoubleColon) => match input.next().unwrap() { (Expr::Variable(x), Token::DoubleColon) => match input.next().unwrap() {
(Token::Identifier(id2), pos2) => { (Token::Identifier(id2), pos2) => {
let ((name, pos), mut modules, _, index) = *x; let ((name, pos), mut modules, _, index) = *x;
if let Some(ref mut modules) = modules { if let Some(ref mut modules) = modules {
modules.push((name, pos)); modules.push((name, pos));
} else { } else {
@ -1284,7 +1285,6 @@ fn parse_primary(
// Indexing // Indexing
#[cfg(not(feature = "no_index"))] #[cfg(not(feature = "no_index"))]
(expr, Token::LeftBracket) => { (expr, Token::LeftBracket) => {
settings.pos = token_pos;
parse_index_chain(input, state, expr, settings.level_up())? parse_index_chain(input, state, expr, settings.level_up())?
} }
// Unknown postfix operator // Unknown postfix operator