private Expression ReadExpression(ScriptReader source, bool readTerminatingSymbolFromStream, params PredefinedSymbol[] endsWithSymbols)
{
Expression expression = new Expression();
int bracketLevel = 0;
while (bracketLevel >= 0)
{
foreach (PredefinedSymbol terminatingSymbol in endsWithSymbols)
{
if ((bracketLevel == 0) && (source.NextIsKeyword(terminatingSymbol, !readTerminatingSymbolFromStream)))
{
return expression;
}
}
Token thisToken = source.PeekNextToken();
if (thisToken is EndOfStreamToken)
{
throw new CompilerMessage(ErrorCode.EndOfInputReached, "End of script reached in the middle of an expression");
}
CompilerUtils.AdjustBracketLevelIfTokenIsBracket(thisToken, ref bracketLevel);
if (bracketLevel >= 0)
{
expression.Add(source.ReadNextToken());
}
}
throw new CompilerMessage(ErrorCode.UnexpectedToken, "Unexpected '" + source.ReadNextToken() + "'");
}