protected virtual IToken NextTokenOutside()
{
if (input.CharPositionInLine == 0 && (c == ' ' || c == '\t'))
{
while (c == ' ' || c == '\t')
Consume(); // scarf indent
if (c != EOF)
return NewToken(INDENT);
return NewToken(TEXT);
}
if (c == delimiterStartChar)
{
Consume();
if (c == '!')
return MatchComment();
if (c == '\\')
return MatchEscape(); // <\\> <\uFFFF> <\n> etc...
scanningInsideExpr = true;
return NewToken(LDELIM);
}
if (c == '\r')
{
Consume();
Consume();
return NewToken(NEWLINE);
} // \r\n -> \n
if (c == '\n')
{
Consume();
return NewToken(NEWLINE);
}
if (c == '}' && subtemplateDepth > 0)
{
scanningInsideExpr = true;
subtemplateDepth--;
Consume();
return NewTokenFromPreviousChar(RCURLY);
}
return MatchText();
}