/* Long string literal, such as [[bla bla]] */
Token LongStringLiteral()
{
input.StorePosition();
input.BufferClear();
int numEqualsStart = CountEquals();
if (input.Current != '[')
{
throw new LuaSyntaxException(input, ExceptionMessage.INVALID_LONG_STRING_DELIMTER, input.Current);
}
// Skip immediately following newline
if (input.Current == '\r' || input.Current == '\n')
{
NextLine();
}
while (true)
{
while (input.Current != ']')
{
input.Advance();
}
input.Advance();
int numEqualsEnd = CountEquals();
// Output string if matching ='s found
if (numEqualsStart == numEqualsEnd && input.Current == ']')
{
// Trim long string delimters
input.BufferRemove(0, numEqualsStart);
input.BufferRemove(numEqualsEnd + 1);
input.Advance();
return(input.OutputBuffer(Symbol.String));
}
if (input.Current == ']')
{
// Parse ']' again because it can be the start of another long string delimeter
input.Back();
}
else
{
input.BufferAppend(input.Current);
}
}
}