add exponentiation
This commit is contained in:
parent
abbf5514e8
commit
8c507cb1da
5 changed files with 10 additions and 4 deletions
|
|
@ -25,7 +25,8 @@ impl Evaluator {
|
|||
BinaryOp::Sub => self.eval_expr(*left) - self.eval_expr(*right),
|
||||
BinaryOp::Mul => self.eval_expr(*left) * self.eval_expr(*right),
|
||||
BinaryOp::Div => self.eval_expr(*left) / self.eval_expr(*right),
|
||||
BinaryOp::Mod => self.eval_expr(*left) % self.eval_expr(*right)
|
||||
BinaryOp::Mod => self.eval_expr(*left) % self.eval_expr(*right),
|
||||
BinaryOp::Exp => self.eval_expr(*left).pow(self.eval_expr(*right) as u32) // probably shouldn't cast like that
|
||||
}
|
||||
},
|
||||
expr => panic!("can't eval expression: {expr:?}")
|
||||
|
|
|
|||
|
|
@ -4,7 +4,8 @@ pub enum BinaryOp {
|
|||
Sub,
|
||||
Mul,
|
||||
Div,
|
||||
Mod
|
||||
Mod,
|
||||
Exp
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
|
|
@ -14,14 +15,15 @@ pub enum UnaryOp {
|
|||
|
||||
pub fn prefix_bp(op: &UnaryOp) -> u8 {
|
||||
match op {
|
||||
UnaryOp::Neg => 5
|
||||
UnaryOp::Neg => 7
|
||||
}
|
||||
}
|
||||
|
||||
pub fn infix_bp(op: &BinaryOp) -> (u8, u8) {
|
||||
match op {
|
||||
BinaryOp::Add | BinaryOp::Sub => (1, 2),
|
||||
BinaryOp::Mul | BinaryOp::Div | BinaryOp::Mod => (3, 4)
|
||||
BinaryOp::Mul | BinaryOp::Div | BinaryOp::Mod => (3, 4),
|
||||
BinaryOp::Exp => (5, 6)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@ impl Lexer {
|
|||
Some(b'*') => {self.advance(); Some(Token::Asterisk)},
|
||||
Some(b'/') => {self.advance(); Some(Token::Slash)},
|
||||
Some(b'%') => {self.advance(); Some(Token::Percent)},
|
||||
Some(b'^') => {self.advance(); Some(Token::Caret)},
|
||||
|
||||
Some(b'(') => {self.advance(); Some(Token::LParen)},
|
||||
Some(b')') => {self.advance(); Some(Token::RParen)},
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ impl Parser {
|
|||
Some(Token::Asterisk) => BinaryOp::Mul,
|
||||
Some(Token::Slash) => BinaryOp::Div,
|
||||
Some(Token::Percent) => BinaryOp::Mod,
|
||||
Some(Token::Caret) => BinaryOp::Exp,
|
||||
_ => break
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ pub enum Token {
|
|||
Asterisk,
|
||||
Slash,
|
||||
Percent,
|
||||
Caret,
|
||||
|
||||
// Parentheses
|
||||
LParen,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue