Exemple #1
0
        /// <summary>
        /// 重新构造二叉树
        /// </summary>
        /// <param name="strExpression">表达式</param>
        public void ChangeExpression(string strExpression)
        {
            _Expression = strExpression;

            _Tree              = null;
            _Position          = 0;
            _Identifiers       = null;
            _CurrentIdentifier = null;
            _ParentIdentifier  = null;

            if (strExpression != string.Empty)
            {
                try
                {
                    _ExpressionChars = new Char[strExpression.Length + 1];

                    strExpression.CopyTo(0, _ExpressionChars, 0, strExpression.Length);
                    _ExpressionChars[strExpression.Length] = '\0';

                    _Tree = DoExpression();

                    if (_ExpressionChars[_Position] != '\0')
                    {
                        throw ParsingException.NewParsingException(Parse_Error.peSyntaxError, _Position);
                    }
                }
                finally
                {
                    _CurrentIdentifier = null;
                    _ParentIdentifier  = null;
                }
            }
        }
Exemple #2
0
        //私有方法

        /// <summary>
        /// 顺序输出标识符
        /// </summary>
        /// <param name="oID"></param>
        /// <param name="strID"></param>
        /// <param name="nPos"></param>
        private void OutputID(Operation_IDs oID, string strID, int nPos)
        {
            if (OutputIdentifiers)
            {
                ParseIdentifier pi = new ParseIdentifier(oID, strID, nPos, _CurrentIdentifier);

                if (_CurrentIdentifier == null)
                {
                    if (_ParentIdentifier == null)
                    {
                        _Identifiers = pi;
                    }
                    else
                    {
                        _ParentIdentifier._SubIdentifier = pi;
                    }
                }
                else
                {
                    _CurrentIdentifier._NextIdentifier = pi;
                }

                pi._ParentIdentifier = _ParentIdentifier;
                _CurrentIdentifier   = pi;
            }
        }
Exemple #3
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="oID"></param>
 /// <param name="strID"></param>
 /// <param name="nPos"></param>
 /// <param name="prev"></param>
 public ParseIdentifier(Operation_IDs oID, string strID, int nPos, ParseIdentifier prev)
 {
     _OperationID    = oID;
     _Identifier     = strID;
     _Position       = nPos;
     _PrevIdentifier = prev;
 }
Exemple #4
0
        //得到表达式中对人员所属的限定信息
        private static string GetBelongTo(string strExp)
        {
            ParseExpression pe = new ParseExpression();


            pe.OutputIdentifiers = true;
            pe.UserFunctions     = (IExpParsing) new DoExpParsing();
            pe.ChangeExpression(strExp);

            ParseIdentifier pi = GetIdentifiers(pe.Identifiers, "belongto");

            if (pi == null)
            {
                return("");
            }

            string strValue = String.Empty;

            //得到类别
            pi       = pi.SubIdentifier.NextIdentifier;
            strValue = pi.Identifier.ToUpper();

            //得到objId
            pi        = pi.NextIdentifier.NextIdentifier;
            strValue += "," + pi.Identifier;

            //得到parentId
            pi        = pi.NextIdentifier.NextIdentifier;
            strValue += "," + pi.Identifier;

            return(strValue.Replace("\"", ""));
        }
Exemple #5
0
        //获得表达式中定义的人员级别限定信息
        private static string GetUserRank(string strExp)
        {
            ParseExpression pe = new ParseExpression();


            pe.OutputIdentifiers = true;
            pe.UserFunctions     = (IExpParsing) new DoExpParsing();
            pe.ChangeExpression(strExp);

            ParseIdentifier pi = GetIdentifiers(pe.Identifiers, "UserRank");

            if (pi == null)
            {
                return("");
            }

            string strValue = String.Empty;

            //得到限定的级别
            pi       = pi.SubIdentifier.NextIdentifier;
            strValue = pi.Identifier;


            //得到操作符
            pi       = pi.NextIdentifier.NextIdentifier;
            strValue = pi.Identifier + "," + strValue;

            return(strValue.Replace("\"", ""));
        }
Exemple #6
0
 private void OutputIDToParentLevel()
 {
     if (_ParentIdentifier != null)
     {
         _CurrentIdentifier = _ParentIdentifier;
         _ParentIdentifier  = _ParentIdentifier._ParentIdentifier;
     }
 }
Exemple #7
0
        /// <summary>
        /// 在Debug窗口输出调试值
        /// </summary>
        /// <param name="pi"></param>
        public static void OutputIdentifiers(ParseIdentifier pi)
        {
            while (pi != null)
            {
                Trace.WriteLine(new string('\t', _Level) + string.Format("ID:{0}\tPosition: {1}", pi.Identifier, pi.Position));

                if (pi.SubIdentifier != null)
                {
                    _Level++;
                    OutputIdentifiers(pi.SubIdentifier);
                    _Level--;
                }
                pi = pi.NextIdentifier;
            }
        }
Exemple #8
0
        private static ParseIdentifier GetIdentifiers(ParseIdentifier pi, string strID)
        {
            while (pi != null)
            {
                if (pi.Identifier.ToLower() == strID.ToLower())
                {
                    return(pi);
                }

                if (pi.SubIdentifier != null)
                {
                    ParseIdentifier piTemp = GetIdentifiers(pi.SubIdentifier, strID);
                    if (piTemp != null)
                    {
                        return(piTemp);
                    }
                }
                pi = pi.NextIdentifier;
            }
            return(null);
        }
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="oID"></param>
		/// <param name="strID"></param>
		/// <param name="nPos"></param>
		/// <param name="prev"></param>
		public ParseIdentifier(Operation_IDs oID, string strID, int nPos, ParseIdentifier prev)
		{
			_OperationID = oID;
			_Identifier = strID;
			_Position = nPos;
			_PrevIdentifier = prev;
		}
		private void OutputIDToParentLevel()
		{
			if (_ParentIdentifier != null)
			{
				_CurrentIdentifier = _ParentIdentifier;
				_ParentIdentifier = _ParentIdentifier._ParentIdentifier;
			}
		}
		private void OutputIDToSubLevel()
		{
			_ParentIdentifier = _CurrentIdentifier;
			_CurrentIdentifier = null;
		}
		//私有方法

		/// <summary>
		/// 顺序输出标识符
		/// </summary>
		/// <param name="oID"></param>
		/// <param name="strID"></param>
		/// <param name="nPos"></param>
		private void OutputID(Operation_IDs oID, string strID, int nPos)
		{
			if (OutputIdentifiers)
			{
				ParseIdentifier pi = new ParseIdentifier(oID, strID, nPos, _CurrentIdentifier);

				if (_CurrentIdentifier == null)
				{
					if (_ParentIdentifier == null)
						_Identifiers = pi;
					else
						_ParentIdentifier._SubIdentifier = pi;
				}
				else
					_CurrentIdentifier._NextIdentifier = pi;

				pi._ParentIdentifier = _ParentIdentifier;
				_CurrentIdentifier = pi;
			}
		}
		/// <summary>
		/// 重新构造二叉树
		/// </summary>
		/// <param name="strExpression">表达式</param>
		public void ChangeExpression(string strExpression)
		{
			_Expression = strExpression;

			_Tree = null;
			_Position = 0;
			_Identifiers = null;
			_CurrentIdentifier = null;
			_ParentIdentifier = null;

			if (strExpression != string.Empty)
			{
				try
				{
					_ExpressionChars = new Char[strExpression.Length + 1];

					strExpression.CopyTo(0, _ExpressionChars, 0, strExpression.Length);
					_ExpressionChars[strExpression.Length] = '\0';

					_Tree = DoExpression();

					if (_ExpressionChars[_Position] != '\0')
						throw ParsingException.NewParsingException(Parse_Error.peSyntaxError, _Position);
				}
				finally
				{
					_CurrentIdentifier = null;
					_ParentIdentifier = null;
				}
			}
		}
		/// <summary>
		/// 在Debug窗口输出调试值
		/// </summary>
		/// <param name="pi"></param>
		public static void OutputIdentifiers(ParseIdentifier pi)
		{
			while (pi != null)
			{
				Trace.WriteLine(new string('\t', _Level) + string.Format("ID:{0}\tPosition: {1}", pi.Identifier, pi.Position));

				if (pi.SubIdentifier != null)
				{
					_Level++;
					OutputIdentifiers(pi.SubIdentifier);
					_Level--;
				}
				pi = pi.NextIdentifier;
			}
		}
		private static ParseIdentifier GetIdentifiers(ParseIdentifier pi, string strID)
		{
			while (pi != null)
			{
				if (pi.Identifier.ToLower() == strID.ToLower())
					return pi;

				if (pi.SubIdentifier != null)
				{
					ParseIdentifier piTemp = GetIdentifiers(pi.SubIdentifier, strID);
					if (piTemp != null)
						return piTemp;
				}
				pi = pi.NextIdentifier;
			}
			return null;
		}
Exemple #16
0
 private void OutputIDToSubLevel()
 {
     _ParentIdentifier  = _CurrentIdentifier;
     _CurrentIdentifier = null;
 }