libjuno 0.1.3

Library for JunoLang
use std::{ path::Path, process::exit };
use inkwell::module::Module;
use pest::Parser;

use crate::*;

pub fn compile_file(p: &Path) -> Module<'static> {
    let input = match std::fs::read_to_string(p) {
        Err(e) => panic!("Error while reading file {} (ERR: {})", p.to_str().unwrap(), e),
        Ok(s) => s,
    };

    let pairs = match JunoParser::parse(Rule::program, &input.as_str()) {
        Ok(pairs) => pairs,
        Err(e) => {
            panic!("{e}");
        }
    };
    let expr = parse_program(pairs.into_iter().next().unwrap());
    let mut metairgen = MetaIRGen::new(&expr);
    let metair = Box::leak(Box::new(metairgen.lower_program(&expr)));
    let context = Box::leak(Box::new(inkwell::context::Context::create()));
    let mut irgen = LLVMBackend::new(context, metair, "main");
    if let Err(e) = irgen.compile() {
        eprintln!("{:#?}", e);
        exit(1);
    }

    return irgen.module;
}