|
1 | 1 | use std::{error, fmt, str::FromStr};
|
2 | 2 |
|
3 |
| -use itertools::Itertools; |
4 | 3 | use pest::iterators::{Pair, Pairs};
|
5 | 4 |
|
6 | 5 | use crate::load_file::{AddressMode, Field, Instruction, Modifier, Opcode, Program, Value};
|
@@ -63,29 +62,26 @@ pub fn parse(file_contents: &str) -> Result<ParsedProgram, Error> {
|
63 | 62 |
|
64 | 63 | let mut program = Program::new();
|
65 | 64 |
|
66 |
| - let parse_result = grammar::parse(grammar::Rule::File, file_contents)? |
| 65 | + let parse_result = grammar::parse(grammar::Rule::Program, file_contents)? |
67 | 66 | .next()
|
68 | 67 | .ok_or_else(Error::no_input)?;
|
69 | 68 |
|
70 | 69 | let mut i = 0;
|
71 |
| - for mut line_pair in parse_result |
| 70 | + for pair in parse_result |
72 | 71 | .into_inner()
|
73 |
| - .map(Pair::into_inner) |
74 |
| - .filter(|line_pair| line_pair.peek().is_some()) |
| 72 | + .take_while(|pair| pair.as_rule() != grammar::Rule::EndProgram) |
75 | 73 | {
|
76 |
| - let label_pairs = line_pair |
77 |
| - .take_while_ref(|pair| pair.as_rule() == grammar::Rule::Label) |
78 |
| - .map(|pair| pair.as_str().to_owned()); |
79 |
| - |
80 |
| - for label in label_pairs { |
81 |
| - if let Err(failed_add) = program.add_label(i, label.to_string()) { |
82 |
| - warnings.push(failed_add.into()) |
| 74 | + match &pair.as_rule() { |
| 75 | + grammar::Rule::Label => { |
| 76 | + if let Err(failed_add) = program.add_label(i, pair.as_str().to_string()) { |
| 77 | + warnings.push(failed_add.into()); |
| 78 | + } |
83 | 79 | }
|
84 |
| - } |
85 |
| - |
86 |
| - if line_pair.peek().is_some() { |
87 |
| - program.set(i, parse_instruction(line_pair)); |
88 |
| - i += 1; |
| 80 | + grammar::Rule::Instruction => { |
| 81 | + program.set(i, parse_instruction(pair.into_inner())); |
| 82 | + i += 1; |
| 83 | + } |
| 84 | + _ => (), |
89 | 85 | }
|
90 | 86 | }
|
91 | 87 |
|
@@ -255,7 +251,9 @@ mod tests {
|
255 | 251 | .resolve()
|
256 | 252 | .expect("Should resolve a core with no labels");
|
257 | 253 |
|
258 |
| - let mut parsed = parse(simple_input).expect("Should parse simple file"); |
| 254 | + let mut parsed = parse(simple_input) |
| 255 | + .unwrap_or_else(|err| panic!("Failed to parse simple file: {}", err)); |
| 256 | + |
259 | 257 | parsed.result.resolve().expect("Parsed file should resolve");
|
260 | 258 |
|
261 | 259 | assert!(parsed.warnings.is_empty());
|
|
0 commit comments