mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-11 23:38:09 -05:00
Use custom parser values instead of simple parser values for parsing Zone definitions
This commit is contained in:
@ -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());
|
||||
}
|
||||
|
Reference in New Issue
Block a user