60 lines
1.4 KiB
Rust
60 lines
1.4 KiB
Rust
use crate::{lstring::LStr, symbol::Symbol, value::Value};
|
|
|
|
#[derive(Clone, Copy, Debug)]
|
|
pub enum BinaryOp {
|
|
Add, Sub, Mul, Div, Mod, Pow, IntDiv,
|
|
Shr, Shl, BitAnd, BitXor, BitOr,
|
|
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 LStr),
|
|
|
|
UnaryOp(UnaryOp, Box<Expr<'s>>),
|
|
BinaryOp(BinaryOp, Box<Expr<'s>>, Box<Expr<'s>>),
|
|
|
|
Assign(Option<BinaryOp>, Box<LValue<'s>>, Box<Expr<'s>>),
|
|
AssignVar(&'s LStr, Box<Expr<'s>>),
|
|
AssignGlobal(&'s LStr, Box<Expr<'s>>),
|
|
|
|
Index(Box<Expr<'s>>, Box<Expr<'s>>),
|
|
FnCall(Box<Expr<'s>>, Vec<Expr<'s>>),
|
|
AssocFnCall(Box<Expr<'s>>, Symbol, Vec<Expr<'s>>),
|
|
Pipe(Box<Expr<'s>>, Box<Expr<'s>>),
|
|
|
|
Block(Vec<Expr<'s>>),
|
|
List(Vec<Expr<'s>>),
|
|
Table(Vec<(Expr<'s>, Expr<'s>)>),
|
|
|
|
Return(Box<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 LStr, Box<Expr<'s>>, Box<Expr<'s>>),
|
|
Lambda(Vec<&'s LStr>, Box<Expr<'s>>),
|
|
Try(Box<Expr<'s>>, Vec<CatchBlock<'s>>),
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct CatchBlock<'s> {
|
|
pub name: Option<&'s LStr>,
|
|
pub types: Option<Vec<Symbol>>,
|
|
pub body: Expr<'s>,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub enum LValue<'s> {
|
|
Ident(&'s LStr),
|
|
Index(Box<Expr<'s>>, Box<Expr<'s>>),
|
|
}
|