mirror of
https://github.com/PaddiM8/kalker.git
synced 2025-03-13 12:58:26 +01:00
43 lines
1003 B
Rust
43 lines
1003 B
Rust
use crate::lexer::TokenKind;
|
|
use crate::parser::Unit;
|
|
use std::mem;
|
|
|
|
#[derive(Debug, Clone, PartialEq)]
|
|
pub enum Stmt {
|
|
VarDecl(String, Box<Expr>),
|
|
FnDecl(String, Vec<String>, Box<Expr>),
|
|
Expr(Box<Expr>),
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq)]
|
|
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,
|
|
}
|
|
}
|
|
|
|
pub fn to_unit(&self) -> Result<Unit, String> {
|
|
match self {
|
|
TokenKind::Deg => Ok(Unit::Degrees),
|
|
TokenKind::Rad => Ok(Unit::Radians),
|
|
_ => Err(String::from("Invalid unit.")),
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn compare_enums<T>(first: &T, second: &T) -> bool {
|
|
mem::discriminant(first) == mem::discriminant(second)
|
|
}
|