use crate::variant::Variant;
use std::collections::HashMap;
use crate::builder::ProgramBuilder;
#[derive(Clone, Debug, PartialEq)]
pub enum Instruction {
SetLocal(usize),
GetLocal(usize),
CreateArray(usize),
GetArrayItem,
SetArrayItem,
GetArrayLength,
CreateDictionary(usize),
GetDictionaryItem,
SetDictionaryItem,
GetDictionaryKeys,
FunctionCall(CallTarget),
Return,
EndFunction,
Push(Variant),
Pop,
Add,
Sub,
Mul,
Div,
Mod,
Pow,
Equal,
LessThan,
LessEqual,
GreaterThan,
GreaterEqual,
NotEqual,
Or,
And,
Not,
Negate,
Jump(usize),
JumpIfFalse(usize),
Print,
Halt,
Panic
}
#[derive(Clone, Debug, PartialEq)]
pub enum CallTarget {
Name(String),
Index(usize)
}
#[derive(Clone, Debug, PartialEq)]
pub enum SymbolEntry {
NativeFunction {
arity: usize
},
UserDefinedFunction {
index: usize
}
}
#[derive(Clone, Default, Debug, PartialEq)]
pub struct Function {
pub name: String,
pub arity: usize,
pub local_count: usize,
pub instructions: Vec<Instruction>
}
#[derive(Clone, Default, Debug, PartialEq)]
pub struct Program {
pub symbol_table: HashMap<String, SymbolEntry>,
pub functions: Vec<Function>
}
impl Program {
pub fn builder() -> ProgramBuilder {
ProgramBuilder::default()
}
}