IncompleteReduction,
InfiniteFloat,
InvalidSingleQuotedCharacter(char),
- LexicalError(lexical::Error),
+ ParseFloat,
MissingQuote,
NonPrologChar,
ParseBigInt,
atom!("invalid_data")
}
ParserErrorKind::IO(_) => atom!("input_output_error"),
- ParserErrorKind::LexicalError(_) => atom!("lexical_error"),
+ ParserErrorKind::ParseFloat => atom!("parse_float"),
ParserErrorKind::MissingQuote => atom!("missing_quote"),
ParserErrorKind::NonPrologChar => atom!("non_prolog_character"),
ParserErrorKind::ParseBigInt => atom!("cannot_parse_big_int"),
}
}
-impl From<lexical::Error> for ParserError {
- fn from(e: lexical::Error) -> ParserError {
- ParserError {
- location: None,
- kind: ParserErrorKind::LexicalError(e),
- }
- }
-}
-
impl From<IOError> for ParserError {
fn from(e: IOError) -> ParserError {
ParserError {
) -> Result<(F64Offset, OrderedFloat<f64>), ParserError> {
self.return_char(token.pop().unwrap());
- let n = parse_float_lossy(&token)?;
+ let n = self.parse_float_lossy(&token)?;
let offset = float_alloc!(n, self.machine_st.arena);
Ok((offset, OrderedFloat(n)))
}
}
- let n = parse_float_lossy(&token)?;
+ let n = self.parse_float_lossy(&token)?;
let offset = float_alloc!(n, self.machine_st.arena);
Ok(NumberToken::Float(offset, OrderedFloat(n)))
.map(|(offset, fl)| NumberToken::Float(offset, fl))
}
} else {
- let n = parse_float_lossy(&token)?;
+ let n = self.parse_float_lossy(&token)?;
let offset = float_alloc!(n, self.machine_st.arena);
Ok(NumberToken::Float(offset, OrderedFloat(n)))
}
Ok(NumberToken::Partial(token_string)) => match self.parse_integer(&token_string) {
Ok(n) => Ok(Token::Literal(n.to_literal())),
Err(_) => {
- let n = parse_float_lossy(&token_string)?;
+ let n = self.parse_float_lossy(&token_string)?;
let offset = float_alloc!(n, self.machine_st.arena);
Ok(Token::Literal(Literal::F64(offset, OrderedFloat(n))))
}
Err(e) => Err(e),
}
}
-}
-fn parse_float_lossy(token: &str) -> Result<f64, ParserError> {
- const FORMAT: u128 = lexical::format::STANDARD;
- let options = lexical::ParseFloatOptions::builder()
- .lossy(true)
- .build()
- .unwrap();
- let n = lexical::parse_with_options::<f64, _, FORMAT>(token.as_bytes(), &options)?;
- Ok(n)
+ fn parse_float_lossy(&self, token: &str) -> Result<f64, ParserError> {
+ const FORMAT: u128 = lexical::format::STANDARD;
+ let Ok(options) = lexical::ParseFloatOptions::builder().lossy(true).build() else {
+ return Err(self.located_error(ParserErrorKind::ParseFloat));
+ };
+
+ let Ok(n) = lexical::parse_with_options::<f64, _, FORMAT>(token.as_bytes(), &options)
+ else {
+ return Err(self.located_error(ParserErrorKind::ParseFloat));
+ };
+ Ok(n)
+ }
}