Remove all ParseErrors that don't return the failed token

This commit is contained in:
greg 2019-01-08 01:00:40 -08:00
parent ee7861cbd0
commit 09e2d8579d

View File

@ -17,13 +17,6 @@ pub struct ParseError {
} }
impl ParseError { impl ParseError {
fn new<T>(msg: &str) -> ParseResult<T> {
Err(ParseError {
msg: msg.to_string(),
token: None
})
}
fn new_with_token<T>(msg: &str, t: Token) -> ParseResult<T>{ fn new_with_token<T>(msg: &str, t: Token) -> ParseResult<T>{
Err(ParseError { Err(ParseError {
msg: msg.to_string(), msg: msg.to_string(),
@ -506,7 +499,7 @@ impl Parser {
_ => None _ => None
}; };
if let Some(_) = expr_body.1 { if let Some(_) = expr_body.1 {
return ParseError::new("Bad parse state"); return ParseError::new_with_token("Bad parse state encountered", self.token_handler.peek());
} }
expr_body.1 = type_anno; expr_body.1 = type_anno;
Ok(expr_body) Ok(expr_body)
@ -637,7 +630,7 @@ impl Parser {
#[recursive_descent_method] #[recursive_descent_method]
fn curly_brace_expr(&mut self) -> ParseResult<Expression> { fn curly_brace_expr(&mut self) -> ParseResult<Expression> {
ParseError::new("Not implemented") ParseError::new_with_token("Not implemented", self.token_handler.peek())
} }
#[recursive_descent_method] #[recursive_descent_method]
@ -1034,12 +1027,12 @@ impl Parser {
match tok.get_kind() { match tok.get_kind() {
BinNumberSigil => { BinNumberSigil => {
let digits = self.digits()?; let digits = self.digits()?;
let n = parse_binary(digits)?; let n = parse_binary(digits, tok)?;
Ok(Expression(NatLiteral(n), None)) Ok(Expression(NatLiteral(n), None))
}, },
HexLiteral(text) => { HexLiteral(text) => {
let digits: String = text.chars().filter(|c| c.is_digit(16)).collect(); let digits: String = text.chars().filter(|c| c.is_digit(16)).collect();
let n = parse_hex(digits)?; let n = parse_hex(digits, tok)?;
Ok(Expression(NatLiteral(n), None)) Ok(Expression(NatLiteral(n), None))
}, },
_ => return ParseError::new_with_token("Expected '0x' or '0b'", tok), _ => return ParseError::new_with_token("Expected '0x' or '0b'", tok),
@ -1049,6 +1042,7 @@ impl Parser {
#[recursive_descent_method] #[recursive_descent_method]
fn float_literal(&mut self) -> ParseResult<Expression> { fn float_literal(&mut self) -> ParseResult<Expression> {
use self::ExpressionType::*; use self::ExpressionType::*;
let tok = self.token_handler.peek();
let mut digits = self.digits()?; let mut digits = self.digits()?;
if let Period = self.token_handler.peek_kind() { if let Period = self.token_handler.peek_kind() {
self.token_handler.next(); self.token_handler.next();
@ -1056,13 +1050,13 @@ impl Parser {
digits.push_str(&self.digits()?); digits.push_str(&self.digits()?);
match digits.parse::<f64>() { match digits.parse::<f64>() {
Ok(f) => Ok(Expression(FloatLiteral(f), None)), Ok(f) => Ok(Expression(FloatLiteral(f), None)),
Err(e) => ParseError::new(&format!("Float failed to parse with error: {}", e)), Err(e) => ParseError::new_with_token(&format!("Float failed to parse with error: {}", e), tok),
} }
} else { } else {
match digits.parse::<u64>() { match digits.parse::<u64>() {
Ok(d) => Ok(Expression(NatLiteral(d), None)), Ok(d) => Ok(Expression(NatLiteral(d), None)),
Err(e) => ParseError::new(&format!("Integer failed to parse with error: {}", e)), Err(e) => ParseError::new_with_token(&format!("Integer failed to parse with error: {}", e), tok),
} }
} }
} }
@ -1081,34 +1075,34 @@ impl Parser {
} }
} }
fn parse_binary(digits: String) -> ParseResult<u64> { fn parse_binary(digits: String, tok: Token) -> ParseResult<u64> {
let mut result: u64 = 0; let mut result: u64 = 0;
let mut multiplier = 1; let mut multiplier = 1;
for d in digits.chars().rev() { for d in digits.chars().rev() {
match d { match d {
'1' => result += multiplier, '1' => result += multiplier,
'0' => (), '0' => (),
_ => return ParseError::new("Encountered a character not '1' or '0 while parsing a binary literal"), _ => return ParseError::new_with_token("Encountered a character not '1' or '0 while parsing a binary literal", tok),
} }
multiplier = match multiplier.checked_mul(2) { multiplier = match multiplier.checked_mul(2) {
Some(m) => m, Some(m) => m,
None => return ParseError::new("This binary expression will overflow") None => return ParseError::new_with_token("This binary expression will overflow", tok)
} }
} }
Ok(result) Ok(result)
} }
fn parse_hex(digits: String) -> ParseResult<u64> { fn parse_hex(digits: String, tok: Token) -> ParseResult<u64> {
let mut result: u64 = 0; let mut result: u64 = 0;
let mut multiplier: u64 = 1; let mut multiplier: u64 = 1;
for d in digits.chars().rev() { for d in digits.chars().rev() {
match d.to_digit(16) { match d.to_digit(16) {
Some(n) => result += n as u64 * multiplier, Some(n) => result += n as u64 * multiplier,
None => return ParseError::new("Encountered a non-hex digit in a hex literal"), None => return ParseError::new_with_token("Encountered a non-hex digit in a hex literal", tok),
} }
multiplier = match multiplier.checked_mul(16) { multiplier = match multiplier.checked_mul(16) {
Some(m) => m, Some(m) => m,
None => return ParseError::new("This hex expression will overflow") None => return ParseError::new_with_token("This hex expression will overflow", tok)
} }
} }
Ok(result) Ok(result)