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.
This commit is contained in:
Jesse Beder 2008-06-27 00:18:52 +00:00
parent 31f7db5a0d
commit 873dbc2421
4 changed files with 32 additions and 30 deletions

View file

@ -6,7 +6,7 @@
namespace YAML namespace YAML
{ {
Scanner::Scanner(std::istream& in) 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; std::string ret;
// extract n - 1 characters, and peek at the nth int pos = INPUT.tellg();
for(int i=0;i<n-1;i++) for(int i=0;i<n;i++)
ret += INPUT.get(); ret += INPUT.get();
ret += INPUT.peek();
// and put back the n - 1 characters we STOLE INPUT.clear();
for(int i=n-2;i>=0;i--) INPUT.seekg(pos);
INPUT.putback(ret[i]);
return ret; return ret;
} }
@ -214,6 +212,7 @@ namespace YAML
// TODO: "reset simple keys" // TODO: "reset simple keys"
m_simpleKeyAllowed = false; m_simpleKeyAllowed = false;
m_endedStream = true;
return pToken; return pToken;
} }
@ -228,7 +227,6 @@ namespace YAML
// eat // eat
Eat(3); Eat(3);
return pToken; return pToken;
} }
@ -242,7 +240,6 @@ namespace YAML
// eat // eat
Eat(3); Eat(3);
return pToken; return pToken;
} }
@ -254,9 +251,8 @@ namespace YAML
m_simpleKeyAllowed = true; m_simpleKeyAllowed = true;
// eat it // eat
INPUT.get(); Eat(1);
return pToken; return pToken;
} }
@ -268,9 +264,8 @@ namespace YAML
m_simpleKeyAllowed = true; m_simpleKeyAllowed = true;
// eat it // eat
INPUT.get(); Eat(1);
return pToken; return pToken;
} }
@ -282,9 +277,8 @@ namespace YAML
m_simpleKeyAllowed = false; m_simpleKeyAllowed = false;
// eat it // eat
INPUT.get(); Eat(1);
return pToken; return pToken;
} }
@ -296,9 +290,8 @@ namespace YAML
m_simpleKeyAllowed = false; m_simpleKeyAllowed = false;
// eat it // eat
INPUT.get(); Eat(1);
return pToken; return pToken;
} }
@ -309,9 +302,8 @@ namespace YAML
m_simpleKeyAllowed = true; m_simpleKeyAllowed = true;
// eat it // eat
INPUT.get(); Eat(1);
return pToken; return pToken;
} }
@ -429,7 +421,7 @@ namespace YAML
} }
// now eat blanks // now eat blanks
while(IsBlank(INPUT.peek()) /* || IsBreak(INPUT.peek()) */) { while(INPUT && (IsBlank(INPUT.peek()) /* || IsBreak(INPUT.peek()) */)) {
if(IsBlank(INPUT.peek())) { if(IsBlank(INPUT.peek())) {
if(leadingBlanks && m_column <= m_indents.top()) if(leadingBlanks && m_column <= m_indents.top())
throw IllegalTabInScalar(); throw IllegalTabInScalar();
@ -449,6 +441,7 @@ namespace YAML
} }
// now modify our token // now modify our token
pToken->SetValue(scalar);
if(leadingBlanks) if(leadingBlanks)
m_simpleKeyAllowed = true; m_simpleKeyAllowed = true;
@ -460,6 +453,9 @@ namespace YAML
void Scanner::ScanNextToken() void Scanner::ScanNextToken()
{ {
if(m_endedStream)
return;
if(!m_startedStream) if(!m_startedStream)
return ScanAndEnqueue(new StreamStartToken); return ScanAndEnqueue(new StreamStartToken);
@ -595,8 +591,10 @@ namespace YAML
// temporary function for testing // temporary function for testing
void Scanner::Scan() void Scanner::Scan()
{ {
while(INPUT) { while(1) {
ScanNextToken(); ScanNextToken();
if(m_tokens.empty())
break;
while(!m_tokens.empty()) { while(!m_tokens.empty()) {
Token *pToken = m_tokens.front(); Token *pToken = m_tokens.front();

View file

@ -71,7 +71,7 @@ namespace YAML
std::set <Token *> m_limboTokens; std::set <Token *> m_limboTokens;
// state info // state info
bool m_startedStream; bool m_startedStream, m_endedStream;
bool m_simpleKeyAllowed; bool m_simpleKeyAllowed;
int m_flowLevel; // number of unclosed '[' and '{' indicators int m_flowLevel; // number of unclosed '[' and '{' indicators
std::stack <int> m_indents; std::stack <int> m_indents;

View file

@ -1,4 +1,3 @@
---
- milk - milk
- eggs - eggs
- cheese - cheese and bread # this is really important!

View file

@ -23,5 +23,10 @@ namespace YAML
class KeyToken: public Token {}; class KeyToken: public Token {};
class ValueToken: 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;
};
} }