diff --git a/mers/src/parse/file.rs b/mers/src/parse/file.rs index 89b0d21..9c92e23 100755 --- a/mers/src/parse/file.rs +++ b/mers/src/parse/file.rs @@ -116,7 +116,7 @@ impl File { &self.pos } pub fn get_ppos(&self) -> &FilePosition { - &self.pos + &self.ppos } pub fn set_pos(&mut self, pos: FilePosition) { self.pos = pos; diff --git a/mers/src/parse/parse.rs b/mers/src/parse/parse.rs index 41e4e64..7f44738 100755 --- a/mers/src/parse/parse.rs +++ b/mers/src/parse/parse.rs @@ -593,6 +593,7 @@ fn parse_statement_adv( let mut pot_float = String::new(); for ch in &mut *file { if ch.is_whitespace() || is_delimeter(ch) { + file.set_pos(*file.get_ppos()); break; } pot_float.push(ch); @@ -758,41 +759,38 @@ fn parse_function( file.skip_whitespaces(); // find the arguments to the function let mut args = Vec::new(); - loop { - match file.peek() { - Some(')') => { - file.next(); - break; - } - _ => (), - } - let mut arg_name = String::new(); + if let Some(')') = file.peek() { + file.next(); + } else { loop { - let err_fn_arg_name_start = *file.get_pos(); - match file.next() { - Some(ch) if ch.is_whitespace() => break, - Some(ch) => arg_name.push(ch), - None => { - return Err(ParseError { - err: ParseErrors::FoundEofInFunctionArgName, - location: err_fn_arg_name_start, - location_end: Some(*file.get_pos()), - context: vec![if let Some(err_fn_start) = err_fn_start { - ( - format!("the function"), - Some((err_fn_start, Some(*file.get_pos()))), - ) - } else { - (format!("not a real fn definition"), None) - }], - }) + let mut arg_name = String::new(); + loop { + let err_fn_arg_name_start = *file.get_pos(); + match file.next() { + Some(ch) if ch.is_whitespace() => break, + Some(ch) => arg_name.push(ch), + None => { + return Err(ParseError { + err: ParseErrors::FoundEofInFunctionArgName, + location: err_fn_arg_name_start, + location_end: Some(*file.get_pos()), + context: vec![if let Some(err_fn_start) = err_fn_start { + ( + format!("the function"), + Some((err_fn_start, Some(*file.get_pos()))), + ) + } else { + (format!("not a real fn definition"), None) + }], + }) + } } } - } - let (t, brk) = parse_type_adv(file, true)?; - args.push((arg_name, t)); - if brk { - break; + let (t, brk) = parse_type_adv(file, true)?; + args.push((arg_name, t)); + if brk { + break; + } } } Ok(SFunction::new(args, parse_block(file)?))