ref match
This commit is contained in:
19
src/main.rs
19
src/main.rs
@@ -22,14 +22,18 @@ fn parse_lang(lang: &str) -> Result<Vec<Instruction>, ParseError> {
|
|||||||
VALID_INSTRUCTION_CHARS.chars().any(|vic| vic == *c)
|
VALID_INSTRUCTION_CHARS.chars().any(|vic| vic == *c)
|
||||||
});
|
});
|
||||||
|
|
||||||
while let Some(ins) = match_instruction(&instruction_tree_root, &mut cs) {
|
loop {
|
||||||
r.push(ins);
|
match match_instruction(&instruction_tree_root, &mut cs) {
|
||||||
|
Err(err) => return Err(err),
|
||||||
|
Ok(None) => break,
|
||||||
|
Ok(Some(ins)) => r.push(ins),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(r)
|
Ok(r)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn match_instruction(ins_coll: &InsColl, cs: &mut dyn Iterator<Item=char>) -> Option<Instruction> {
|
fn match_instruction(ins_coll: &InsColl, cs: &mut dyn Iterator<Item=char>) -> Result<Option<Instruction>, ParseError> {
|
||||||
if let Some(c) = cs.next() {
|
if let Some(c) = cs.next() {
|
||||||
for ins in &ins_coll.inses {
|
for ins in &ins_coll.inses {
|
||||||
if ins.c == c {
|
if ins.c == c {
|
||||||
@@ -37,15 +41,16 @@ fn match_instruction(ins_coll: &InsColl, cs: &mut dyn Iterator<Item=char>) -> Op
|
|||||||
InsType::Path(ins_coll) => return match_instruction(&ins_coll, cs),
|
InsType::Path(ins_coll) => return match_instruction(&ins_coll, cs),
|
||||||
InsType::Node(ins) => {
|
InsType::Node(ins) => {
|
||||||
let data = if ins.has_data() { Some(read_number(cs)) } else { None };
|
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() });
|
println!("{:?} {}", ins, if let Some(n) = data { n.to_string() } else { "".to_owned() }); // TODO
|
||||||
return Some(ins.new_instruction(data));
|
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<Item=char>) -> isize {
|
fn read_number(cs: &mut dyn Iterator<Item=char>) -> isize {
|
||||||
|
|||||||
Reference in New Issue
Block a user