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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
use statements::{statement, Statement}; use commands::{command, Command}; use memory::Region; use memory::region; use sections::SectionCommand; use sections::section_command; use whitespace::opt_space; #[derive(Debug, PartialEq)] pub enum RootItem { Statement(Statement), Command(Command), Memory { regions: Vec<Region> }, Sections { list: Vec<SectionCommand> }, } named!(statement_item<&str, RootItem>, map!( statement, |stmt| RootItem::Statement(stmt) )); named!(command_item<&str, RootItem>, map!( command, |cmd| RootItem::Command(cmd) )); named!(memory_item<&str, RootItem>, do_parse!( tag!("MEMORY") >> wsc!(tag!("{")) >> regions: wsc!(many1!( region )) >> tag!("}") >> (RootItem::Memory { regions: regions }) )); named!(sections_item<&str, RootItem>, do_parse!( tag!("SECTIONS") >> wsc!(tag!("{")) >> sections: wsc!(many1!( section_command )) >> tag!("}") >> (RootItem::Sections { list: sections }) )); named!(root_item<&str, RootItem>, alt_complete!( statement_item | memory_item | sections_item | command_item )); named!(pub parse<&str, Vec<RootItem>>, alt_complete!( wsc!(many1!(root_item)) | map!(opt_space, |_| vec![]) )); #[cfg(test)] mod tests { use script::*; use std::fs::{self, File}; use std::io::Read; #[test] fn test_empty() { assert_done_vec!(parse(""), 0); assert_done_vec!(parse(" "), 0); assert_done_vec!(parse(" /* hello */ "), 0); } #[test] fn test_parse() { for entry in fs::read_dir("tests").unwrap() { let path = entry.unwrap().path(); println!("testing: {:?}", path); let mut file = File::open(path).unwrap(); let mut contents = String::new(); file.read_to_string(&mut contents).unwrap(); assert_done!(parse(&contents)); } } }