pub mod binding_power {
use crate::{parser::ParserError, scanner::token::Token};
pub struct Lhs(u8);
impl From<u8> for Lhs {
fn from(num: u8) -> Self {
Lhs(num)
}
}
impl From<Lhs> for u8 {
fn from(lhs: Lhs) -> Self {
lhs.0
}
}
pub struct Rhs(u8);
impl From<u8> for Rhs {
fn from(num: u8) -> Self {
Rhs(num)
}
}
impl From<Rhs> for u8 {
fn from(rhs: Rhs) -> Self {
rhs.0
}
}
pub fn prefix(token: &Token) -> Result<Rhs, ParserError> {
let res = match token {
Token::Plus | Token::Minus => ((), 9),
t => return Err(ParserError::UnexpectedToken(t.clone())),
};
Ok(res.1.into())
}
pub fn postfix(token: Token) -> Option<Lhs> {
let res = match token {
Token::Bang => (11, ()),
_ => return None,
};
Some(res.0.into())
}
pub fn infix(token: Token) -> Option<(Lhs, Rhs)> {
let res = match token {
Token::Equal => (2, 1),
Token::Plus | Token::Minus => (5, 6),
Token::Star | Token::Slash => (7, 8),
Token::Dot => (14, 13),
_ => return None,
};
Some((res.0.into(), res.1.into()))
}
}