diff options
Diffstat (limited to 'crates/rebel-parse/examples/parse-string.rs')
-rw-r--r-- | crates/rebel-parse/examples/parse-string.rs | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/crates/rebel-parse/examples/parse-string.rs b/crates/rebel-parse/examples/parse-string.rs new file mode 100644 index 0000000..9750a87 --- /dev/null +++ b/crates/rebel-parse/examples/parse-string.rs @@ -0,0 +1,70 @@ +use std::{fmt::Debug, process, time::Instant}; + +use clap::{Parser, ValueEnum}; + +use rebel_parse::{recipe, tokenize}; + +#[derive(Clone, Debug, PartialEq, Eq, ValueEnum)] +enum Rule { + Tokenize, + Recipe, + RecipeStmt, + Block, + BlockStmt, + Expr, + Type, + Pat, +} + +#[derive(Clone, Debug, Parser)] +struct Opts { + rule: Rule, + input: String, +} + +fn main() { + let opts: Opts = Opts::parse(); + let input = opts.input.trim(); + + fn as_debug<'a>(v: impl Debug + 'a) -> Box<dyn Debug + 'a> { + Box::new(v) + } + + let start = Instant::now(); + let result = tokenize::token_stream(input); + let dur = Instant::now().duration_since(start); + println!("Tokenization took {} µs", dur.as_micros()); + + let tokens = match result { + Ok(value) => value, + Err(err) => { + println!("{err}"); + process::exit(1); + } + }; + + let start = Instant::now(); + let result = match opts.rule { + Rule::Tokenize => Ok(as_debug(tokens)), + Rule::Recipe => recipe::recipe(&tokens).map(as_debug), + Rule::RecipeStmt => recipe::recipe_stmt(&tokens).map(as_debug), + Rule::Block => recipe::block(&tokens).map(as_debug), + Rule::BlockStmt => recipe::block_stmt(&tokens).map(as_debug), + Rule::Expr => recipe::expr(&tokens).map(as_debug), + Rule::Type => recipe::typ(&tokens).map(as_debug), + Rule::Pat => recipe::pat(&tokens).map(as_debug), + }; + if opts.rule != Rule::Tokenize { + let dur = Instant::now().duration_since(start); + println!("Parsing took {} µs", dur.as_micros()); + } + + match result { + Ok(value) => { + println!("{value:#?}"); + } + Err(err) => { + println!("{err}"); + } + }; +} |