use crate::token::TokenType;
pub type Operator = TokenType;
pub type PrefixExpression = Box<Expression>;
pub type InfixExpression = Box<Expression>;
pub type HashKey = Expression;
pub type HashValue = Expression;
pub type FnName = Box<Expression>;
pub type FnParameter = Vec<Expression>;
pub type FnBody = Statement;
pub type IfCondition = Box<Expression>;
pub type WhileCondition = Box<Expression>;
#[derive(Debug, Clone)]
pub enum AstNode {
Program(Vec<Statement>),
}
#[derive(PartialEq, Debug, Clone)]
pub enum Expression {
Identifier(String),
Integer(usize),
Boolean(bool),
String(String),
Array(Vec<Expression>),
Hash(Vec<(HashKey, HashValue)>),
Prefix(Operator, PrefixExpression),
Infix(InfixExpression, Operator, InfixExpression),
If(IfCondition, Statement, Option<Statement>),
While(WhileCondition, Statement),
Break,
Fn(FnName, FnParameter, FnBody),
FnCall(FnName, FnParameter),
NON_PARSED_EXPR((usize, TokenType)),
}
#[derive(PartialEq, Debug, Clone)]
pub enum Statement {
Let(Box<Expression>, Box<Expression>),
Return(Box<Expression>),
Expr(Box<Expression>),
BlockStatement(Vec<Statement>),
}
#[derive(Debug, Eq, PartialEq, PartialOrd)]
pub enum Precedence {
Lowest,
Equals, Compare, Addition, Multiply, Prefix, Group, Index, }
impl Precedence {
pub fn get(token: &TokenType) -> Precedence {
match token {
TokenType::ADD | TokenType::MINUS => Precedence::Addition,
TokenType::MULTIPLY | TokenType::DIVIDE => Precedence::Multiply,
TokenType::BANG => Precedence::Prefix, TokenType::LEFT_PAREN => Precedence::Group,
TokenType::LEFT_BRACE => Precedence::Index,
TokenType::EQUAL_EQUAL | TokenType::LESS_EQUAL | TokenType::GREATER_EQUAL => Precedence::Equals,
TokenType::LESS | TokenType::GREATER => Precedence::Compare,
_ => Precedence::Lowest,
}
}
}