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() + "'");
        }
Exemple #2
0
        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);
        }