#[derive(Debug, Clone, PartialEq)]
pub enum Literal {
Number(f32),
String(String),
Boolean(bool),
Null,
Undefined,
}
#[derive(Debug, Clone, PartialEq)]
pub enum BinaryOp {
Add,
Sub,
Mul,
Div,
Equal, StrictEqual, NotEqual, LessThan, GreaterThan, LessEqual, GreaterEqual, }
#[derive(Debug, Clone, PartialEq)]
pub enum Expr {
Literal(Literal),
Identifier(String),
Binary {
op: BinaryOp,
left: Box<Expr>,
right: Box<Expr>,
},
Assign {
target: Box<Expr>,
value: Box<Expr>,
},
Call {
callee: Box<Expr>,
args: Vec<Expr>,
},
Member {
object: Box<Expr>,
property: String,
},
}
#[derive(Debug, Clone, PartialEq)]
pub enum Stmt {
VarDecl {
name: String,
initializer: Option<Expr>,
},
Expr(Expr),
Block(Vec<Stmt>),
If {
condition: Expr,
then_branch: Box<Stmt>,
else_branch: Option<Box<Stmt>>,
},
While {
condition: Expr,
body: Box<Stmt>,
},
FunctionDecl {
name: String,
params: Vec<String>,
body: Vec<Stmt>,
},
Return(Option<Expr>),
}
#[derive(Debug, Clone, PartialEq)]
pub struct Program {
pub body: Vec<Stmt>,
}