From 873dbc242181bdd77a068db2376d2d91184ce9d1 Mon Sep 17 00:00:00 2001 From: Jesse Beder Date: Fri, 27 Jun 2008 00:18:52 +0000 Subject: [PATCH] The plain scalar scanner is almost done (and it scans a simple list correctly). Also messed around with multiple character peeking on the input, and got something working. --- scanner.cpp | 50 ++++++++++++++++++++++++-------------------------- scanner.h | 2 +- test.yaml | 3 +-- token.h | 7 ++++++- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/scanner.cpp b/scanner.cpp index 80227423bc..6fed538d7d 100644 --- a/scanner.cpp +++ b/scanner.cpp @@ -6,7 +6,7 @@ namespace YAML { Scanner::Scanner(std::istream& in) - : INPUT(in), m_startedStream(false), m_simpleKeyAllowed(false), m_flowLevel(0), m_column(0) + : INPUT(in), m_startedStream(false), m_endedStream(false), m_simpleKeyAllowed(false), m_flowLevel(0), m_column(0) { } @@ -51,14 +51,12 @@ namespace YAML { std::string ret; - // extract n - 1 characters, and peek at the nth - for(int i=0;i=0;i--) - INPUT.putback(ret[i]); + INPUT.clear(); + INPUT.seekg(pos); return ret; } @@ -214,6 +212,7 @@ namespace YAML // TODO: "reset simple keys" m_simpleKeyAllowed = false; + m_endedStream = true; return pToken; } @@ -228,7 +227,6 @@ namespace YAML // eat Eat(3); - return pToken; } @@ -242,7 +240,6 @@ namespace YAML // eat Eat(3); - return pToken; } @@ -254,9 +251,8 @@ namespace YAML m_simpleKeyAllowed = true; - // eat it - INPUT.get(); - + // eat + Eat(1); return pToken; } @@ -268,9 +264,8 @@ namespace YAML m_simpleKeyAllowed = true; - // eat it - INPUT.get(); - + // eat + Eat(1); return pToken; } @@ -282,9 +277,8 @@ namespace YAML m_simpleKeyAllowed = false; - // eat it - INPUT.get(); - + // eat + Eat(1); return pToken; } @@ -296,9 +290,8 @@ namespace YAML m_simpleKeyAllowed = false; - // eat it - INPUT.get(); - + // eat + Eat(1); return pToken; } @@ -309,9 +302,8 @@ namespace YAML m_simpleKeyAllowed = true; - // eat it - INPUT.get(); - + // eat + Eat(1); return pToken; } @@ -429,7 +421,7 @@ namespace YAML } // now eat blanks - while(IsBlank(INPUT.peek()) /* || IsBreak(INPUT.peek()) */) { + while(INPUT && (IsBlank(INPUT.peek()) /* || IsBreak(INPUT.peek()) */)) { if(IsBlank(INPUT.peek())) { if(leadingBlanks && m_column <= m_indents.top()) throw IllegalTabInScalar(); @@ -449,6 +441,7 @@ namespace YAML } // now modify our token + pToken->SetValue(scalar); if(leadingBlanks) m_simpleKeyAllowed = true; @@ -460,6 +453,9 @@ namespace YAML void Scanner::ScanNextToken() { + if(m_endedStream) + return; + if(!m_startedStream) return ScanAndEnqueue(new StreamStartToken); @@ -595,8 +591,10 @@ namespace YAML // temporary function for testing void Scanner::Scan() { - while(INPUT) { + while(1) { ScanNextToken(); + if(m_tokens.empty()) + break; while(!m_tokens.empty()) { Token *pToken = m_tokens.front(); diff --git a/scanner.h b/scanner.h index 1bc9e1a0ce..83f2583c9f 100644 --- a/scanner.h +++ b/scanner.h @@ -71,7 +71,7 @@ namespace YAML std::set m_limboTokens; // state info - bool m_startedStream; + bool m_startedStream, m_endedStream; bool m_simpleKeyAllowed; int m_flowLevel; // number of unclosed '[' and '{' indicators std::stack m_indents; diff --git a/test.yaml b/test.yaml index 7ac0238de2..0581ec1257 100644 --- a/test.yaml +++ b/test.yaml @@ -1,4 +1,3 @@ ---- - milk - eggs -- cheese \ No newline at end of file +- cheese and bread # this is really important! diff --git a/token.h b/token.h index da3dfff01c..ece11d8619 100644 --- a/token.h +++ b/token.h @@ -23,5 +23,10 @@ namespace YAML class KeyToken: public Token {}; class ValueToken: public Token {}; - class PlainScalarToken: public Token {}; + class PlainScalarToken: public Token { + public: + void SetValue(const std::string& value) { m_value = value; } + protected: + std::string m_value; + }; }