From f02240da8727a57bbaa31c1a3ae2a10381b800e4 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Tue, 20 Dec 2016 17:38:44 -0800 Subject: [PATCH] Add characters module --- src/characters.rs | 67 +++++++++++++++++++++++++++++++++++++++++++++++ src/lexer.rs | 52 +++++++++++------------------------- src/main.rs | 1 + 3 files changed, 84 insertions(+), 36 deletions(-) create mode 100644 src/characters.rs diff --git a/src/characters.rs b/src/characters.rs new file mode 100644 index 0000000..d6462d9 --- /dev/null +++ b/src/characters.rs @@ -0,0 +1,67 @@ +//! Characters +//! +//! Utilities for dealing with chars of various sorts. + +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; +} + +pub trait RelativeIndexable { + fn index_before(&self, &usize) -> usize; + fn index_after(&self, &usize) -> usize; +} + +impl RelativeIndexable for str { + fn index_before(&self, index: &usize) -> usize { + let mut prev_index = index - 1; + if prev_index <= 0 { + return 0; + } + while !self.is_char_boundary(prev_index) { + prev_index -= 1; + } + return prev_index; + } + + fn index_after(&self, index: &usize) -> usize { + let mut next_index = index + 1; + if next_index > self.len() { + return self.len(); + } + while !self.is_char_boundary(next_index) { + next_index += 1; + } + return next_index; + } +} diff --git a/src/lexer.rs b/src/lexer.rs index da64c02..8867520 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -1,41 +1,6 @@ //! # 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; - } -} +use characters; enum Kind { LeftParen, @@ -48,6 +13,21 @@ struct Token { value: String, } +struct Lexer { + input: str, +} + +impl Lexer { +} + +impl Iterator for Lexer { + type Item = Token; + + fn next(&mut self) -> Option { + None + } +} + pub fn hello(person: &str) { println!("Hello, {}!", person); for (idx, c) in person.char_indices() { diff --git a/src/main.rs b/src/main.rs index f502165..66c9834 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +mod characters; mod lexer; fn main() {