2025-02-26 21:50:08 +02:00
use std ::{ error ::Error , io } ;
2025-02-03 16:35:06 +02:00
2025-02-26 16:47:45 +02:00
use assembler ::assemble ;
2025-02-21 17:05:08 +02:00
use assembly_generator ::generate_assembly ;
2025-02-26 16:47:45 +02:00
use base64 ::{ engine ::general_purpose , Engine } ;
2025-02-04 14:06:00 +02:00
use interpreter ::interpret ;
2025-02-05 17:16:17 +02:00
use ir_generator ::generate_ir ;
2025-02-03 16:35:06 +02:00
use parser ::parse ;
2025-02-04 14:06:00 +02:00
use symtab ::SymTab ;
2025-02-03 16:35:06 +02:00
use tokenizer ::tokenize ;
2025-02-04 16:09:05 +02:00
use type_checker ::type_check ;
2025-02-03 16:35:06 +02:00
2025-02-26 16:47:45 +02:00
mod assembler ;
2025-02-21 17:05:08 +02:00
mod assembly_generator ;
2025-01-24 14:41:23 +02:00
mod ast ;
2025-02-03 16:35:06 +02:00
mod interpreter ;
2025-02-05 17:16:17 +02:00
mod ir ;
mod ir_generator ;
2025-01-24 14:41:23 +02:00
mod parser ;
2025-02-03 18:01:39 +02:00
mod symtab ;
2025-01-18 18:58:14 +02:00
mod token ;
mod tokenizer ;
2025-02-04 16:09:05 +02:00
mod type_checker ;
2025-02-04 14:10:16 +02:00
mod variable ;
2025-01-18 18:58:14 +02:00
2025-02-26 21:50:08 +02:00
pub fn compile ( code : & str ) -> Result < String , Box < dyn Error > > {
let tokens = tokenize ( code ) ? ;
2025-02-26 22:31:04 +02:00
let mut ast = parse ( & tokens ) ? ;
2025-02-04 19:06:19 +02:00
type_check ( & mut ast , & mut SymTab ::new_type_table ( ) ) ;
2025-02-21 17:05:08 +02:00
let ir = generate_ir ( & ast ) ;
2025-02-26 16:47:45 +02:00
let assembly = generate_assembly ( & ir ) ;
2025-02-26 18:36:03 +02:00
2025-02-26 21:50:08 +02:00
Ok ( general_purpose ::STANDARD . encode ( assemble ( assembly ) ) )
2025-02-05 17:16:17 +02:00
}
pub fn start_compiler ( ) {
let lines = io ::stdin ( ) . lines ( ) ;
for line in lines . map_while ( Result ::ok ) {
2025-02-26 21:50:08 +02:00
match compile ( & line ) {
Ok ( _ ) = > println! ( " \n Compilation OK :) \n " ) ,
2025-02-26 22:52:32 +02:00
Err ( e ) = > println! (
" {} " ,
format! ( " {{ \" error \" : {} }} " , json ::stringify ( format! ( " {e} " ) ) )
) ,
2025-02-26 21:50:08 +02:00
}
2025-02-05 17:16:17 +02:00
}
2025-01-18 18:58:14 +02:00
}
2025-02-03 16:35:06 +02:00
pub fn start_interpreter ( ) {
let lines = io ::stdin ( ) . lines ( ) ;
2025-02-03 18:01:39 +02:00
#[ allow(clippy::manual_flatten) ]
2025-02-03 16:35:06 +02:00
for line in lines {
if let Ok ( code ) = line {
2025-02-26 21:50:08 +02:00
let tokens = tokenize ( & code ) . unwrap ( ) ;
2025-02-26 22:31:04 +02:00
let ast = parse ( & tokens ) . unwrap ( ) ;
2025-02-03 18:01:39 +02:00
2025-02-04 16:09:05 +02:00
let val = interpret ( & ast , & mut SymTab ::new_val_table ( ) ) ;
2025-02-03 18:01:39 +02:00
println! ( " {} " , val ) ;
2025-02-03 16:35:06 +02:00
}
}
}