Allow CLIF lexer to properly identify NaN and Inf keywords

This commit is contained in:
Andrew Brown
2019-10-28 13:21:43 -07:00
parent 7e32fa2731
commit e5a36e2c61
2 changed files with 10 additions and 3 deletions

View File

@@ -488,7 +488,13 @@ impl<'a> Lexer<'a> {
} }
} }
Some(ch) if ch.is_digit(10) => Some(self.scan_number()), Some(ch) if ch.is_digit(10) => Some(self.scan_number()),
Some(ch) if ch.is_alphabetic() => Some(self.scan_word()), Some(ch) if ch.is_alphabetic() => {
if self.looking_at("NaN") || self.looking_at("Inf") {
Some(self.scan_number())
} else {
Some(self.scan_word())
}
}
Some('%') => Some(self.scan_name()), Some('%') => Some(self.scan_name()),
Some('"') => Some(self.scan_string()), Some('"') => Some(self.scan_string()),
Some('#') => Some(self.scan_hex_sequence()), Some('#') => Some(self.scan_hex_sequence()),
@@ -593,7 +599,7 @@ mod tests {
#[test] #[test]
fn lex_numbers() { fn lex_numbers() {
let mut lex = Lexer::new(" 0 2_000 -1,0xf -0x0 0.0 0x0.4p-34 +5"); let mut lex = Lexer::new(" 0 2_000 -1,0xf -0x0 0.0 0x0.4p-34 NaN +5");
assert_eq!(lex.next(), token(Token::Integer("0"), 1)); assert_eq!(lex.next(), token(Token::Integer("0"), 1));
assert_eq!(lex.next(), token(Token::Integer("2_000"), 1)); assert_eq!(lex.next(), token(Token::Integer("2_000"), 1));
assert_eq!(lex.next(), token(Token::Integer("-1"), 1)); assert_eq!(lex.next(), token(Token::Integer("-1"), 1));
@@ -602,6 +608,7 @@ mod tests {
assert_eq!(lex.next(), token(Token::Integer("-0x0"), 1)); assert_eq!(lex.next(), token(Token::Integer("-0x0"), 1));
assert_eq!(lex.next(), token(Token::Float("0.0"), 1)); assert_eq!(lex.next(), token(Token::Float("0.0"), 1));
assert_eq!(lex.next(), token(Token::Float("0x0.4p-34"), 1)); assert_eq!(lex.next(), token(Token::Float("0x0.4p-34"), 1));
assert_eq!(lex.next(), token(Token::Float("NaN"), 1));
assert_eq!(lex.next(), token(Token::Integer("+5"), 1)); assert_eq!(lex.next(), token(Token::Integer("+5"), 1));
assert_eq!(lex.next(), None); assert_eq!(lex.next(), None);
} }

View File

@@ -896,7 +896,7 @@ impl<'a> Parser<'a> {
I16 => consume!(ty, self.match_imm16("Expected a 16-bit integer")?), I16 => consume!(ty, self.match_imm16("Expected a 16-bit integer")?),
I32 => consume!(ty, self.match_imm32("Expected a 32-bit integer")?), I32 => consume!(ty, self.match_imm32("Expected a 32-bit integer")?),
I64 => consume!(ty, self.match_imm64("Expected a 64-bit integer")?), I64 => consume!(ty, self.match_imm64("Expected a 64-bit integer")?),
F32 => consume!(ty, self.match_ieee32("Expected a 32-bit float...")?), F32 => consume!(ty, self.match_ieee32("Expected a 32-bit float")?),
F64 => consume!(ty, self.match_ieee64("Expected a 64-bit float")?), F64 => consume!(ty, self.match_ieee64("Expected a 64-bit float")?),
b if b.is_bool() => consume!( b if b.is_bool() => consume!(
ty, ty,