From ac4cff9a51d07bd8e5be02d24428305c4d366e9f Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Mon, 19 Dec 2016 22:23:27 -0800 Subject: [PATCH] Add a bunch of character stuff to the lexer module --- src/lexer.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 7 ++++++- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/lexer.rs diff --git a/src/lexer.rs b/src/lexer.rs new file mode 100644 index 0000000..da64c02 --- /dev/null +++ b/src/lexer.rs @@ -0,0 +1,56 @@ +//! # Lexer + +mod characters { + use std::collections::HashSet; + use std::iter::FromIterator; + + pub type CharSet = HashSet; + + pub fn ascii_letters() -> CharSet { + let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".chars(); + return CharSet::from_iter(letters); + } + + pub fn ascii_digits() -> CharSet { + let digits = "1234567890".chars(); + return CharSet::from_iter(digits); + } + + pub fn identifier_initials() -> CharSet { + let letters = ascii_letters(); + let extras = CharSet::from_iter("!$%&*/:<=>?~_^".chars()); + let mut initials = CharSet::new(); + initials.extend(letters.iter()); + initials.extend(extras.iter()); + return initials; + } + + pub fn identifier_subsequents() -> CharSet { + let initials = identifier_initials(); + let digits = ascii_digits(); + let extras = CharSet::from_iter(".+-".chars()); + let mut subsequents = CharSet::new(); + subsequents.extend(initials.iter()); + subsequents.extend(digits.iter()); + subsequents.extend(extras.iter()); + return subsequents; + } +} + +enum Kind { + LeftParen, + RightParen, + Identifier, +} + +struct Token { + kind: Kind, + value: String, +} + +pub fn hello(person: &str) { + println!("Hello, {}!", person); + for (idx, c) in person.char_indices() { + println!(" {}, {} -> {}", c, idx, characters::ascii_letters().contains(&c)); + } +} diff --git a/src/main.rs b/src/main.rs index e7a11a9..f502165 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,8 @@ +mod lexer; + fn main() { - println!("Hello, world!"); + lexer::hello("Eryn"); + lexer::hello("Emily"); + let s = "Jonas".to_string(); + lexer::hello(&s); }