jayce
jayce is a tokenizer 🌌
Example
use jayce::{Duo, SeekResult, Tokenizer};
const SOURCE: &str = "Excalibur = 5000$; // Your own language!";
lazy_static::lazy_static! {
static ref DUOS: Vec<Duo<&'static str>> = vec![
Duo::new("whitespace", r"^[^\S\n]+", false),
Duo::new("commentLine", r"^//(.*)", false),
Duo::new("commentBlock", r"^/\*(.|\n)*?\*/", false),
Duo::new("newline", r"^\n", false),
Duo::new("price", r"^[0-9]+\$", true),
Duo::new("semicolon", r"^;", true),
Duo::new("operator", r"^=", true),
Duo::new("name", r"^[a-zA-Z_]+", true)
];
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut tokenizer = Tokenizer::new(SOURCE, &DUOS);
while let Ok(tokenize_result) = tokenizer.seek() {
match tokenize_result {
SeekResult::Match(token) => println!("{:?}", token),
SeekResult::Skipped => continue,
SeekResult::End => break,
}
}
Ok(())
}
Result
Token { kind: "name", value: "Excalibur", pos: (1, 1) }
Token { kind: "operator", value: "=", pos: (1, 11) }
Token { kind: "price", value: "5000$", pos: (1, 13) }
Token { kind: "semicolon", value: ";", pos: (1, 18) }
Info
tokenizer.seek() returns Result
Ok(SeekResult) seeking next token is successful
Err(error) an error occurs
SeekResult
Match(Token<T>) match found
Skipped match found but token is not preserved
End end of source
tokenizer.tokenize_all() returns Result
Ok(Vec<Tokens>) tokens are found
Err(error) an error occurs
Performances
tokenization of Yuumi project's language tokens
3.8 milliseconds with referenced tokens and serialization disabled
5.0 milliseconds with owned tokens and serialization available
Features
serialization
generic-simd
runtime-dispatch-simd enabled by default, to disable modify Cargo.toml as follows
jayce = { version = "X.X.X", default-features = false }