use super::{CompileTimeConstant, Statement};
#[derive(Clone,PartialEq,Debug)]
pub enum Expression {
Atom(Atom),
BinaryOperation(BinaryOperation),
FunctionCall(FunctionCall),
Block(BlockExpression),
Indexing(AtIndex),
AdHocArray(AdHocArrayExpression)
}
#[derive(Clone,PartialEq,Debug)]
pub enum Atom {
Variable(String),
NamespaceVariable { namespace: String, name: String },
Literal(Literal)
}
#[derive(Clone,PartialEq,Debug)]
pub enum Literal {
Double(f64),
Int64(i64)
}
#[derive(Clone,PartialEq,Debug)]
pub struct BinaryOperation {
pub lhs: Box<Expression>,
pub rhs: Box<Expression>,
pub op: BinaryOperator
}
#[derive(Copy,Clone,Eq,PartialEq,Debug)]
pub enum BinaryOperator {
Add, Sub,
Mul, Div
}
#[derive(Clone,PartialEq,Debug)]
pub struct FunctionCall {
pub fn_name: String,
pub parameters: Vec<Expression>
}
#[derive(Clone,PartialEq,Debug)]
pub struct BlockExpression {
pub statements: Vec<Statement>,
pub expression: Box<Expression>
}
#[derive(Clone,PartialEq,Debug)]
pub struct AtIndex {
pub array: String,
pub index: CompileTimeConstant<usize>
}
#[derive(Clone,PartialEq,Debug)]
pub struct AdHocArrayExpression {
pub elements: Vec<Expression>
}