43 lines
1.2 KiB
Rust
43 lines
1.2 KiB
Rust
/* charset.rs
|
|
* Eryn Wells <eryn@erynwells.me>
|
|
*/
|
|
|
|
use std::collections::HashSet;
|
|
use std::iter::FromIterator;
|
|
|
|
pub type CharSet = HashSet<char>;
|
|
|
|
// TODO: Use std::sync::Once for these sets?
|
|
// https://doc.rust-lang.org/beta/std/sync/struct.Once.html
|
|
|
|
fn ascii_letters() -> CharSet {
|
|
let letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".chars();
|
|
CharSet::from_iter(letters)
|
|
}
|
|
|
|
fn ascii_digits() -> CharSet {
|
|
let digits = "1234567890".chars();
|
|
CharSet::from_iter(digits)
|
|
}
|
|
|
|
/// A set of all characters allowed to start Scheme identifiers.
|
|
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());
|
|
initials
|
|
}
|
|
|
|
/// A set of all characters allowed to follow an identifier initial.
|
|
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());
|
|
subsequents
|
|
}
|