forked from asklyphe-public/asklyphe
Fix build
This commit is contained in:
parent
0725850ad0
commit
fe539a637e
1 changed files with 27 additions and 15 deletions
|
@ -20,13 +20,19 @@ pub fn calculate(query: &str) -> Option<Calculation> {
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum Token {
|
enum Token {
|
||||||
Op(Op),
|
Op(Op),
|
||||||
Atom(f64),
|
Atom(Atom),
|
||||||
/* Number(f64),
|
/* Number(f64),
|
||||||
Func(Func),*/
|
Func(Func),*/
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum Op {
|
enum Op {
|
||||||
|
BinOp(BinOp),
|
||||||
|
Func(Func), // A function is an Op that takes whatever the next thing is and binds it, either the next number or whatever is in parens
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum BinOp {
|
||||||
Add,
|
Add,
|
||||||
Subtract,
|
Subtract,
|
||||||
Multiply,
|
Multiply,
|
||||||
|
@ -34,12 +40,12 @@ enum Op {
|
||||||
Exponent,
|
Exponent,
|
||||||
LParen,
|
LParen,
|
||||||
RParen,
|
RParen,
|
||||||
Func(Func)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum Atom {
|
enum Atom {
|
||||||
Number(f64),
|
Number(f64), // TODO: use the unlimited precision floats library instead
|
||||||
|
Const(Const),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -58,6 +64,12 @@ enum Func {
|
||||||
SquareRoot,
|
SquareRoot,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum Const {
|
||||||
|
Pi,
|
||||||
|
E,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum LexErr {
|
enum LexErr {
|
||||||
Eof,
|
Eof,
|
||||||
|
@ -75,7 +87,7 @@ struct Lexer<'a> {
|
||||||
// TODO: refactor with iterator that returns Option(Token) where one token option is Eof (or a enum of Token(Token) and Eof, or just Option(Option(Token)))
|
// TODO: refactor with iterator that returns Option(Token) where one token option is Eof (or a enum of Token(Token) and Eof, or just Option(Option(Token)))
|
||||||
impl Lexer<'_> {
|
impl Lexer<'_> {
|
||||||
|
|
||||||
fn new(data: &str) -> Lexer { Lexer {data, data_ptr: data, idx: 0} }
|
fn new(data: &str) -> Lexer<'_> { Lexer {data, data_ptr: data, idx: 0} }
|
||||||
|
|
||||||
fn next(&mut self) -> Result<Token, LexErr> {
|
fn next(&mut self) -> Result<Token, LexErr> {
|
||||||
match self.data.chars().nth(self.idx) {
|
match self.data.chars().nth(self.idx) {
|
||||||
|
@ -86,22 +98,22 @@ impl Lexer<'_> {
|
||||||
// TODO: make more efficient
|
// TODO: make more efficient
|
||||||
self.data_ptr = &self.data[self.idx..];
|
self.data_ptr = &self.data[self.idx..];
|
||||||
match val {
|
match val {
|
||||||
'+' => Ok(Token::Add),
|
'+' => Ok(Token::Op(Op::BinOp(BinOp::Add))),
|
||||||
'-' => Ok(Token::Subtract),
|
'-' => Ok(Token::Op(Op::BinOp(BinOp::Subtract))),
|
||||||
'×' | '*' => Ok(Token::Multiply),
|
'×' | '*' => Ok(Token::Op(Op::BinOp(BinOp::Multiply))),
|
||||||
'÷' | '/' => Ok(Token::Divide),
|
'÷' | '/' => Ok(Token::Op(Op::BinOp(BinOp::Divide))),
|
||||||
'^' => Ok(Token::Exponent),
|
'^' => Ok(Token::Op(Op::BinOp(BinOp::Exponent))),
|
||||||
'(' => Ok(Token::LParen),
|
'(' => Ok(Token::Op(Op::BinOp(BinOp::LParen))),
|
||||||
')' => Ok(Token::RParen),
|
')' => Ok(Token::Op(Op::BinOp(BinOp::RParen))),
|
||||||
_ if val.is_whitespace() => self.next(),
|
_ if val.is_whitespace() => self.next(),
|
||||||
// TODO: parse - as part of number so I can do '1 + -1' and similar
|
// TODO: maybe parse '-' as part of number so I can do '1 + -1' and similar
|
||||||
_ if val.is_digit(10) => {
|
_ if val.is_digit(10) => {
|
||||||
let start = self.idx - 1;
|
let start = self.idx - 1;
|
||||||
|
|
||||||
self.data_ptr.chars().take_while(|c| c.is_digit(10)).for_each(|_| self.idx += 1);//.next().unwrap_or(' ').is_digit(10) {self.idx += 1;}
|
self.data_ptr.chars().take_while(|c| c.is_digit(10)).for_each(|_| self.idx += 1);//.next().unwrap_or(' ').is_digit(10) {self.idx += 1;}
|
||||||
|
|
||||||
match self.data[start..self.idx].parse() {
|
match self.data[start..self.idx].parse() {
|
||||||
Ok(val) => Ok(Token::Number(val)),
|
Ok(val) => Ok(Token::Atom(Atom::Number(val))),
|
||||||
Err(e) => Err(LexErr::Invalid),
|
Err(e) => Err(LexErr::Invalid),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -149,8 +161,8 @@ impl Parser<'_> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_expr(&mut self, min_bp: f64) -> Result<Expr, ParseErr> {
|
fn parse_expr(&mut self, min_bp: f64) -> Result<Expr, ParseErr> {
|
||||||
while let Ok(val) = self.lexer.next() {debug!("token: {:?}", )}
|
while let Ok(val) = self.lex.next() {debug!("token: {:?}", val)}
|
||||||
match self.lex.next().ok()? {
|
match self.lex.next().err() {
|
||||||
|
|
||||||
_ => return Err(ParseErr::Invalid),
|
_ => return Err(ParseErr::Invalid),
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue