Use custom parser values instead of simple parser values for parsing Zone definitions

This commit is contained in:
Jan
2021-03-20 14:07:48 +01:00
parent ef36d6cdc5
commit 5e08469635
27 changed files with 431 additions and 174 deletions

View File

@ -1,9 +1,71 @@
#include "ZoneDefinitionLexer.h"
#include <sstream>
ZoneDefinitionLexer::ZoneDefinitionLexer(IParserLineStream* stream)
: SimpleLexer(stream)
: AbstractLexer(stream)
{
SetShouldEmitNewLineTokens(true);
SetShouldReadStrings(true);
SetShouldReadNumbers(false);
}
}
std::string ZoneDefinitionLexer::ReadField()
{
const auto& currentLine = CurrentLine();
assert(m_current_line_offset >= 1);
const auto startPos = m_current_line_offset - 1;
const auto lineSize = currentLine.m_line.size();
while (m_current_line_offset < lineSize)
{
const auto c = currentLine.m_line[m_current_line_offset];
bool isNonFieldCharacter;
switch (c)
{
case '\"':
case '>':
case '<':
case ',':
isNonFieldCharacter = true;
break;
default:
isNonFieldCharacter = false;
break;
}
if (isNonFieldCharacter)
break;
m_current_line_offset++;
}
return std::string(currentLine.m_line, startPos, m_current_line_offset - startPos);
}
ZoneDefinitionParserValue ZoneDefinitionLexer::GetNextToken()
{
auto c = NextChar();
while (c != EOF)
{
switch (c)
{
case '\"':
return ZoneDefinitionParserValue::String(GetPreviousCharacterPos(), new std::string(ReadString()));
case '>':
case '<':
case ',':
return ZoneDefinitionParserValue::Character(GetPreviousCharacterPos(), static_cast<char>(c));
default:
if (isspace(c))
break;
return ZoneDefinitionParserValue::Field(GetPreviousCharacterPos(), new std::string(ReadField()));
}
c = NextChar();
}
return ZoneDefinitionParserValue::EndOfFile(TokenPos());
}