From e8ab38fda0c2dbefb7ea246f5d065a6003cf6b1c Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Thu, 13 Oct 2016 00:08:31 -0400 Subject: [PATCH] Cleanup symbol pattern matching --- TODO.md | 2 ++ src/lang/tokenizer.rs | 73 +++++++++++++------------------------------ 2 files changed, 23 insertions(+), 52 deletions(-) diff --git a/TODO.md b/TODO.md index 7db984c00f..cff6e3cd87 100644 --- a/TODO.md +++ b/TODO.md @@ -9,12 +9,14 @@ Audio Samples Tokenizing - Plurals + - Decimal numbers - Times (9 p.m. ET) Parsing - (Everything in tokenizing) - CamelCase - hyphenated-words + - Monetary units ($10 -> ten dollars, $10 million -> ten million dollars) - Dates - Numbers that are years (2016)! - Twitter hashtags, usernames diff --git a/src/lang/tokenizer.rs b/src/lang/tokenizer.rs index 94ca55aedf..0c409f5666 100644 --- a/src/lang/tokenizer.rs +++ b/src/lang/tokenizer.rs @@ -142,58 +142,27 @@ impl Tokenizer { continue; } - // FIXME: Speed up by converting to a hash lookup. - // Rogue puncuation - if unknown == "," { - output.push_back(Token::comma()); - continue; - } else if unknown == "." { - output.push_back(Token::period()); - continue; - } - - // Symbols - // FIXME: Map lookup for speedup. - if unknown == "@" { - output.push_back(Token::at_sign()); - continue; - } else if unknown == "&" { - output.push_back(Token::ampersand()); - continue; - } else if unknown == "%" { - output.push_back(Token::percent()); - continue; - } else if unknown == "<" { - output.push_back(Token::less_than()); - continue; - } else if unknown == ">" { - output.push_back(Token::greater_than()); - continue; - } else if unknown == "+" { - output.push_back(Token::plus()); - continue; - } - - // Currency Symbols - // FIXME: Map lookup for speedup. - if unknown == "Ƀ" { - output.push_back(Token::bitcoin()); - continue; - } else if unknown == "¢" { - output.push_back(Token::cent()); - continue; - } else if unknown == "$" { - output.push_back(Token::dollar()); - continue; - } else if unknown == "€" { - output.push_back(Token::euro()); - continue; - } else if unknown == "£" || unknown == "₤" { - output.push_back(Token::pound()); - continue; - } else if unknown == "¥" { - output.push_back(Token::yen()); - continue; + // Handle single characters + // FIXME: Is a hash lookup faster? + match unknown.as_ref() { + // Punctuation + "," => { output.push_back(Token::comma()); continue; }, + "." => { output.push_back(Token::period()); continue; }, + // Symbols + "@" => { output.push_back(Token::at_sign()); continue; }, + "&" => { output.push_back(Token::ampersand()); continue; }, + "%" => { output.push_back(Token::percent()); continue; }, + "<" => { output.push_back(Token::less_than()); continue; }, + ">" => { output.push_back(Token::greater_than()); continue; }, + "+" => { output.push_back(Token::plus()); continue; }, + // Currency symbols + "Ƀ" => { output.push_back(Token::bitcoin()); continue; }, + "¢" => { output.push_back(Token::cent()); continue; }, + "$" => { output.push_back(Token::dollar()); continue; }, + "€" => { output.push_back(Token::euro()); continue; }, + "£" | "₤" => { output.push_back(Token::pound()); continue; }, + "¥" => { output.push_back(Token::yen()); continue; }, + _ => {}, } if URL.is_match(&unknown) {