/// <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); }
/// <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); }