diff --git a/src/main.rs b/src/main.rs index bc105f0..18c62be 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,14 +22,18 @@ fn parse_lang(lang: &str) -> Result, ParseError> { VALID_INSTRUCTION_CHARS.chars().any(|vic| vic == *c) }); - while let Some(ins) = match_instruction(&instruction_tree_root, &mut cs) { - r.push(ins); + loop { + match match_instruction(&instruction_tree_root, &mut cs) { + Err(err) => return Err(err), + Ok(None) => break, + Ok(Some(ins)) => r.push(ins), + } } Ok(r) } -fn match_instruction(ins_coll: &InsColl, cs: &mut dyn Iterator) -> Option { +fn match_instruction(ins_coll: &InsColl, cs: &mut dyn Iterator) -> Result, ParseError> { if let Some(c) = cs.next() { for ins in &ins_coll.inses { if ins.c == c { @@ -37,15 +41,16 @@ fn match_instruction(ins_coll: &InsColl, cs: &mut dyn Iterator) -> Op InsType::Path(ins_coll) => return match_instruction(&ins_coll, cs), InsType::Node(ins) => { let data = if ins.has_data() { Some(read_number(cs)) } else { None }; - println!("{:?} {}", ins, if let Some(n) = data { n.to_string() } else { "".to_owned() }); - return Some(ins.new_instruction(data)); + println!("{:?} {}", ins, if let Some(n) = data { n.to_string() } else { "".to_owned() }); // TODO + return Ok(Some(ins.new_instruction(data))); }, } } } - println!("ERROR!!!! syntax error!"); + // println!("ERROR!!!! syntax error!"); + return Err(ParseError::ErrorSyntax("ERROR!!!! syntax error!".into())); } - None + Ok(None) } fn read_number(cs: &mut dyn Iterator) -> isize {