1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#![allow(dead_code)]

extern crate pest;
#[macro_use]
extern crate pest_derive;

extern crate byteorder;

mod config;
mod test_assembly;
mod test_binary;
mod test_descriptor;

mod bits;
mod task;
mod lookup_table;

use std::fs;
use std::env;
use task::TaskHandle;

fn main() {
    let args: Vec<String> = env::args().collect();
    let in_file_name = args.get(1).expect("Expected one command line argument with file name");

    println!("Assembler Started\n");

    let root_task = TaskHandle::new("Assembler");

    let input_path  = format!("./examples/assembly/{}.taf", in_file_name);
    let output_path = format!("./examples/target/{}.tbf", in_file_name);

    let _a = assemble(root_task.clone(), input_path, output_path);
    
    root_task.report_results();
}

fn assemble(task: TaskHandle, input_path: String, output_path: String) -> Option<()> {
    let file_read_task = task.sub_task("read", Some(input_path.clone()));
    file_read_task.print_starting();
    let input_text = file_read_task.res_error(fs::read_to_string(&input_path))?;
    file_read_task.print_finished();

    let file_parse_task = task.sub_task("parse", Some(input_path));
    file_parse_task.print_starting();
    let test = test_assembly::parse(file_parse_task.clone(), input_text)?;
    file_parse_task.print_finished();
    
    let binary_emit_task = task.sub_task("emit_binary", Some(output_path.clone()));
    binary_emit_task.print_starting();
    test_binary::emit(binary_emit_task.clone(), test, output_path);
    binary_emit_task.print_finished();
    
    Some(())
}