2020-05-30 15:27:58 +02:00
|
|
|
use crate::lexer::TokenKind;
|
2020-06-06 16:28:48 +02:00
|
|
|
use crate::parser::CalcError;
|
2020-06-04 18:19:48 +02:00
|
|
|
use crate::parser::Unit;
|
2020-05-30 15:27:58 +02:00
|
|
|
|
2020-06-05 13:36:11 +02:00
|
|
|
#[derive(Debug, Clone, PartialEq)]
|
2020-05-30 15:27:58 +02:00
|
|
|
pub enum Stmt {
|
|
|
|
VarDecl(String, Box<Expr>),
|
|
|
|
FnDecl(String, Vec<String>, Box<Expr>),
|
|
|
|
Expr(Box<Expr>),
|
|
|
|
}
|
|
|
|
|
2020-06-05 13:36:11 +02:00
|
|
|
#[derive(Debug, Clone, PartialEq)]
|
2020-05-30 15:27:58 +02:00
|
|
|
pub enum Expr {
|
|
|
|
Binary(Box<Expr>, TokenKind, Box<Expr>),
|
|
|
|
Unary(TokenKind, Box<Expr>),
|
|
|
|
Unit(Box<Expr>, TokenKind),
|
|
|
|
Var(String),
|
|
|
|
Group(Box<Expr>),
|
|
|
|
FnCall(String, Vec<Expr>),
|
|
|
|
Literal(String),
|
|
|
|
}
|
|
|
|
|
|
|
|
impl TokenKind {
|
|
|
|
pub fn is_unit(&self) -> bool {
|
|
|
|
match self {
|
|
|
|
TokenKind::Deg | TokenKind::Rad => true,
|
|
|
|
_ => false,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-06 16:28:48 +02:00
|
|
|
pub fn to_unit(&self) -> Result<Unit, CalcError> {
|
2020-05-30 15:27:58 +02:00
|
|
|
match self {
|
|
|
|
TokenKind::Deg => Ok(Unit::Degrees),
|
|
|
|
TokenKind::Rad => Ok(Unit::Radians),
|
2020-06-06 16:28:48 +02:00
|
|
|
_ => Err(CalcError::InvalidUnit),
|
2020-05-30 15:27:58 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|