From b6acd869ebba614309e0adfb2bbfc1ce8f45c9c9 Mon Sep 17 00:00:00 2001 From: Yuheng Chen Date: Wed, 27 May 2015 23:04:03 +0800 Subject: [PATCH] Fix parsing bugs 1. empty key & value support 2. OnNull handling in test --- saphyr/src/parser.rs | 16 ++++++++++++---- saphyr/tests/spec_test.rs | 3 ++- saphyr/tests/specexamples.rs.inc | 1 + 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/saphyr/src/parser.rs b/saphyr/src/parser.rs index fa8ce0a..c72b786 100644 --- a/saphyr/src/parser.rs +++ b/saphyr/src/parser.rs @@ -155,6 +155,7 @@ impl> Parser { fn load_node(&mut self, first_ev: &Event, recv: &mut R) -> Result<(), ScanError> { match *first_ev { + Event::Alias => { unimplemented!() }, Event::Scalar(ref v, style) => { Ok(()) }, @@ -164,8 +165,8 @@ impl> Parser { Event::MappingStart => { self.load_mapping(first_ev, recv) }, - // TODO more events - _ => { unreachable!(); } + _ => { println!("UNREACHABLE EVENT: {:?}", first_ev); + unreachable!(); } } } @@ -379,7 +380,9 @@ impl> Parser { self.skip(); let tok = try!(self.peek()); match tok.1 { - TokenType::KeyToken | TokenType::ValueToken | TokenType::BlockEndToken + TokenType::KeyToken + | TokenType::ValueToken + | TokenType::BlockEndToken => { self.state = State::BlockMappingValue; // empty scalar @@ -391,6 +394,11 @@ impl> Parser { } } }, + // XXX(chenyh): libyaml failed to parse spec 1.2, ex8.18 + TokenType::ValueToken => { + self.state = State::BlockMappingValue; + Ok(Event::empty_scalar()) + }, TokenType::BlockEndToken => { self.pop_state(); self.skip(); @@ -411,7 +419,7 @@ impl> Parser { match tok.1 { TokenType::KeyToken | TokenType::ValueToken | TokenType::BlockEndToken => { - self.state = State::BlockMappingValue; + self.state = State::BlockMappingKey; // empty scalar Ok(Event::empty_scalar()) } diff --git a/saphyr/tests/spec_test.rs b/saphyr/tests/spec_test.rs index 11f5fe1..a796403 100644 --- a/saphyr/tests/spec_test.rs +++ b/saphyr/tests/spec_test.rs @@ -2,6 +2,7 @@ extern crate yaml_rust; use yaml_rust::parser::{Parser, EventReceiver, Event}; +use yaml_rust::scanner::TScalarStyle; use yaml_rust::yaml::Yaml; #[derive(Clone, PartialEq, PartialOrd, Debug)] @@ -31,7 +32,7 @@ impl EventReceiver for YamlChecker { Event::MappingStart => TestEvent::OnMapStart, Event::MappingEnd => TestEvent::OnMapEnd, Event::Scalar(ref v, style) => { - if v == "~" { + if v == "~" && style == TScalarStyle::Plain { TestEvent::OnNull } else { TestEvent::OnScalar diff --git a/saphyr/tests/specexamples.rs.inc b/saphyr/tests/specexamples.rs.inc index 0996fda..a5398c3 100644 --- a/saphyr/tests/specexamples.rs.inc +++ b/saphyr/tests/specexamples.rs.inc @@ -320,6 +320,7 @@ const EX8_16 : &'static str = const EX8_17 : &'static str = "? 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 = "plain key: in-line value\n: # Both empty\n\"quoted key\":\n- entry\n";