Function parse_program

Source
pub fn parse_program(program: &str) -> Result<Program, Vec<(u64, String)>>
Expand description

Parse an entire program, returning either a ready-to-execute MLeM program or a Vec of error messages, with line numbers, of all errors in the program.

ยงExample

A valid program:

use mlem_asm::*;
let valid_program = "
   noop
   move R:R0 R:SP;
   input R:R0;
   ; comment only

   ";
   let expected_program = Ok(vec![
           Instruction::NoOp,
           Instruction::Move(Address::RegAbs(Register::R0), Address::RegAbs(Register::SP)),
           Instruction::Input(Address::RegAbs(Register::R0))
   ]);
   let program = parse_program(valid_program);
   assert!(program == expected_program, "Program resulted in: {:?} not: {:?}", program, expected_program);

An invalid program:

use mlem_asm::*;
let invalid_program = "
   noop
   move R:R0 R:xx;
   output invalid;
   ; comment only

   ";
   let expected_errors = Err(vec![(2, "Unknown register name: xx".into()), (3, "Malformed address.".into())]);
   let errors = parse_program(invalid_program);
   assert!(errors == expected_errors, "Program resulted in: {:?} not: {:?}", errors, expected_errors);
Examples found in repository?
examples/mlem-asm.rs (line 74)
49fn load_and_process(args: Vec<String>, mode: Mode) {
50    let mut f = BufReader::new(File::open(&args[2]).unwrap());
51    let mut contents = String::new();
52    f.read_to_string(&mut contents).unwrap();
53
54    let mut out: Option<Output> = None;
55    let mut inp: Option<Input> = None;
56
57    match mode {
58        Mode::Assemble => {
59            out = Some(if args.len() == 4 {
60                Output::File(BufWriter::new(File::create(&args[3]).unwrap()))
61            } else {
62                Output::StdOut(BufWriter::new(std::io::stdout()))
63            });
64        },
65        Mode::Execute => {
66            inp = Some(if args.len() == 4 {
67                Input::File(BufReader::new(File::create(&args[3]).unwrap()))
68            } else {
69                Input::StdIn(BufReader::new(std::io::stdin()))
70            });
71        }
72    };
73
74    let result = parse_program(&contents);
75
76    match result {
77        Ok(p) => {
78            match mode {
79                Mode::Assemble => {
80                    match out.unwrap() {
81                        Output::File(mut o) => { program_to_writer(&p, &mut o).unwrap(); },
82                        Output::StdOut(mut o) => { program_to_writer(&p, &mut o).unwrap(); }
83                    }
84                },
85                Mode::Execute => {
86                    match inp.unwrap() {
87                        Input::File(mut i) => { 
88                            let mut o = std::io::stdout();
89                            let mut m = Machine::new(65535, &mut i, &mut o);
90                            m.load_program(p);
91                            println!("\n{:?}", m.run()) 
92                        },
93                        Input::StdIn(mut i) => { 
94                            let mut o = std::io::stdout();
95                            let mut m = Machine::new(65535, &mut i, &mut o);
96                            m.load_program(p);
97                            println!("\n{:?}", m.run()) 
98                        }
99                    }
100                }
101            }
102         }
103        Err(e) => {
104            println!("Could not assemble program.");
105            for error in e {
106                println!("{:2}: {}", error.0, error.1);
107            }
108            std::process::exit(1);
109        }
110    }
111}