private IToken MatchSubTemplate()
{
// look for "{ args ID (',' ID)* '|' ..."
subtemplateDepth++;
int m = input.Mark();
int curlyStartChar = startCharIndex;
int curlyLine = startLine;
int curlyPos = startCharPositionInLine;
List<IToken> argTokens = new List<IToken>();
Consume();
IToken curly = NewTokenFromPreviousChar(LCURLY);
ConsumeWhitespace();
argTokens.Add(MatchIdentifier());
ConsumeWhitespace();
while (c == ',')
{
Consume();
argTokens.Add(NewTokenFromPreviousChar(COMMA));
ConsumeWhitespace();
argTokens.Add(MatchIdentifier());
ConsumeWhitespace();
}
ConsumeWhitespace();
if (c == '|')
{
Consume();
argTokens.Add(NewTokenFromPreviousChar(PIPE));
if (IsWS(c))
Consume(); // ignore a single whitespace after |
//System.out.println("matched args: "+argTokens);
foreach (IToken t in argTokens)
Emit(t);
input.Release(m);
scanningInsideExpr = false;
startCharIndex = curlyStartChar; // reset state
startLine = curlyLine;
startCharPositionInLine = curlyPos;
return curly;
}
input.Rewind(m);
startCharIndex = curlyStartChar; // reset state
startLine = curlyLine;
startCharPositionInLine = curlyPos;
Consume();
scanningInsideExpr = false;
return curly;
}