#[derive(Clone)]
pub struct PrintItem {
pub expr: Expr,
pub separator: PrintSeparator,
}
#[derive(Clone, Copy, Debug)]
pub enum PrintSeparator {
Comma, Semicolon, None, }
#[derive(Clone)]
pub enum Stmt {
Label(i32),
Let(String, Expr),
Print(Vec<PrintItem>),
Input {
prompt: Option<String>,
var: String,
},
Goto(i32),
IfGoto {
lhs: Expr,
op: Cmp,
rhs: Expr,
target: i32,
},
For {
var: String,
start: Expr,
end: Expr,
step: Option<Expr>,
},
Next(Option<String>),
End,
}
#[derive(Clone)]
pub enum Expr {
Num(i64),
Str(String),
Var(String),
Bin {
lhs: Box<Expr>,
op: Bin,
rhs: Box<Expr>,
},
}
#[derive(Clone, Copy)]
pub enum Bin {
Add,
Sub,
Mul,
Div,
}
#[derive(Clone, Copy, Debug)]
pub enum Cmp {
Lt,
Le,
Eq,
Ge,
Gt,
}
#[derive(Clone)]
pub enum Atom {
Imm(i64),
Str(String),
Var(usize),
Bin(Bin),
}