Fix parsing bugs
1. empty key & value support 2. OnNull handling in test
This commit is contained in:
parent
ef020f0f95
commit
b6acd869eb
3 changed files with 15 additions and 5 deletions
|
@ -155,6 +155,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
|
||||||
fn load_node<R: EventReceiver>(&mut self, first_ev: &Event, recv: &mut R)
|
fn load_node<R: EventReceiver>(&mut self, first_ev: &Event, recv: &mut R)
|
||||||
-> Result<(), ScanError> {
|
-> Result<(), ScanError> {
|
||||||
match *first_ev {
|
match *first_ev {
|
||||||
|
Event::Alias => { unimplemented!() },
|
||||||
Event::Scalar(ref v, style) => {
|
Event::Scalar(ref v, style) => {
|
||||||
Ok(())
|
Ok(())
|
||||||
},
|
},
|
||||||
|
@ -164,8 +165,8 @@ impl<T: Iterator<Item=char>> Parser<T> {
|
||||||
Event::MappingStart => {
|
Event::MappingStart => {
|
||||||
self.load_mapping(first_ev, recv)
|
self.load_mapping(first_ev, recv)
|
||||||
},
|
},
|
||||||
// TODO more events
|
_ => { println!("UNREACHABLE EVENT: {:?}", first_ev);
|
||||||
_ => { unreachable!(); }
|
unreachable!(); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -379,7 +380,9 @@ impl<T: Iterator<Item=char>> Parser<T> {
|
||||||
self.skip();
|
self.skip();
|
||||||
let tok = try!(self.peek());
|
let tok = try!(self.peek());
|
||||||
match tok.1 {
|
match tok.1 {
|
||||||
TokenType::KeyToken | TokenType::ValueToken | TokenType::BlockEndToken
|
TokenType::KeyToken
|
||||||
|
| TokenType::ValueToken
|
||||||
|
| TokenType::BlockEndToken
|
||||||
=> {
|
=> {
|
||||||
self.state = State::BlockMappingValue;
|
self.state = State::BlockMappingValue;
|
||||||
// empty scalar
|
// empty scalar
|
||||||
|
@ -391,6 +394,11 @@ impl<T: Iterator<Item=char>> Parser<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
// XXX(chenyh): libyaml failed to parse spec 1.2, ex8.18
|
||||||
|
TokenType::ValueToken => {
|
||||||
|
self.state = State::BlockMappingValue;
|
||||||
|
Ok(Event::empty_scalar())
|
||||||
|
},
|
||||||
TokenType::BlockEndToken => {
|
TokenType::BlockEndToken => {
|
||||||
self.pop_state();
|
self.pop_state();
|
||||||
self.skip();
|
self.skip();
|
||||||
|
@ -411,7 +419,7 @@ impl<T: Iterator<Item=char>> Parser<T> {
|
||||||
match tok.1 {
|
match tok.1 {
|
||||||
TokenType::KeyToken | TokenType::ValueToken | TokenType::BlockEndToken
|
TokenType::KeyToken | TokenType::ValueToken | TokenType::BlockEndToken
|
||||||
=> {
|
=> {
|
||||||
self.state = State::BlockMappingValue;
|
self.state = State::BlockMappingKey;
|
||||||
// empty scalar
|
// empty scalar
|
||||||
Ok(Event::empty_scalar())
|
Ok(Event::empty_scalar())
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
extern crate yaml_rust;
|
extern crate yaml_rust;
|
||||||
|
|
||||||
use yaml_rust::parser::{Parser, EventReceiver, Event};
|
use yaml_rust::parser::{Parser, EventReceiver, Event};
|
||||||
|
use yaml_rust::scanner::TScalarStyle;
|
||||||
use yaml_rust::yaml::Yaml;
|
use yaml_rust::yaml::Yaml;
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, PartialOrd, Debug)]
|
#[derive(Clone, PartialEq, PartialOrd, Debug)]
|
||||||
|
@ -31,7 +32,7 @@ impl EventReceiver for YamlChecker {
|
||||||
Event::MappingStart => TestEvent::OnMapStart,
|
Event::MappingStart => TestEvent::OnMapStart,
|
||||||
Event::MappingEnd => TestEvent::OnMapEnd,
|
Event::MappingEnd => TestEvent::OnMapEnd,
|
||||||
Event::Scalar(ref v, style) => {
|
Event::Scalar(ref v, style) => {
|
||||||
if v == "~" {
|
if v == "~" && style == TScalarStyle::Plain {
|
||||||
TestEvent::OnNull
|
TestEvent::OnNull
|
||||||
} else {
|
} else {
|
||||||
TestEvent::OnScalar
|
TestEvent::OnScalar
|
||||||
|
|
|
@ -320,6 +320,7 @@ const EX8_16 : &'static str =
|
||||||
const EX8_17 : &'static str =
|
const EX8_17 : &'static str =
|
||||||
"? explicit key # Empty value\n? |\n block key\n: - one # Explicit compact\n - two # block value\n";
|
"? explicit key # Empty value\n? |\n block key\n: - one # Explicit compact\n - two # block value\n";
|
||||||
|
|
||||||
|
// XXX libyaml failed this test
|
||||||
const EX8_18 : &'static str =
|
const EX8_18 : &'static str =
|
||||||
"plain key: in-line value\n: # Both empty\n\"quoted key\":\n- entry\n";
|
"plain key: in-line value\n: # Both empty\n\"quoted key\":\n- entry\n";
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue