bQUARKz f9120e740b
dev/pbs (#8)
Co-authored-by: Nilton Constantino <nilton.constantino@visma.com>
Reviewed-on: #8
2026-03-24 13:40:22 +00:00

80 lines
2.6 KiB
Rust

pub mod token;
pub mod lexer;
pub mod ast;
pub mod parser;
pub mod types;
pub mod symbols;
pub mod collector;
pub mod resolver;
pub mod typecheck;
pub mod lowering;
pub mod contracts;
pub use collector::SymbolCollector;
pub use lexer::Lexer;
pub use lowering::Lowerer;
pub use resolver::{ModuleProvider, Resolver};
pub use symbols::{ModuleSymbols, Namespace, Symbol, SymbolKind, SymbolTable, Visibility};
pub use token::{Token, TokenKind};
pub use typecheck::TypeChecker;
use crate::common::diagnostics::DiagnosticBundle;
use crate::common::files::FileManager;
use crate::frontends::Frontend;
use crate::ir_vm;
use crate::lowering::core_to_vm;
use std::path::Path;
pub struct PbsFrontend;
impl Frontend for PbsFrontend {
fn language(&self) -> &'static str {
"pbs"
}
fn compile_to_ir(
&self,
entry: &Path,
file_manager: &mut FileManager,
) -> Result<ir_vm::Module, DiagnosticBundle> {
let source = std::fs::read_to_string(entry).map_err(|e| {
DiagnosticBundle::error(format!("Failed to read file: {}", e), None)
})?;
let file_id = file_manager.add(entry.to_path_buf(), source.clone());
let mut parser = parser::Parser::new(&source, file_id);
let ast = parser.parse_file()?;
let mut collector = SymbolCollector::new();
let (type_symbols, value_symbols) = collector.collect(&ast)?;
let mut module_symbols = ModuleSymbols { type_symbols, value_symbols };
struct EmptyProvider;
impl ModuleProvider for EmptyProvider {
fn get_module_symbols(&self, _path: &str) -> Option<&ModuleSymbols> { None }
}
let mut resolver = Resolver::new(&module_symbols, &EmptyProvider);
resolver.resolve(&ast)?;
let imported_symbols = resolver.imported_symbols;
let mut typechecker = TypeChecker::new(&mut module_symbols, &imported_symbols, &EmptyProvider);
typechecker.check(&ast)?;
// Lower to Core IR
let lowerer = Lowerer::new(&module_symbols, &imported_symbols);
let module_name = entry.file_stem().unwrap().to_string_lossy();
let core_program = lowerer.lower_file(&ast, &module_name)?;
// Validate Core IR Invariants
crate::ir_core::validate_program(&core_program).map_err(|e| {
DiagnosticBundle::error(format!("Core IR Invariant Violation: {}", e), None)
})?;
// Lower Core IR to VM IR
core_to_vm::lower_program(&core_program).map_err(|e| {
DiagnosticBundle::error(format!("Lowering error: {}", e), None)
})
}
}