From 5a8c5a3d44599c59a914f9869ae5f9136b87941c Mon Sep 17 00:00:00 2001 From: Ethiraric Date: Fri, 22 Dec 2023 16:11:07 +0100 Subject: [PATCH] More fixes towards invalid tabs. --- parser/src/scanner.rs | 45 +++++++++++++++++++++++++++++++++ parser/tests/yaml-test-suite.rs | 2 -- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/parser/src/scanner.rs b/parser/src/scanner.rs index 23c56ba..964a580 100644 --- a/parser/src/scanner.rs +++ b/parser/src/scanner.rs @@ -638,6 +638,50 @@ impl> Scanner { Ok(()) } + /// Skip over YAML whitespace (` `, `\n`, `\r`). + /// + /// # Errors + /// This function returns an error if the character after the whitespaces is a tab (`\t`) + /// character or if no whitespace was found. + fn skip_yaml_whitespace(&mut self) -> ScanResult { + let mut need_whitespace = true; + loop { + match self.look_ch() { + ' ' => { + self.skip(); + + need_whitespace = false; + } + '\n' | '\r' => { + self.lookahead(2); + self.skip_line(); + if self.flow_level == 0 { + self.allow_simple_key(); + } + need_whitespace = false; + } + '#' => { + while !is_breakz(self.ch()) { + self.skip(); + self.lookahead(1); + } + } + _ => break, + } + } + + if need_whitespace { + Err(ScanError::new(self.mark(), "expected whitespace")) + } else if self.ch() == '\t' { + Err(ScanError::new( + self.mark(), + "tabs disallowed in this context", + )) + } else { + Ok(()) + } + } + fn fetch_stream_start(&mut self) { let mark = self.mark; self.indent = -1; @@ -1760,6 +1804,7 @@ impl> Scanner { } self.skip(); + self.skip_yaml_whitespace()?; self.tokens.push_back(Token(start_mark, TokenType::Key)); Ok(()) } diff --git a/parser/tests/yaml-test-suite.rs b/parser/tests/yaml-test-suite.rs index 780e08d..cc998c0 100644 --- a/parser/tests/yaml-test-suite.rs +++ b/parser/tests/yaml-test-suite.rs @@ -299,7 +299,6 @@ fn expected_events(expected_tree: &str) -> Vec { static EXPECTED_FAILURES: &[&str] = &[ // These seem to be plain bugs // TAB as start of plain scalar instead of whitespace - "Y79Y-06", "Y79Y-03", // unexpected pass "Y79Y-04", // unexpected pass "Y79Y-05", // unexpected pass @@ -307,7 +306,6 @@ static EXPECTED_FAILURES: &[&str] = &[ "DK95-04", // TABs after marker ? or : (space required?) "Y79Y-07", - "Y79Y-08", "Y79Y-09", // Other TABs "DK95-01", // in double-quoted scalar