49 lines
1.1 KiB
Rust
49 lines
1.1 KiB
Rust
use crate::value::Value;
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
pub enum BinaryOp {
|
|
Add, Sub, Mul, Div, Mod, Pow, IntDiv,
|
|
Eq, Ne, Gt, Lt, Ge, Le,
|
|
Concat, Append,
|
|
Range, RangeIncl,
|
|
}
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
pub enum UnaryOp {
|
|
Neg, Not, RangeEndless,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub enum Expr<'s> {
|
|
Literal(Value),
|
|
Ident(&'s str),
|
|
|
|
UnaryOp(UnaryOp, Box<Expr<'s>>),
|
|
BinaryOp(BinaryOp, Box<Expr<'s>>, Box<Expr<'s>>),
|
|
|
|
Assign(Option<BinaryOp>, Box<LValue<'s>>, Box<Expr<'s>>),
|
|
AssignVar(&'s str, Box<Expr<'s>>),
|
|
AssignGlobal(&'s str, Box<Expr<'s>>),
|
|
|
|
Index(Box<Expr<'s>>, Box<Expr<'s>>),
|
|
FnCall(Box<Expr<'s>>, Vec<Expr<'s>>),
|
|
Pipe(Box<Expr<'s>>, Box<Expr<'s>>),
|
|
|
|
Block(Vec<Expr<'s>>),
|
|
List(Vec<Expr<'s>>),
|
|
Table(Vec<(Expr<'s>, Expr<'s>)>),
|
|
|
|
And(Box<Expr<'s>>, Box<Expr<'s>>),
|
|
Or(Box<Expr<'s>>, Box<Expr<'s>>),
|
|
If(Box<Expr<'s>>, Box<Expr<'s>>, Option<Box<Expr<'s>>>),
|
|
While(Box<Expr<'s>>, Box<Expr<'s>>),
|
|
For(&'s str, Box<Expr<'s>>, Box<Expr<'s>>),
|
|
Lambda(Vec<&'s str>, Box<Expr<'s>>),
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub enum LValue<'s> {
|
|
Ident(&'s str),
|
|
Index(Box<Expr<'s>>, Box<Expr<'s>>),
|
|
}
|