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() + "'"); }
private int FindIndexOfLowestPrecedenceOperator() { int foundIndex = -1; int foundPrecedence = -1; int bracketLevel = 0; for (int i = 0; i < this.Count; i++) { if (CompilerUtils.AdjustBracketLevelIfTokenIsBracket(this[i], ref bracketLevel)) { // do nothing, the bracketlevel has been changed } else if (bracketLevel == 0) { if (this[i] is OperatorToken) { int thisPrecedence = ((OperatorToken)this[i]).Precedence; if (thisPrecedence > foundPrecedence) { foundPrecedence = thisPrecedence; foundIndex = i; } } else if (this[i] is KeywordToken) { if (((KeywordToken)this[i]).IsModificationOperator) { if (MODIFICATION_OPERATOR_PRECEDENCE > foundPrecedence) { foundPrecedence = MODIFICATION_OPERATOR_PRECEDENCE; foundIndex = i; } } } } } return(foundIndex); }