yaml-cpp/scanner.h

79 lines
1.6 KiB
C
Raw Normal View History

2008-06-26 13:05:28 +04:00
#pragma once
#include <ios>
#include <string>
#include <queue>
#include <stack>
#include <set>
2008-06-26 13:05:28 +04:00
namespace YAML
{
class Token;
namespace Keys
{
const char Comment = '#';
const char FlowSeqStart = '[';
const char FlowSeqEnd = ']';
const char FlowMapStart = '{';
const char FlowMapEnd = '}';
const char FlowEntry = ',';
const char BlockEntry = '-';
const char Key = '?';
const char Value = ':';
const char Alias = '*';
const char Anchor = '&';
const char Tag = '!';
const char LiteralScalar = '|';
const char FoldedScalar = '>';
2008-06-26 13:05:28 +04:00
}
class Scanner
{
public:
Scanner(std::istream& in);
~Scanner();
void ScanNextToken();
2008-06-26 13:05:28 +04:00
void ScanToNextToken();
void PushIndentTo(int column, bool sequence);
void PopIndentTo(int column);
2008-06-26 13:05:28 +04:00
void Scan();
private:
char GetChar();
void EatLineBreak();
void EatDocumentStart();
void EatDocumentEnd();
bool IsWhitespaceToBeEaten();
bool IsLineBreak();
bool IsBlank();
bool IsDocumentStart();
bool IsDocumentEnd();
bool IsBlockEntry();
bool IsKey();
bool IsValue();
bool IsPlainScalar();
template <typename T> void ScanAndEnqueue(T *pToken);
2008-06-26 13:05:28 +04:00
template <typename T> T *ScanToken(T *pToken);
private:
// the stream
std::istream& INPUT;
int m_column;
// the output (tokens)
std::queue <Token *> m_tokens;
std::set <Token *> m_limboTokens;
2008-06-26 13:05:28 +04:00
// state info
bool m_startedStream;
bool m_simpleKeyAllowed;
int m_flowLevel; // number of unclosed '[' and '{' indicators
std::stack <int> m_indents;
};
}