A simple flex
-like lexing/tokenizing library written in Rust
Workflow:
Token
enum with all possible tokens that implements Clone
Ruleset
with Ruleset::<Token>::new()
add_rule()
, add_simple()
, and add_noop()
lex()
with the string to be tokenizedExample code for tokenizing a simple calculator language:
```rust extern crate reflex;
use std::io; use std::fmt; use reflex::{Ruleset, lex};
enum Token { Number(f64), OpAdd, OpSub, OpMul, OpDiv, OpPow, }
impl fmt::Display for Token { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{}", match self { Token::Number(n) => n.to_string(), Token::OpAdd => "+".to_string(), Token::OpSub => "-".to_string(), Token::OpMul => "".tostring(), Token::OpDiv => "/".tostring(), Token::OpPow => "^".tostring(), }.tostring()) } }
fn main() { let mut program = String::new(); io::stdin().read_line(&mut program).unwrap();
let mut ruleset: Ruleset<Token> = Ruleset::new();
ruleset.add_rule(r"-?[0-9]*\.?[0-9]+", |token| Token::Number(token.parse().unwrap_or(0.0)));
ruleset.add_simple(r"\+", Token::OpAdd);
ruleset.add_simple(r"-", Token::OpSub);
ruleset.add_simple(r"\*", Token::OpMul);
ruleset.add_simple(r"/", Token::OpDiv);
ruleset.add_simple(r"\^", Token::OpPow);
ruleset.add_noop(r"(?s)\s");
for token in lex(&ruleset, program) {
println!("{}", token.unwrap());
}
} ```