From 4cfa233888da422d8e6a6211fc0e40f28ab1eb33 Mon Sep 17 00:00:00 2001 From: Jesse Beder Date: Thu, 10 Jul 2008 00:23:25 +0000 Subject: [PATCH] Switched from moving the cursor forward (in Regex) to ignoring (this handles newlines properly). Updated some of the character-in-scalar rules. --- exp.h | 9 ++++----- regex.cpp | 2 +- scantoken.cpp | 9 ++++----- tests/scalars.yaml | 13 ++++++++++++- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/exp.h b/exp.h index 652e2bd..530973e 100644 --- a/exp.h +++ b/exp.h @@ -29,7 +29,7 @@ namespace YAML const RegEx BlockEntry = RegEx('-') + (BlankOrBreak || RegEx(EOF)); const RegEx Key = RegEx('?'), KeyInFlow = RegEx('?') + BlankOrBreak; - const RegEx Value = RegEx(':'), + const RegEx Value = RegEx(':') + BlankOrBreak, ValueInFlow = RegEx(':') + BlankOrBreak; const RegEx Comment = RegEx('#'); const RegEx AnchorEnd = RegEx("?:,]}%@`", REGEX_OR) || BlankOrBreak; @@ -38,12 +38,11 @@ namespace YAML // . Cannot start with a blank. // . Can never start with any of , [ ] { } # & * ! | > \' \" % @ ` // . In the block context - ? : must be not be followed with a space. - // . In the flow context ? : are illegal and - must not be followed with a space. + // . In the flow context ? is illegal and : and - must not be followed with a space. const RegEx PlainScalar = !(BlankOrBreak || RegEx(",[]{}#&*!|>\'\"%@`", REGEX_OR) || (RegEx("-?:", REGEX_OR) + Blank)), - PlainScalarInFlow = !(BlankOrBreak || RegEx("?:,[]{}#&*!|>\'\"%@`", REGEX_OR) || (RegEx('-') + Blank)); - const RegEx IllegalColonInScalar = RegEx(':') + !BlankOrBreak; + PlainScalarInFlow = !(BlankOrBreak || RegEx("?,[]{}#&*!|>\'\"%@`", REGEX_OR) || (RegEx("-:", REGEX_OR) + Blank)); const RegEx EndScalar = RegEx(':') + BlankOrBreak, - EndScalarInFlow = (RegEx(':') + BlankOrBreak) || RegEx(",:?[]{}", REGEX_OR); + EndScalarInFlow = (RegEx(':') + BlankOrBreak) || RegEx(",?[]{}", REGEX_OR); const RegEx EscSingleQuote = RegEx("\'\'"); const RegEx EscBreak = RegEx('\\') + Break; diff --git a/regex.cpp b/regex.cpp index 1da6289..e7f93e1 100644 --- a/regex.cpp +++ b/regex.cpp @@ -283,7 +283,7 @@ namespace YAML return -1; offset += n; - in.seekg(n, std::ios_base::cur); + in.ignore(n); } return offset; diff --git a/scantoken.cpp b/scantoken.cpp index 7a12c9a..5704a0a 100644 --- a/scantoken.cpp +++ b/scantoken.cpp @@ -274,7 +274,7 @@ namespace YAML // set up the scanning parameters ScanScalarParams params; - params.end = (m_flowLevel > 0 ? Exp::EndScalarInFlow : Exp::EndScalar) || (RegEx(' ') + Exp::Comment); + params.end = (m_flowLevel > 0 ? Exp::EndScalarInFlow : Exp::EndScalar) || (Exp::BlankOrBreak + Exp::Comment); params.eatEnd = false; params.indent = (m_flowLevel > 0 ? 0 : m_indents.top() + 1); params.fold = true; @@ -294,10 +294,9 @@ namespace YAML // can have a simple key only if we ended the scalar by starting a new line m_simpleKeyAllowed = params.leadingSpaces; - // finally, we can't have any colons in a scalar, so if we ended on a colon, there - // had better be a break after it - if(Exp::IllegalColonInScalar.Matches(INPUT)) - throw ParserException(INPUT.line, INPUT.column, ErrorMsg::CHAR_IN_SCALAR); + // finally, check and see if we ended on an illegal character + //if(Exp::IllegalCharInScalar.Matches(INPUT)) + // throw ParserException(INPUT.line, INPUT.column, ErrorMsg::CHAR_IN_SCALAR); Token *pToken = new Token(TT_SCALAR, line, column); pToken->value = scalar; diff --git a/tests/scalars.yaml b/tests/scalars.yaml index 79c735a..ae0059a 100644 --- a/tests/scalars.yaml +++ b/tests/scalars.yaml @@ -21,4 +21,15 @@ that gets chomped. - >2 Here's a folded scalar - that starts with some indentation. \ No newline at end of file + that starts with some indentation. +- ::vector +- ": - ()" +- Up, up, and away! +- -123 +- http://example.com/foo#bar +# Inside flow collection: +- [ ::vector, + ": - ()", + "Up, up and away!", + -123, + http://example.com/foo#bar ] \ No newline at end of file