protected virtual IToken NextTokenInside()
{
while (true)
{
switch (c)
{
case ' ':
case '\t':
case '\n':
case '\r':
Consume();
return SkipToken;
case '.':
Consume();
if (input.LA(1) == '.' && input.LA(2) == '.')
{
Consume();
Match('.');
return NewToken(ELLIPSIS);
}
return NewToken(DOT);
case ',':
Consume();
return NewToken(COMMA);
case ':':
Consume();
return NewToken(COLON);
case ';':
Consume();
return NewToken(SEMI);
case '(':
Consume();
return NewToken(LPAREN);
case ')':
Consume();
return NewToken(RPAREN);
case '[':
Consume();
return NewToken(LBRACK);
case ']':
Consume();
return NewToken(RBRACK);
case '=':
Consume();
return NewToken(EQUALS);
case '!':
Consume();
return NewToken(BANG);
case '@':
Consume();
if (c == 'e' && input.LA(2) == 'n' && input.LA(3) == 'd')
{
Consume();
Consume();
Consume();
return NewToken(REGION_END);
}
return NewToken(AT);
case '"':
return MatchString();
case '&':
Consume();
Match('&');
return NewToken(AND); // &&
case '|':
Consume();
Match('|');
return NewToken(OR); // ||
case '{':
return MatchSubTemplate();
default:
if (c == delimiterStopChar)
{
Consume();
scanningInsideExpr = false;
return NewToken(RDELIM);
}
if (IsIDStartLetter(c))
{
IToken id = MatchIdentifier();
switch (id.Text ?? string.Empty)
{
case "if":
return NewToken(IF);
case "endif":
return NewToken(ENDIF);
case "else":
return NewToken(ELSE);
case "elseif":
return NewToken(ELSEIF);
case "super":
return NewToken(SUPER);
case "true":
return NewToken(TRUE);
case "false":
return NewToken(FALSE);
default:
return id;
}
}
RecognitionException re = new NoViableAltException(string.Empty, 0, 0, input);
re.Line = startLine;
re.CharPositionInLine = startCharPositionInLine;
errMgr.LexerError(input.SourceName, string.Format("invalid character '{0}'", GetCharString(c)), templateToken, re);
if (c == EOF)
return NewToken(EOF_TYPE);
Consume();
break;
}
}
}