mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-03 21:41:26 +12:00
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:
parent
31f7db5a0d
commit
873dbc2421
4 changed files with 32 additions and 30 deletions
50
scanner.cpp
50
scanner.cpp
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
---
|
|
||||||
- milk
|
- milk
|
||||||
- eggs
|
- eggs
|
||||||
- cheese
|
- cheese and bread # this is really important!
|
||||||
|
|
7
token.h
7
token.h
|
@ -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;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue