logos calculator example
This commit is contained in:
parent
d974798fcb
commit
0c30f0022d
9 changed files with 414 additions and 22 deletions
36
src/main.rs
Normal file
36
src/main.rs
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
use chumsky::Parser;
|
||||
use logos::Logos;
|
||||
|
||||
use crate::{parser::parser, tokens::Token};
|
||||
|
||||
mod tokens;
|
||||
mod ast;
|
||||
mod parser;
|
||||
|
||||
fn main() {
|
||||
let lexer = Token::lexer("(1 + 1) * 3");
|
||||
|
||||
let mut tokens = vec![];
|
||||
for (token, span) in lexer.spanned() {
|
||||
match token {
|
||||
Ok(token) => tokens.push(token),
|
||||
Err(e) => {
|
||||
println!("lexer error at {:?}: {:?}", span, e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let ast = match parser().parse(&tokens).into_result() {
|
||||
Ok(expr) => {
|
||||
println!("[AST]\n{:#?}", expr);
|
||||
expr
|
||||
}
|
||||
Err(e) => {
|
||||
println!("parse error: {:#?}", e);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
println!("\n[result]\n{}", ast.eval());
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue