2025-02-03 16:35:06 +02:00
use std ::io ;
2025-02-21 17:05:08 +02:00
use assembly_generator ::generate_assembly ;
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-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-21 17:05:08 +02:00
pub fn compile ( code : & str ) -> String {
2025-02-04 16:09:05 +02:00
let tokens = tokenize ( code ) ;
2025-02-04 19:06:19 +02:00
let mut ast = parse ( & tokens ) ;
type_check ( & mut ast , & mut SymTab ::new_type_table ( ) ) ;
2025-02-21 17:05:08 +02:00
let ir = generate_ir ( & ast ) ;
generate_assembly ( & ir )
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-05 19:42:55 +02:00
println! ( ) ;
2025-02-21 17:05:08 +02:00
println! ( " {} " , compile ( & line ) ) ;
2025-02-05 18:15:37 +02:00
println! ( ) ;
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-03 18:01:39 +02:00
let tokens = tokenize ( & code ) ;
let ast = parse ( & tokens ) ;
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
}
}
}