From e5a36e2c611935d352e3d4349f9de691660dc590 Mon Sep 17 00:00:00 2001 From: Andrew Brown Date: Mon, 28 Oct 2019 13:21:43 -0700 Subject: [PATCH] Allow CLIF lexer to properly identify `NaN` and `Inf` keywords --- cranelift/reader/src/lexer.rs | 11 +++++++++-- cranelift/reader/src/parser.rs | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/cranelift/reader/src/lexer.rs b/cranelift/reader/src/lexer.rs index 0168d2027a..9838227e86 100644 --- a/cranelift/reader/src/lexer.rs +++ b/cranelift/reader/src/lexer.rs @@ -488,7 +488,13 @@ impl<'a> Lexer<'a> { } } 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_string()), Some('#') => Some(self.scan_hex_sequence()), @@ -593,7 +599,7 @@ mod tests { #[test] 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("2_000"), 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::Float("0.0"), 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(), None); } diff --git a/cranelift/reader/src/parser.rs b/cranelift/reader/src/parser.rs index 01b10cac97..8b603c7870 100644 --- a/cranelift/reader/src/parser.rs +++ b/cranelift/reader/src/parser.rs @@ -896,7 +896,7 @@ impl<'a> Parser<'a> { I16 => consume!(ty, self.match_imm16("Expected a 16-bit integer")?), I32 => consume!(ty, self.match_imm32("Expected a 32-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")?), b if b.is_bool() => consume!( ty,