Working ish runtime
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
use std::{collections::HashMap, path::Path};
|
||||
|
||||
use crate::parser::{self, ast::Statement};
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct Registry {}
|
||||
|
||||
pub struct Function {
|
||||
pub registry: Registry,
|
||||
pub body: Vec<Statement>,
|
||||
pub params: Vec<String>,
|
||||
}
|
||||
|
||||
pub struct Runtime {
|
||||
pub registry: Registry,
|
||||
pub functions: HashMap<String, Function>,
|
||||
}
|
||||
|
||||
impl Registry {
|
||||
pub fn new() -> Self {
|
||||
Self {}
|
||||
}
|
||||
}
|
||||
|
||||
impl Runtime {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
registry: Registry::new(),
|
||||
functions: HashMap::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Runtime {
|
||||
pub fn execute_script(&mut self, path: &Path) {
|
||||
let src = std::fs::read_to_string(path).unwrap();
|
||||
|
||||
let ast = parser::parse_program(&src).unwrap();
|
||||
|
||||
for func in ast.functions {
|
||||
self.functions.insert(
|
||||
func.name,
|
||||
Function {
|
||||
registry: Registry::new(),
|
||||
body: func.body,
|
||||
params: func.params,
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn execute(&mut self, statements: Vec<Statement>, reg: Registry) {
|
||||
for statement in statements {
|
||||
match statement {
|
||||
Statement::Instruction(inst) => {
|
||||
println!("{inst:#?}");
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn call_function(&mut self, fn_name: &str, params: Vec<u8>) {
|
||||
let f = self
|
||||
.functions
|
||||
.get(fn_name)
|
||||
.expect("Function does not exist");
|
||||
|
||||
self.execute(f.body.clone(), f.registry.clone());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user