1
0
Fork 0
This repository has been archived on 2025-03-30. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
compiler-course/src/compiler.rs

62 lines
1.5 KiB
Rust
Raw Normal View History

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