diff --git a/parser/src/parser.rs b/parser/src/parser.rs index 9bffdad..8bc2918 100644 --- a/parser/src/parser.rs +++ b/parser/src/parser.rs @@ -156,7 +156,7 @@ impl> Parser { -> Result<(), ScanError> { match *first_ev { Event::Alias => { unimplemented!() }, - Event::Scalar(ref v, style) => { + Event::Scalar(_, _) => { Ok(()) }, Event::SequenceStart => { @@ -170,7 +170,7 @@ impl> Parser { } } - fn load_mapping(&mut self, first_ev: &Event, recv: &mut R) + fn load_mapping(&mut self, _first_ev: &Event, recv: &mut R) -> Result<(), ScanError> { let mut ev = try!(self.parse(recv)); while ev != Event::MappingEnd { @@ -187,11 +187,11 @@ impl> Parser { Ok(()) } - fn load_sequence(&mut self, first_ev: &Event, recv: &mut R) + fn load_sequence(&mut self, _first_ev: &Event, recv: &mut R) -> Result<(), ScanError> { let mut ev = try!(self.parse(recv)); while ev != Event::SequenceEnd { - let entry = try!(self.load_node(&ev, recv)); + try!(self.load_node(&ev, recv)); // next event ev = try!(self.parse(recv)); @@ -367,7 +367,7 @@ impl> Parser { self.state = State::BlockMappingFirstKey; Ok(Event::MappingStart) }, - _ => { unimplemented!(); } + _ => { Err(ScanError::new(tok.0, "while parsing a node, did not find expected node content")) } } } @@ -474,7 +474,11 @@ impl> Parser { return self.parse_node(false, false); } } - } else if (tok.1 != TokenType::FlowMappingEndToken) { + // XXX libyaml fail ex 7.3, empty key + } else if tok.1 == TokenType::ValueToken { + self.state = State::FlowMappingValue; + return Ok(Event::empty_scalar()); + } else if tok.1 != TokenType::FlowMappingEndToken { self.push_state(State::FlowMappingEmptyValue); return self.parse_node(false, false); } @@ -494,7 +498,7 @@ impl> Parser { if tok.1 == TokenType::ValueToken { self.skip(); - let mut tok = try!(self.peek()); + let tok = try!(self.peek()); match tok.1 { TokenType::FlowEntryToken | TokenType::FlowMappingEndToken => { }, diff --git a/parser/src/scanner.rs b/parser/src/scanner.rs index e56fa8a..4b0cdfa 100644 --- a/parser/src/scanner.rs +++ b/parser/src/scanner.rs @@ -553,7 +553,7 @@ impl> Scanner { let mut chomping: i32 = 0; let mut increment: usize = 0; let mut indent: usize = 0; - let mut trailing_blank: bool = false; + let mut trailing_blank: bool; let mut leading_blank: bool = false; let mut string = String::new(); @@ -742,7 +742,7 @@ impl> Scanner { let mut leading_break = String::new(); let mut trailing_breaks = String::new(); let mut whitespaces = String::new(); - let mut leading_blanks = false; + let mut leading_blanks; /* Eat the left quote. */ self.skip(); @@ -820,7 +820,6 @@ impl> Scanner { self.skip(); // Consume an arbitrary escape code. if code_length > 0 { - let val = 0usize; self.lookahead(code_length); let mut value = 0u32; for i in 0..code_length { @@ -840,7 +839,7 @@ impl> Scanner { }; string.push(ch); - for i in 0..code_length { + for _ in 0..code_length { self.skip(); } } @@ -1491,5 +1490,29 @@ key: next!(p, StreamEndToken); end!(p); } + + #[test] + fn test_spec_ex7_3() { + let s = +" +{ + ? foo :, + : bar, +} +"; + let mut p = Scanner::new(s.chars()); + next!(p, StreamStartToken(..)); + next!(p, FlowMappingStartToken); + next!(p, KeyToken); + next_scalar!(p, TScalarStyle::Plain, "foo"); + next!(p, ValueToken); + next!(p, FlowEntryToken); + next!(p, ValueToken); + next_scalar!(p, TScalarStyle::Plain, "bar"); + next!(p, FlowEntryToken); + next!(p, FlowMappingEndToken); + next!(p, StreamEndToken); + end!(p); + } } diff --git a/parser/src/yaml.rs b/parser/src/yaml.rs index d6e3abc..33522b2 100644 --- a/parser/src/yaml.rs +++ b/parser/src/yaml.rs @@ -205,7 +205,6 @@ impl Index for Yaml { #[cfg(test)] mod test { - use parser::Parser; use yaml::*; #[test] fn test_coerce() { diff --git a/parser/tests/specs/libyaml_fail-01.yaml b/parser/tests/specs/libyaml_fail-01.yaml new file mode 100644 index 0000000..5e6c0dc --- /dev/null +++ b/parser/tests/specs/libyaml_fail-01.yaml @@ -0,0 +1,6 @@ +# Ex 8.18 +plain key: in-line value +: # Both empty +"quoted key": +- entry + diff --git a/parser/tests/specs/libyaml_fail-02.yaml b/parser/tests/specs/libyaml_fail-02.yaml new file mode 100644 index 0000000..60074de --- /dev/null +++ b/parser/tests/specs/libyaml_fail-02.yaml @@ -0,0 +1,7 @@ +# Ex 7.17 +{ +unqoted : "separate", +http://foo.com, +omitted value:, +: omitted key, +}