CPC/src/main.rs
2019-12-21 16:49:37 +01:00

120 lines
1.9 KiB
Rust

use std::time::{Instant};
use decimal::d128;
#[derive(Clone, Debug)]
pub enum Operator {
Plus,
Minus,
Multiply,
Divide,
Modulo,
Percent,
Caret,
Factorial,
LeftParen, // lexer only
RightParen, // lexer only
}
#[derive(Clone, Debug)]
pub enum TextOperator {
To,
Of,
}
#[derive(Clone, Debug)]
pub enum Constant {
Pi,
E,
}
#[derive(Clone, Debug)]
pub enum FunctionIdentifier {
Sqrt,
Cbrt,
Log,
Ln,
Exp,
Ceil,
Floor,
Round,
Fabs,
Sin,
Cos,
Tan,
Asin,
Acos,
Atan,
Sinh,
Cosh,
Tanh,
Asinh,
Acosh,
Atanh,
}
#[derive(Clone, Copy, Debug)]
pub enum Unit {
Nanosecond,
Microsecond,
Millisecond,
Second,
Minute,
Hour,
Day,
Week,
Month,
Quarter,
Year,
Decade,
Century,
Milleniums,
}
#[derive(Clone, Debug)]
pub enum Token {
Operator(Operator),
Number(d128),
FunctionIdentifier(FunctionIdentifier),
Constant(Constant),
Paren, // parser only
TextOperator(TextOperator),
Negative, // parser only
Unit(Unit),
}
pub type TokenVector = Vec<Token>;
mod lexer;
mod parser;
fn main() {
let lex_start = Instant::now();
use std::env;
let args: Vec<String> = env::args().collect();
let s = if args.len() >= 2 { &args[1] } else { "0.1" };
match lexer::lex(s) {
Ok(tokens) => {
let lex_time = Instant::now().duration_since(lex_start).as_nanos() as f32;
println!("Lexed TokenVector: {:?}", tokens);
let parse_start = Instant::now();
match parser::parse(&tokens) {
Ok(ast) => {
let parse_time = Instant::now().duration_since(parse_start).as_nanos() as f32;
println!("Parsed AstNode: {:#?}", ast);
println!("\u{23f1} {:.3}ms lexing", lex_time/1000.0/1000.0);
println!("\u{23f1} {:.3}ms parsing", parse_time/1000.0/1000.0);
},
Err(e) => println!("parsing error: {}", e),
}
},
Err(e) => println!("lexing error: {}", e),
}
}