ast tests

This commit is contained in:
janis 2025-10-29 22:10:34 +01:00
parent 4e55fa74f4
commit 8f4d626968
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8

View file

@ -1,40 +1,14 @@
#[path = "shared/shared.rs"]
mod util;
#[repr(C)]
struct Ast {
nodes: util::vec::Vec<AstNode>,
}
#[repr(C)]
struct Argument {
name: *const u8,
name_len: usize,
arg_type: u8,
}
#[repr(C)]
#[derive(Debug)]
struct AstNode {
node_type: u8,
data: usize,
}
use util::FFISlice;
unsafe extern "C" {
unsafe fn bump_init();
unsafe fn parse_func(ast: *mut Ast) -> u64;
unsafe fn parse_args(ast: *mut Ast) -> FFISlice;
unsafe fn parse_expr(ast: *mut Ast) -> u64;
unsafe fn parse_binary_expr(ast: *mut Ast) -> u64;
unsafe fn parse_primary_expr(ast: *mut Ast) -> u64;
unsafe fn parse_statement(ast: *mut Ast) -> u64;
unsafe fn parse_block(ast: *mut Ast) -> u64;
unsafe fn tokeniser_init_buf(bytes: *const u8, len: usize) -> ();
}
use util::defs::{parse_expr, Ast, AstNode};
fn main() {
unsafe {
bump_init();
@ -50,6 +24,43 @@ fn main() {
};
let expr_id = parse_expr(&mut ast);
println!("Parsed expression with ID: {}", expr_id);
println!("{:#?}", ast.nodes.as_slice());
println!("{:#}", &ast);
}
}
impl std::fmt::Display for AstNode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
use util::defs::{BinaryExpr, AST_BINARY_OP, AST_NUMBER};
match self.kind as u32 {
AST_NUMBER => {
write!(f, "Number({})", self.data as usize)
}
AST_BINARY_OP => {
let BinaryExpr {
left,
operator,
right,
} = unsafe { self.data.cast::<util::defs::BinaryExpr>().read() };
write!(
f,
"BinaryOp(op: {}, left: {}, right: {})",
operator, left, right
)
}
_ => write!(f, "UnknownNode"),
}
}
}
impl core::fmt::Display for Ast {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
writeln!(f, "[")?;
for (i, item) in self.nodes.as_slice().iter().enumerate() {
if i > 0 {
writeln!(f, ", ")?;
}
write!(f, "\t{i}: {}", item)?;
}
writeln!(f, "\n]")
}
}