Added tests, some fixes.

This commit is contained in:
Angus Holder
2017-02-23 01:07:25 +00:00
committed by Jakob Stoklund Olesen
parent a08e177595
commit 54a53b7ab7

View File

@@ -7,6 +7,7 @@
use std::str::CharIndices; use std::str::CharIndices;
use std::u16; use std::u16;
use std::ascii::AsciiExt;
use cretonne::ir::types; use cretonne::ir::types;
use cretonne::ir::{Value, Ebb}; use cretonne::ir::{Value, Ebb};
use error::Location; use error::Location;
@@ -340,12 +341,12 @@ impl<'a> Lexer<'a> {
fn scan_name(&mut self) -> Result<LocatedToken<'a>, LocatedError> { fn scan_name(&mut self) -> Result<LocatedToken<'a>, LocatedError> {
let loc = self.loc(); let loc = self.loc();
let begin = self.pos; let begin = self.pos + 1;
assert!(self.lookahead == Some('%')); assert!(self.lookahead == Some('%'));
while let Some(c) = self.next_ch() { while let Some(c) = self.next_ch() {
if !c.is_alphanumeric() && c != '_' { if !(c.is_ascii() && c.is_alphanumeric() || c == '_') {
break; break;
} }
} }
@@ -356,14 +357,13 @@ impl<'a> Lexer<'a> {
fn scan_hex_sequence(&mut self) -> Result<LocatedToken<'a>, LocatedError> { fn scan_hex_sequence(&mut self) -> Result<LocatedToken<'a>, LocatedError> {
let loc = self.loc(); let loc = self.loc();
let begin = self.pos; let begin = self.pos + 1;
assert!(self.lookahead == Some('#')); assert!(self.lookahead == Some('#'));
while let Some(c) = self.next_ch() { while let Some(c) = self.next_ch() {
match c { if !char::is_digit(c, 16) {
'a'...'f' | 'A'...'F' | '0'...'9' => {}, break;
_ => break,
} }
} }
@@ -478,7 +478,7 @@ mod tests {
assert_eq!(lex.next(), None); assert_eq!(lex.next(), None);
// Scan a comment after an invalid char. // Scan a comment after an invalid char.
let mut lex = Lexer::new("#; hello"); let mut lex = Lexer::new("$; hello");
assert_eq!(lex.next(), error(Error::InvalidChar, 1)); assert_eq!(lex.next(), error(Error::InvalidChar, 1));
assert_eq!(lex.next(), token(Token::Comment("; hello"), 1)); assert_eq!(lex.next(), token(Token::Comment("; hello"), 1));
assert_eq!(lex.next(), None); assert_eq!(lex.next(), None);
@@ -535,4 +535,27 @@ mod tests {
assert_eq!(lex.next(), token(Token::Identifier("f32x5"), 1)); assert_eq!(lex.next(), token(Token::Identifier("f32x5"), 1));
assert_eq!(lex.next(), None); assert_eq!(lex.next(), None);
} }
#[test]
fn lex_hex_sequences() {
let mut lex = Lexer::new("#0 #DEADbeef123 #789");
assert_eq!(lex.next(), token(Token::HexSequence("0"), 1));
assert_eq!(lex.next(), token(Token::HexSequence("DEADbeef123"), 1));
assert_eq!(lex.next(), token(Token::HexSequence("789"), 1));
}
#[test]
fn lex_names() {
let mut lex = Lexer::new("%0 %x3 %function %123_abc %ss0 %v3 %ebb11 %_");
assert_eq!(lex.next(), token(Token::Name("0"), 1));
assert_eq!(lex.next(), token(Token::Name("x3"), 1));
assert_eq!(lex.next(), token(Token::Name("function"), 1));
assert_eq!(lex.next(), token(Token::Name("123_abc"), 1));
assert_eq!(lex.next(), token(Token::Name("ss0"), 1));
assert_eq!(lex.next(), token(Token::Name("v3"), 1));
assert_eq!(lex.next(), token(Token::Name("ebb11"), 1));
assert_eq!(lex.next(), token(Token::Name("_"), 1));
}
} }