Added parsing of anchors, aliases, and tags (still no semantics yet).

Fixed a silly bug in the simple key pushing (queues are FIFO!).
This commit is contained in:
Jesse Beder 2008-07-01 01:17:10 +00:00
parent 121c2e577f
commit 8180a85a3b
10 changed files with 167 additions and 34 deletions

View file

@ -11,27 +11,36 @@ namespace YAML
}
Sequence::~Sequence()
{
Clear();
}
void Sequence::Clear()
{
for(unsigned i=0;i<m_data.size();i++)
delete m_data[i];
m_data.clear();
}
void Sequence::Parse(Scanner *pScanner)
{
// grab start token
Token *pToken = pScanner->GetNextToken();
Clear();
// split based on start token
Token *pToken = pScanner->PeekNextToken();
switch(pToken->type) {
case TT_BLOCK_SEQ_START: ParseBlock(pScanner); break;
case TT_BLOCK_ENTRY: ParseImplicit(pScanner); break;
case TT_FLOW_SEQ_START: ParseFlow(pScanner); break;
}
delete pToken;
}
void Sequence::ParseBlock(Scanner *pScanner)
{
// eat start token
pScanner->EatNextToken();
while(1) {
Token *pToken = pScanner->PeekNextToken();
if(!pToken)
@ -52,11 +61,29 @@ namespace YAML
void Sequence::ParseImplicit(Scanner *pScanner)
{
// TODO
while(1) {
Token *pToken = pScanner->PeekNextToken();
// we're actually *allowed* to have no tokens at some point
if(!pToken)
break;
// and we end at anything other than a block entry
if(pToken->type != TT_BLOCK_ENTRY)
break;
pScanner->PopNextToken();
Node *pNode = new Node;
m_data.push_back(pNode);
pNode->Parse(pScanner);
}
}
void Sequence::ParseFlow(Scanner *pScanner)
{
// eat start token
pScanner->EatNextToken();
while(1) {
Token *pToken = pScanner->PeekNextToken();
if(!pToken)