コード例 #1
0
        /// <summary>
        /// 读取表达式
        /// </summary>
        /// <param name="level">优先级别</param>
        /// <returns>ReadResult</returns>
        private ReadResult ReadExpression(int level = 0)
        {
            var exp = ReadFirstExpression();

            int nextLevel = 0;
            var next      = spResult.PeekNext();

            while (!exp.IsClosedWrap && (nextLevel = OperatorPriority.GetOperatorLevel(next.Text)) > level)
            {
                exp  = ReadNextExpression(nextLevel, exp);
                next = spResult.PeekNext();
            }

            return(exp);
        }
コード例 #2
0
        /// <summary>
        /// 读取第一个表达式
        /// </summary>
        /// <returns>ReadResult</returns>
        private ReadResult ReadFirstExpression()
        {
            ReadResult result = ReadResult.Empty;

            var token = spResult.Next();

            // 只列出可以出现在最左边的
            switch (token.Type)
            {
            case TokenType.Operator:
                if (OperatorWord.UnaryExpressions.ContainsKey(token.Text))
                {
                    result.Expression = OperatorWord.UnaryExpressions[token.Text](ReadExpression(OperatorPriority.GetOperatorLevel(token.Text)).Expression);
                }
                else if (token.Is(OperatorWord.LeftBracket))
                {
                    result = ParseConvertType();
                }
                else if (token.Is(OperatorWord.Comma))
                {
                    result = ReadExpression();
                }
                else
                {
                    throw new ArgumentException(string.Format("Invalid Left Operator {0}", token.Text));
                }
                break;

            case TokenType.Identifier:
                result = ParseIdentifier(token);
                break;

            case TokenType.DigitValue:
                result.Expression = Expression.Constant(DigitValue.Parse(token.Text), DigitValue.GetType(token.Text));
                break;

            case TokenType.PackageValue:
                // 去掉首尾引号
                if (token.Text.StartsWith(PackageValue.String))
                {
                    result.Expression = Expression.Constant(token.Text.Substring(1, token.Text.Length - 2), PackageValue.All[PackageValue.String]);
                }
                else if (token.Text.StartsWith(PackageValue.Char))
                {
                    result.Expression = Expression.Constant(token.Text[1], PackageValue.All[PackageValue.Char]);
                }
                break;

            default:
                throw new ArgumentException(string.Format("Unsupported TokenType {0}", token.Type));
            }

            return(result);
        }