예제 #1
0
        private void ParseIdentifier()
        {
            while (_CurrentChar >= '0' && _CurrentChar <= '9' ||
                   _CurrentChar >= 'a' && _CurrentChar <= 'z' ||
                   _CurrentChar >= 'A' && _CurrentChar <= 'Z' ||
                   _CurrentChar == '_')
            {
                Value.Append(_CurrentChar);
                NextChar();
            }
            switch (Value.ToString().ToLower())
            {
            case "and":
                TokenType = eTokenType.operator_and;
                break;

            case "or":
                TokenType = eTokenType.operator_or;
                break;

            case "true":
            case "yes":
                TokenType = eTokenType.value_true;
                break;

            case "false":
            case "no":
                TokenType = eTokenType.value_false;
                break;

            default:
                TokenType = eTokenType.value_identifier;
                break;
            }
        }
예제 #2
0
        public static JsonScannerToken New(eTokenType type)
        {
            JsonScannerToken ret = new JsonScannerToken();

            ret.Type = type;
            return(ret);
        }
예제 #3
0
 /// <summary>
 /// Add a keyword to the default type dictionary.
 /// </summary>
 public void AddKeyword(string keyword, eTokenType type, bool caseSensative)
 {
     /// NOTE: The keyword is interned, and the lexer will use
     /// the interned string when possible.  In other cases,
     /// common strings are pooled by the lexer (see MinTern)
     keyword = string.Intern(keyword);
     if (caseSensative)
     {
         // Add to case sensative
         if (!mKeywordsSensative.ContainsKey(keyword))
         {
             mKeywordsSensative[string.Intern(keyword)]
                 = new TokenTypeLu(keyword, type);
         }
     }
     else
     {
         // Add to case insensative
         string lower = string.Intern(keyword.ToLower());
         if (!mKeywordsInsensative.ContainsKey(keyword))
         {
             mKeywordsInsensative[string.Intern(lower)]
                 = new TokenTypeLu(keyword, type);
         }
     }
 }
예제 #4
0
파일: Token.cs 프로젝트: gosub-com/Bit
 public Token(string tokenName, int lineIndex, int charIndex, eTokenType tokenType)
 {
     Name = tokenName;
     Line = lineIndex;
     Char = charIndex;
     Type = tokenType;
 }
예제 #5
0
        public opCodeUnary(eTokenType tt, opCode param1)
        {
            mParam1 = param1;
            mParam1.ValueChanged += mParam1_ValueChanged;
            EvalType v1Type = mParam1.EvalType;

            switch (tt)
            {
            case eTokenType.operator_not:
            {
                if (v1Type == EvalType.Boolean)
                {
                    mValueDelegate = BOOLEAN_NOT;
                    mEvalType      = EvalType.Boolean;
                }

                break;
            }

            case eTokenType.operator_minus:
            {
                if (v1Type == EvalType.Number)
                {
                    mValueDelegate = NUM_CHGSIGN;
                    mEvalType      = EvalType.Number;
                }

                break;
            }
            }
        }
예제 #6
0
        private IList <iEvalTypedValue> ParseParameters(ref bool brackets)
        {
            IList <iEvalTypedValue> parameters = new List <iEvalTypedValue>();
            opCode     valueleft;
            eTokenType lClosing = eTokenType.none;

            if (mTokenizer.type == eTokenType.open_parenthesis || (mTokenizer.type == eTokenType.open_bracket & mEvaluator.Syntax == eParserSyntax.cSharp))
            {
                switch (mTokenizer.type)
                {
                case eTokenType.open_bracket:
                {
                    lClosing = eTokenType.close_bracket;
                    brackets = true;
                    break;
                }

                case eTokenType.open_parenthesis:
                {
                    lClosing = eTokenType.close_parenthesis;
                    break;
                }
                }

                mTokenizer.NextToken(); // eat the parenthesis
                do
                {
                    if (mTokenizer.type == lClosing)
                    {
                        // good we eat the end parenthesis and continue ...
                        mTokenizer.NextToken();
                        break;
                    }

                    valueleft = ParseExpr(null /* TODO Change to default(_) if this is not a reference type */, ePriority.none);
                    parameters.Add(valueleft);
                    if (mTokenizer.type == lClosing)
                    {
                        // good we eat the end parenthesis and continue ...
                        mTokenizer.NextToken();
                        break;
                    }
                    else if (mTokenizer.type == eTokenType.comma)
                    {
                        mTokenizer.NextToken();
                    }
                    else
                    {
                        mTokenizer.RaiseUnexpectedToken(lClosing.ToString() + " not found");
                    }
                }while (true);
            }
            return(parameters);
        }
예제 #7
0
        private void ParseIdentifier()
        {
            while ((mCurChar >= '0' & mCurChar <= '9') | (mCurChar >= 'a' & mCurChar <= 'z') | (mCurChar >= 'A' & mCurChar <= 'Z') | (mCurChar >= 'A' & mCurChar <= 'Z') | (mCurChar >= (char)(128)) | (mCurChar == '_'))
            {
                value.Append(mCurChar);
                NextChar();
            }
            switch (value.ToString())
            {
            case "and":
            {
                type = eTokenType.operator_and;
                break;
            }

            case "or":
            {
                type = eTokenType.operator_or;
                break;
            }

            case "not":
            {
                type = eTokenType.operator_not;
                break;
            }

            case "true":
            case "yes":
            {
                type = eTokenType.value_true;
                break;
            }

            case "if":
            {
                type = eTokenType.operator_if;
                break;
            }

            case "false":
            case "no":
            {
                type = eTokenType.value_false;
                break;
            }

            default:
            {
                type = eTokenType.value_identifier;
                break;
            }
            }
        }
예제 #8
0
        protected JsonScannerToken ReturnToken(eTokenType tipo, object conteudo)
        {
            CurrentToken.Type = tipo;
            if (conteudo != null)
            {
                CurrentTokenAppend(conteudo);
            }
            JsonScannerToken ret = CurrentToken;

            NewCurrentToken();
            return(ret);
        }
예제 #9
0
 private void ParseDate()
 {
     NextChar();
     while (_CurrentChar >= '0' && _CurrentChar <= '9' ||
            _CurrentChar == ':' || _CurrentChar == ' ' ||
            _CurrentChar == '/' || _CurrentChar == 'A' || _CurrentChar == 'P' ||
            _CurrentChar == 'M')
     {
         Value.Append(_CurrentChar);
         NextChar();
     }
     if (_CurrentChar != '#')
     {
         throw new ApplicationException("Error Tipe Data Date !");
     }
     NextChar();
     TokenType = eTokenType.value_date;
 }
예제 #10
0
 private void ParseText()
 {
     NextChar();
     while (_CurrentChar != '\x0')
     {
         if (_CurrentChar == '"')
         {
             NextChar();
             if (_CurrentChar != '"')
             {
                 break;
             }
         }
         Value.Append(_CurrentChar);
         NextChar();
     }
     TokenType = eTokenType.value_string;
 }
예제 #11
0
 private void ParseNumber()
 {
     while (_CurrentChar >= '0' && _CurrentChar <= '9')
     {
         Value.Append(_CurrentChar);
         NextChar();
     }
     if (_CurrentChar == '.')
     {
         Value.Append('.');
         NextChar();
         while (_CurrentChar >= '0' && _CurrentChar <= '9')
         {
             Value.Append(_CurrentChar);
             NextChar();
         }
     }
     TokenType = eTokenType.value_number;
 }
예제 #12
0
 private void ParseNumber()
 {
     type = eTokenType.value_number;
     while (mCurChar >= '0' & mCurChar <= '9')
     {
         value.Append(mCurChar);
         NextChar();
     }
     if (mCurChar == '.')
     {
         value.Append(mCurChar);
         NextChar();
         while (mCurChar >= '0' & mCurChar <= '9')
         {
             value.Append(mCurChar);
             NextChar();
         }
     }
 }
예제 #13
0
        private void ParseDate()
        {
            NextChar(); // eat the #
            int zone = 0;

            while ((mCurChar >= '0' & mCurChar <= '9') | (mCurChar == '/') | (mCurChar == ':') | (mCurChar == ' '))
            {
                value.Append(mCurChar);
                NextChar();
            }
            if (mCurChar != '#')
            {
                RaiseError("Invalid date should be #dd/mm/yyyy#");
            }
            else
            {
                NextChar();
            }
            type = eTokenType.value_date;
        }
예제 #14
0
 internal void RaiseWrongOperator(eTokenType tt, object ValueLeft, object valueRight, string msg = null)
 {
     if (msg.Length > 0)
     {
         msg.Replace("[op]", tt.GetType().ToString());
         msg += ". ";
     }
     msg = "Cannot apply the operator " + tt.ToString();
     if (ValueLeft == null)
     {
         msg += " on nothing";
     }
     else
     {
         msg += " on a " + ValueLeft.GetType().ToString();
     }
     if (valueRight != null)
     {
         msg += " and a " + valueRight.GetType().ToString();
     }
     RaiseError(msg);
 }
예제 #15
0
	public void NextToken()
	{
		value.Length = 0;
		type = eTokenType.none;
		do
		{
			startpos = mPos;
			switch (mCurChar)
			{
				case 0:
					type = eTokenType.end_of_formula;
					break;
				case '0': // TODO: to '9' 
					ParseNumber();
					break;
				case '-':
				case '–':
					NextChar();
					type = eTokenType.operator_minus;
					break;
				case '+':
					NextChar();
					type = eTokenType.operator_plus;
					break;
				case '*':
					NextChar();
					type = eTokenType.operator_mul;
					break;
				case '/':
					NextChar();
					type = eTokenType.operator_div;
					break;
				case '%':
					NextChar();
					type = eTokenType.operator_percent;
					break;
				case '(':
					NextChar();
					type = eTokenType.open_parenthesis;
					break;
				case ')':
					NextChar();
					type = eTokenType.close_parenthesis;
					break;
				case '<':
					NextChar();
					if (mCurChar == '=')
					{
						NextChar();
						type = eTokenType.operator_le;
					}
					else if (mCurChar == '>')
					{
						NextChar();
						type = eTokenType.operator_ne;
					}
					else
					{
						type = eTokenType.operator_lt;
					}

					break;
				case '>':
					NextChar();
					if (mCurChar == '=')
					{
						NextChar();
						type = eTokenType.operator_ge;
					}
					else
					{
						type = eTokenType.operator_gt;
					}

					break;
				case ',':
					NextChar();
					type = eTokenType.comma;
					break;
				case '=':
					NextChar();
					type = eTokenType.operator_eq;
					break;
				case '.':
					NextChar();
					type = eTokenType.dot;
					break;
				case '\'':
				case '"':
					ParseString(true);
					type = eTokenType.value_string;
					break;
				case '#':
					ParseDate();
					break;
				case '&':
					NextChar();
					type = eTokenType.operator_concat;
					break;
				case '[':
					NextChar();
					type = eTokenType.open_bracket;
					break;
				case ']':
					NextChar();
					type = eTokenType.close_bracket;
					break;
				case '\0': // TODO: to ' ' 
					break;
				// do nothing 
				default:
					ParseIdentifier();
					break;
			}
			if (type != eTokenType.none)
				break;

			NextChar();
		}
		while (true);
	}
예제 #16
0
	internal void RaiseWrongOperator(eTokenType tt, object ValueLeft, object valueRight, string msg) 
	{ 
		if (Strings.Len(msg) > 0) { 
			msg.Replace("[op]", tt.GetType().ToString()); 
			msg // ERROR: Unknown assignment operator ConcatString ; 
		} 
		msg = "Cannot apply the operator " + tt.ToString(); 
		if (ValueLeft == null) { 
			msg // ERROR: Unknown assignment operator ConcatString ; 
		} 
		else { 
			msg // ERROR: Unknown assignment operator ConcatString ; 
		} 
		if ((valueRight != null)) { 
			msg // ERROR: Unknown assignment operator ConcatString ; 
		} 
		RaiseError(msg); 
	}
예제 #17
0
파일: FSM.cs 프로젝트: letmefly/unity
 public Token(eTokenType type)
 {
     mType = type;
 }
예제 #18
0
        internal void NextToken()
        {
            Value.Length = 0;
            TokenType    = eTokenType.none;
            do
            {
                switch (_CurrentChar)
                {
                case '\x0':
                    TokenType = eTokenType.end_of_expr;
                    break;

                case '-':
                    NextChar();
                    TokenType = eTokenType.operator_minus;
                    break;

                case '+':
                    NextChar();
                    TokenType = eTokenType.operator_plus;
                    break;

                case '*':
                    NextChar();
                    TokenType = eTokenType.operator_mul;
                    break;

                case '/':
                    NextChar();
                    TokenType = eTokenType.operator_div;
                    break;

                case '(':
                    NextChar();
                    TokenType = eTokenType.open_parenthesis;
                    break;

                case ')':
                    NextChar();
                    TokenType = eTokenType.close_parenthesis;
                    break;

                case '<':
                    NextChar();
                    switch (_CurrentChar)
                    {
                    case '=':
                        NextChar();
                        TokenType = eTokenType.operator_le;
                        break;

                    case '>':
                        NextChar();
                        TokenType = eTokenType.operator_ne;
                        break;

                    default:
                        TokenType = eTokenType.operator_lt;
                        break;
                    }
                    break;

                case '>':
                    NextChar();
                    if (_CurrentChar == '=')
                    {
                        NextChar();
                        TokenType = eTokenType.operator_ge;
                    }
                    else
                    {
                        TokenType = eTokenType.operator_gt;
                    }
                    break;

                case ',':
                    NextChar();
                    TokenType = eTokenType.comma;
                    break;

                case '=':
                    NextChar();
                    TokenType = eTokenType.operator_eq;
                    break;

                case '.':
                    NextChar();
                    TokenType = eTokenType.dot;
                    break;

                case '"':
                    ParseText();
                    break;

                case '#':
                    ParseDate();
                    break;

                case ' ':
                    break;

                default:
                    if (_CurrentChar >= '0' && _CurrentChar <= '9')
                    {
                        ParseNumber();
                    }
                    else
                    {
                        ParseIdentifier();
                    }
                    break;
                }
                if (TokenType != eTokenType.none)
                {
                    break;
                }
                NextChar();
            } while (true);
        }
예제 #19
0
 public Token(eTokenType type, string value)
 {
     this.Type  = type;
     this.Value = value;
 }
예제 #20
0
	public opCodeBinary(tokenizer tokenizer, opCode param1, eTokenType tt, opCode param2)
	{
		mParam1 = param1;
		mParam2 = param2;

		EvalType v1Type = mParam1.EvalType;
		EvalType v2Type = mParam2.EvalType;

		switch (tt)
		{
			case eTokenType.operator_plus:
				if (v1Type == EvalType.Number & v2Type == EvalType.Number)
				{
					mValueDelegate = NUM_PLUS_NUM;
					mEvalType = EvalType.Number;
				}
				else if (v1Type == EvalType.Number & v2Type == EvalType.Date)
				{
					SwapParams(ref mParam1, mParam2);
					mValueDelegate = DATE_PLUS_NUM;
					mEvalType = EvalType.Date;
				}
				else if (v1Type == EvalType.Date & v2Type == EvalType.Number)
				{
					mValueDelegate = DATE_PLUS_NUM;
					mEvalType = EvalType.Date;
				}
				else if (mParam1.CanReturn(EvalType.String) & mParam2.CanReturn(EvalType.String))
				{
					Convert(tokenizer, param1, ref EvalType.String);
					mValueDelegate = STR_CONCAT_STR;
					mEvalType = EvalType.String;
				}

				break;
			case eTokenType.operator_minus:
				if (v1Type == EvalType.Number & v2Type == EvalType.Number)
				{
					mValueDelegate = NUM_MINUS_NUM;
					mEvalType = EvalType.Number;
				}
				else if (v1Type == EvalType.Date & v2Type == EvalType.Number)
				{
					mValueDelegate = DATE_MINUS_NUM;
					mEvalType = EvalType.Date;
				}
				else if (v1Type == EvalType.Date & v2Type == EvalType.Date)
				{
					mValueDelegate = DATE_MINUS_DATE;
					mEvalType = EvalType.Number;
				}

				break;
			case eTokenType.operator_mul:
				if (v1Type == EvalType.Number & v2Type == EvalType.Number)
				{
					mValueDelegate = NUM_MUL_NUM;
					mEvalType = EvalType.Number;
				}

				break;
			case eTokenType.operator_div:
				if (v1Type == EvalType.Number & v2Type == EvalType.Number)
				{
					mValueDelegate = NUM_DIV_NUM;
					mEvalType = EvalType.Number;
				}

				break;
			case eTokenType.operator_percent:
				if (v1Type == EvalType.Number & v2Type == EvalType.Number)
				{
					mValueDelegate = NUM_PERCENT_NUM;
					mEvalType = EvalType.Number;
				}

				break;
			case eTokenType.operator_and:
			case eTokenType.operator_or:
				Convert(tokenizer, mParam1, ref EvalType.Boolean);
				Convert(tokenizer, mParam2, ref EvalType.Boolean);
				switch (tt)
				{
					case eTokenType.operator_or:
						mValueDelegate = BOOL_OR_BOOL;
						mEvalType = EvalType.Boolean;
						break;
					case eTokenType.operator_and:
						mValueDelegate = BOOL_AND_BOOL;
						mEvalType = EvalType.Boolean;
						break;
				}
				break;
		}

		if (mValueDelegate == null)
		{
			tokenizer.RaiseError("Cannot apply the operator " + tt.ToString().Replace("operator_", "") + " on " + v1Type.ToString() + " and " + v2Type.ToString());
		}
	}
예제 #21
0
	private void ParseDate()
	{
		NextChar();
		// eat the # 
		int zone = 0;
		while ((mCurChar >= '0' & mCurChar <= '9') | (mCurChar == '/') | (mCurChar == ':') | (mCurChar == ' '))
		{
			value.Append(mCurChar);
			NextChar();
		}
		if (mCurChar != "#")
		{
			RaiseError("Invalid date should be #dd/mm/yyyy#");
		}
		else
		{
			NextChar();
		}
		type = eTokenType.value_date;
	}
예제 #22
0
 protected JsonScannerToken ReturnToken(eTokenType tipo)
 {
     return(ReturnToken(tipo, null));
 }
예제 #23
0
        private object ParseExpr(ePriority ePriority)
        {
            object ValueLeft = null, ValueRight;

LeftParse:
            #region LeftParse
            switch (_Tokenizer.TokenType)
            {
            case eTokenType.operator_minus:
                _Tokenizer.NextToken();
                ValueLeft = ParseExpr(ePriority.UnaryMinus);

                if (ValueLeft.GetType() == typeof(decimal))
                {
                    ValueLeft = -(decimal)ValueLeft;
                }
                else
                {
                    throw new ApplicationException("Operator Unary Minus pada nilai non numerik");
                }
                break;

            case eTokenType.operator_plus:
                _Tokenizer.NextToken();
                goto LeftParse;

            case eTokenType.operator_not:
                _Tokenizer.NextToken();
                ValueLeft = ParseExpr(ePriority.Not);
                if (ValueLeft.GetType() == typeof(bool))
                {
                    ValueLeft = !(bool)ValueLeft;
                }
                else
                {
                    throw new ApplicationException("Operator NOT pada nilai non boolean");
                }
                break;

            case eTokenType.value_identifier:
                ValueLeft = ParseIdentifier();
                break;

            case eTokenType.value_true:
                ValueLeft = true;
                _Tokenizer.NextToken();
                break;

            case eTokenType.value_false:
                ValueLeft = false;
                _Tokenizer.NextToken();
                break;

            case eTokenType.value_string:
                ValueLeft = _Tokenizer.Value.ToString();
                _Tokenizer.NextToken();
                break;

            case eTokenType.value_number:
                decimal TmpNum;
                if (!decimal.TryParse(_Tokenizer.Value.ToString(),
                                      NumberStyles.Number, BaseUtility.DefaultCultureInfo,
                                      out TmpNum))
                {
                    ValueLeft = decimal.Zero;
                }
                else
                {
                    ValueLeft = TmpNum;
                }
                _Tokenizer.NextToken();
                break;

            case eTokenType.value_date:
                DateTime TmpDate;
                if (!DateTime.TryParse(_Tokenizer.Value.ToString(),
                                       BaseUtility.DefaultCultureInfo, DateTimeStyles.None,
                                       out TmpDate))
                {
                    ValueLeft = DateTime.Today;
                }
                else
                {
                    ValueLeft = TmpDate;
                }
                _Tokenizer.NextToken();
                break;

            case eTokenType.open_parenthesis:
                _Tokenizer.NextToken();
                ValueLeft = ParseExpr(ePriority.None);
                if (_Tokenizer.TokenType == eTokenType.close_parenthesis)
                {
                    _Tokenizer.NextToken();
                }
                else
                {
                    throw new ApplicationException("Kurung Tutup tidak ditemukan !");
                }
                break;
            }
            #endregion

            if (ValueLeft == null)
            {
                return(null);
            }

RightParse:
            #region RightParse
            eTokenType tt = _Tokenizer.TokenType;
            switch (tt)
            {
            case eTokenType.end_of_expr:
                return(ValueLeft);

            case eTokenType.value_number:
                throw new ApplicationException("Bilangan diikuti Bilangan tanpa Operator");

            case eTokenType.operator_plus:
            case eTokenType.operator_minus:
                if (ePriority < ePriority.PlusMinus)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.PlusMinus);
                    Type tp = ValueLeft.GetType();
                    if (tp == typeof(decimal))
                    {
                        Type tp2 = ValueRight.GetType();
                        if (tp2 == typeof(decimal))
                        {
                            if (tt == eTokenType.operator_plus)
                            {
                                ValueLeft = (decimal)ValueLeft + (decimal)ValueRight;
                            }
                            else
                            {
                                ValueLeft = (decimal)ValueLeft - (decimal)ValueRight;
                            }
                            goto RightParse;
                        }
                        else if (tp2 == typeof(DateTime))
                        {
                            if (tt == eTokenType.operator_plus)
                            {
                                ValueLeft = ((DateTime)ValueRight).AddDays(
                                    Convert.ToDouble(ValueLeft));
                            }
                            goto RightParse;
                        }
                        else
                        {
                            throw new ApplicationException(
                                      "Operator Tambah/ Kurang pada Data bukan Bilangan/ DateTime");
                        }
                    }
                    else if (tp == typeof(DateTime))
                    {
                        Type tp2 = ValueRight.GetType();
                        if (tp2 == typeof(decimal))
                        {
                            if (tt == eTokenType.operator_plus)
                            {
                                ValueLeft = ((DateTime)ValueLeft).AddDays(
                                    Convert.ToDouble(ValueRight));
                            }
                            else
                            {
                                ValueLeft = ((DateTime)ValueLeft).AddDays(
                                    -Convert.ToDouble(ValueRight));
                            }
                            goto RightParse;
                        }
                        else
                        {
                            throw new ApplicationException(
                                      "Operator Tambah/ Kurang pada Data bukan Bilangan/ DateTime");
                        }
                    }
                    else if (tp == typeof(string))
                    {
                        ValueLeft = ValueLeft + ValueRight.ToString();
                        goto RightParse;
                    }
                    else
                    {
                        throw new ApplicationException(
                                  "Operator Tambah/ Kurang pada Data bukan Bilangan/ DateTime");
                    }
                }
                break;

            case eTokenType.operator_mul:
            case eTokenType.operator_div:
                if (ePriority < ePriority.MulDiv)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.MulDiv);

                    if (ValueLeft.GetType() == typeof(decimal) &&
                        ValueRight.GetType() == typeof(decimal))
                    {
                        if (tt == eTokenType.operator_mul)
                        {
                            ValueLeft = (decimal)ValueLeft * (decimal)ValueRight;
                        }
                        else
                        {
                            ValueLeft = (decimal)ValueLeft / (decimal)ValueRight;
                        }
                        goto RightParse;
                    }
                    else
                    {
                        throw new ApplicationException("Operator Kali/ Bagi pada Data bukan Bilangan");
                    }
                }
                break;

            case eTokenType.operator_or:
                if (ePriority < ePriority.Or)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.Or);
                    if (ValueLeft.GetType() == typeof(bool) &&
                        ValueRight.GetType() == typeof(bool))
                    {
                        ValueLeft = (bool)ValueLeft || (bool)ValueRight;
                        goto RightParse;
                    }
                    else
                    {
                        throw new ApplicationException("Operator OR pada Data bukan Boolean");
                    }
                }
                break;

            case eTokenType.operator_and:
                if (ePriority < ePriority.And)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.And);
                    if (ValueLeft.GetType() == typeof(bool) &&
                        ValueRight.GetType() == typeof(bool))
                    {
                        ValueLeft = (bool)ValueLeft && (bool)ValueRight;
                        goto RightParse;
                    }
                    else
                    {
                        throw new ApplicationException("Operator AND pada Data bukan Boolean");
                    }
                }
                break;

            case eTokenType.operator_eq:
                if (ePriority < ePriority.Equality)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.Equality);

                    Type tp = ValueLeft.GetType();
                    if (!object.ReferenceEquals(tp, ValueRight.GetType()))
                    {
                        throw new ApplicationException("Membandingkan dua jenis data yang berbeda");
                    }
                    if (tp == typeof(decimal))
                    {
                        ValueLeft = (decimal)ValueLeft == (decimal)ValueRight;
                    }
                    else if (tp == typeof(string))
                    {
                        ValueLeft = (string)ValueLeft == (string)ValueRight;
                    }
                    else if (tp == typeof(DateTime))
                    {
                        ValueLeft = (DateTime)ValueLeft == (DateTime)ValueRight;
                    }
                    else if (tp == typeof(bool))
                    {
                        ValueLeft = (bool)ValueLeft == (bool)ValueRight;
                    }
                    goto RightParse;
                }
                break;

            case eTokenType.operator_ne:
                if (ePriority < ePriority.Equality)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.Equality);

                    Type tp = ValueLeft.GetType();
                    if (!object.ReferenceEquals(tp, ValueRight.GetType()))
                    {
                        throw new ApplicationException("Membandingkan dua jenis data yang berbeda");
                    }
                    if (tp == typeof(decimal))
                    {
                        ValueLeft = (decimal)ValueLeft != (decimal)ValueRight;
                    }
                    else if (tp == typeof(string))
                    {
                        ValueLeft = (string)ValueLeft != (string)ValueRight;
                    }
                    else if (tp == typeof(DateTime))
                    {
                        ValueLeft = (DateTime)ValueLeft != (DateTime)ValueRight;
                    }
                    else if (tp == typeof(bool))
                    {
                        ValueLeft = (bool)ValueLeft != (bool)ValueRight;
                    }
                    goto RightParse;
                }
                break;

            case eTokenType.operator_lt:
                if (ePriority < ePriority.Equality)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.Equality);

                    Type tp = ValueLeft.GetType();
                    if (!object.ReferenceEquals(tp, ValueRight.GetType()))
                    {
                        throw new ApplicationException("Membandingkan dua jenis data yang berbeda");
                    }
                    if (tp == typeof(decimal))
                    {
                        ValueLeft = (decimal)ValueLeft < (decimal)ValueRight;
                    }
                    else if (tp == typeof(string))
                    {
                        ValueLeft = string.Compare((string)ValueLeft, (string)ValueRight);
                    }
                    else if (tp == typeof(DateTime))
                    {
                        ValueLeft = (DateTime)ValueLeft < (DateTime)ValueRight;
                    }
                    else if (tp == typeof(bool))
                    {
                        ValueLeft = !(bool)ValueLeft && (bool)ValueRight;
                    }
                    goto RightParse;
                }
                break;

            case eTokenType.operator_le:
                if (ePriority < ePriority.Equality)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.Equality);

                    Type tp = ValueLeft.GetType();
                    if (!object.ReferenceEquals(tp, ValueRight.GetType()))
                    {
                        throw new ApplicationException("Membandingkan dua jenis data yang berbeda");
                    }
                    if (tp == typeof(decimal))
                    {
                        ValueLeft = (decimal)ValueLeft <= (decimal)ValueRight;
                    }
                    else if (tp == typeof(string))
                    {
                        ValueLeft = string.Compare((string)ValueLeft, (string)ValueRight);
                    }
                    else if (tp == typeof(DateTime))
                    {
                        ValueLeft = (DateTime)ValueLeft <= (DateTime)ValueRight;
                    }
                    else if (tp == typeof(bool))
                    {
                        ValueLeft = !(bool)ValueLeft && (bool)ValueRight ||
                                    (bool)ValueLeft == (bool)ValueRight;
                    }
                    goto RightParse;
                }
                break;

            case eTokenType.operator_gt:
                if (ePriority < ePriority.Equality)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.Equality);

                    Type tp = ValueLeft.GetType();
                    if (!object.ReferenceEquals(tp, ValueRight.GetType()))
                    {
                        throw new ApplicationException("Membandingkan dua jenis data yang berbeda");
                    }
                    if (tp == typeof(decimal))
                    {
                        ValueLeft = (decimal)ValueLeft > (decimal)ValueRight;
                    }
                    else if (tp == typeof(string))
                    {
                        ValueLeft = string.Compare((string)ValueLeft, (string)ValueRight);
                    }
                    else if (tp == typeof(DateTime))
                    {
                        ValueLeft = (DateTime)ValueLeft > (DateTime)ValueRight;
                    }
                    else if (tp == typeof(bool))
                    {
                        ValueLeft = (bool)ValueLeft && !(bool)ValueRight;
                    }
                    goto RightParse;
                }
                break;

            case eTokenType.operator_ge:
                if (ePriority < ePriority.Equality)
                {
                    _Tokenizer.NextToken();
                    ValueRight = ParseExpr(ePriority.Equality);

                    Type tp = ValueLeft.GetType();
                    if (!object.ReferenceEquals(tp, ValueRight.GetType()))
                    {
                        throw new ApplicationException("Membandingkan dua jenis data yang berbeda");
                    }
                    if (tp == typeof(decimal))
                    {
                        ValueLeft = (decimal)ValueLeft >= (decimal)ValueRight;
                    }
                    else if (tp == typeof(string))
                    {
                        ValueLeft = string.Compare((string)ValueLeft, (string)ValueRight);
                    }
                    else if (tp == typeof(DateTime))
                    {
                        ValueLeft = (DateTime)ValueLeft >= (DateTime)ValueRight;
                    }
                    else if (tp == typeof(bool))
                    {
                        ValueLeft = (bool)ValueLeft && !(bool)ValueRight ||
                                    (bool)ValueLeft == (bool)ValueRight;
                    }
                    goto RightParse;
                }
                break;
            }
            #endregion

            return(ValueLeft);
        }
예제 #24
0
	private void ParseNumber()
	{
		type = eTokenType.value_number;
		while (mCurChar >= '0' & mCurChar <= '9')
		{
			value.Append(mCurChar);
			NextChar();
		}
		if (mCurChar == '.')
		{
			value.Append(mCurChar);
			NextChar();
			while (mCurChar >= '0' & mCurChar <= '9')
			{
				value.Append(mCurChar);
				NextChar();
			}
		}
	}
예제 #25
0
	private void ParseIdentifier()
	{
		while ((mCurChar >= '0' & mCurChar <= '9') | (mCurChar >= 'a' & mCurChar <= 'z') | (mCurChar >= 'A' & mCurChar <= 'Z') | (mCurChar >= 'A' & mCurChar <= 'Z') | (mCurChar >= (128)) | (mCurChar == '_'))
		{
			value.Append(mCurChar);
			NextChar();
		}
		switch (value.ToString())
		{
			case "and":
				type = eTokenType.operator_and;
				break;
			case "or":
				type = eTokenType.operator_or;
				break;
			case "not":
				type = eTokenType.operator_not;
				break;
			case "true":
			case "yes":
				type = eTokenType.value_true;
				break;
			case "if":
				type = eTokenType.operator_if;
				break;
			case "false":
			case "no":
				type = eTokenType.value_false;
				break;
			default:
				type = eTokenType.value_identifier;
				break;
		}
	}
예제 #26
0
        public void NextToken()
        {
            value.Length = 0;
            type         = eTokenType.none;
            do
            {
                startpos = mPos;
                switch (mCurChar)
                {
                case default(Char):
                {
                    type = eTokenType.end_of_formula;
                    break;
                }

                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                {
                    ParseNumber();
                    break;
                }

                case '-':
                case '–':
                {
                    NextChar();
                    type = eTokenType.operator_minus;
                    break;
                }

                case '+':
                {
                    NextChar();
                    type = eTokenType.operator_plus;
                    break;
                }

                case '*':
                {
                    NextChar();
                    type = eTokenType.operator_mul;
                    break;
                }

                case '/':
                {
                    NextChar();
                    type = eTokenType.operator_div;
                    break;
                }

                case '%':
                {
                    NextChar();
                    type = eTokenType.operator_percent;
                    break;
                }

                case '(':
                {
                    NextChar();
                    type = eTokenType.open_parenthesis;
                    break;
                }

                case ')':
                {
                    NextChar();
                    type = eTokenType.close_parenthesis;
                    break;
                }

                case '<':
                {
                    NextChar();
                    if (mCurChar == '=')
                    {
                        NextChar();
                        type = eTokenType.operator_le;
                    }
                    else if (mCurChar == '>')
                    {
                        NextChar();
                        type = eTokenType.operator_ne;
                    }
                    else
                    {
                        type = eTokenType.operator_lt;
                    }
                    break;
                }

                case '>':
                {
                    NextChar();
                    if (mCurChar == '=')
                    {
                        NextChar();
                        type = eTokenType.operator_ge;
                    }
                    else
                    {
                        type = eTokenType.operator_gt;
                    }
                    break;
                }

                case ',':
                {
                    NextChar();
                    type = eTokenType.comma;
                    break;
                }

                case '=':
                {
                    NextChar();
                    type = eTokenType.operator_eq;
                    break;
                }

                case '.':
                {
                    NextChar();
                    type = eTokenType.dot;
                    break;
                }

                case '\'':
                case '"':
                {
                    ParseString(true);
                    type = eTokenType.value_string;
                    break;
                }

                case '#':
                {
                    ParseDate();
                    break;
                }

                case '&':
                {
                    NextChar();
                    type = eTokenType.operator_concat;
                    break;
                }

                case '[':
                {
                    NextChar();
                    type = eTokenType.open_bracket;
                    break;
                }

                case ']':
                {
                    NextChar();
                    type = eTokenType.close_bracket;
                    break;
                }

                //case (char)0 <= mCurChar && mCurChar <= ' ':
                //    {
                //        break;
                //    }

                default:
                {
                    ParseIdentifier();
                    break;
                }
                }

                if (type != eTokenType.none)
                {
                    break;
                }
                NextChar();
            }while (true);
        }
예제 #27
0
	public opCodeUnary(eTokenType tt, opCode param1)
	{
		mParam1 = param1;
		EvalType v1Type = mParam1.EvalType;

		switch (tt)
		{
			case eTokenType.operator_not:
				if (v1Type == EvalType.Boolean)
				{
					mValueDelegate = BOOLEAN_NOT;
					mEvalType = EvalType.Boolean;
				}

				break;
			case eTokenType.operator_minus:
				if (v1Type == EvalType.Number)
				{
					mValueDelegate = NUM_CHGSIGN;
					mEvalType = EvalType.Number;
				}

				break;
		}
	}
예제 #28
0
        public opCodeBinary(tokenizer tokenizer, opCode param1, eTokenType tt, opCode param2)
        {
            mParam1 = param1;
            mParam2 = param2;

            mParam1.ValueChanged += mParam1_ValueChanged;
            mParam2.ValueChanged += mParam2_ValueChanged;

            EvalType v1Type = mParam1.EvalType;
            EvalType v2Type = mParam2.EvalType;

            switch (tt)
            {
            case eTokenType.operator_plus:
            {
                if (v1Type == EvalType.Number & v2Type == EvalType.Number)
                {
                    mValueDelegate = NUM_PLUS_NUM;
                    mEvalType      = EvalType.Number;
                }
                else if (v1Type == EvalType.Number & v2Type == EvalType.Date)
                {
                    SwapParams(ref mParam1, ref mParam2);
                    mValueDelegate = DATE_PLUS_NUM;
                    mEvalType      = EvalType.Date;
                }
                else if (v1Type == EvalType.Date & v2Type == EvalType.Number)
                {
                    mValueDelegate = DATE_PLUS_NUM;
                    mEvalType      = EvalType.Date;
                }
                else if (mParam1.CanReturn(EvalType.String) & mParam2.CanReturn(EvalType.String))
                {
                    Convert(tokenizer, ref param1, EvalType.String);
                    mValueDelegate = STR_CONCAT_STR;
                    mEvalType      = EvalType.String;
                }

                break;
            }

            case eTokenType.operator_minus:
            {
                if (v1Type == EvalType.Number & v2Type == EvalType.Number)
                {
                    mValueDelegate = NUM_MINUS_NUM;
                    mEvalType      = EvalType.Number;
                }
                else if (v1Type == EvalType.Date & v2Type == EvalType.Number)
                {
                    mValueDelegate = DATE_MINUS_NUM;
                    mEvalType      = EvalType.Date;
                }
                else if (v1Type == EvalType.Date & v2Type == EvalType.Date)
                {
                    mValueDelegate = DATE_MINUS_DATE;
                    mEvalType      = EvalType.Number;
                }

                break;
            }

            case eTokenType.operator_mul:
            {
                if (v1Type == EvalType.Number & v2Type == EvalType.Number)
                {
                    mValueDelegate = NUM_MUL_NUM;
                    mEvalType      = EvalType.Number;
                }

                break;
            }

            case eTokenType.operator_div:
            {
                if (v1Type == EvalType.Number & v2Type == EvalType.Number)
                {
                    mValueDelegate = NUM_DIV_NUM;
                    mEvalType      = EvalType.Number;
                }

                break;
            }

            case eTokenType.operator_percent:
            {
                if (v1Type == EvalType.Number & v2Type == EvalType.Number)
                {
                    mValueDelegate = NUM_PERCENT_NUM;
                    mEvalType      = EvalType.Number;
                }

                break;
            }

            case eTokenType.operator_and:
            case eTokenType.operator_or:
            {
                Convert(tokenizer, ref mParam1, EvalType.Boolean);
                Convert(tokenizer, ref mParam2, EvalType.Boolean);
                switch (tt)
                {
                case eTokenType.operator_or:
                {
                    mValueDelegate = BOOL_OR_BOOL;
                    mEvalType      = EvalType.Boolean;
                    break;
                }

                case eTokenType.operator_and:
                {
                    mValueDelegate = BOOL_AND_BOOL;
                    mEvalType      = EvalType.Boolean;
                    break;
                }
                }

                break;
            }
            }

            if (mValueDelegate == null)
            {
                tokenizer.RaiseError("Cannot apply the operator " + tt.ToString().Replace("operator_", "") + " on " + v1Type.ToString() + " and " + v2Type.ToString());
            }
        }
예제 #29
0
 public cToken(eTokenType a_type, object a_value)
 {
     cf_Type = a_type;
     cf_Value = a_value;
 }
 public Token(eTokenType type, string value)
 {
     Type  = type;
     Value = value;
 }
예제 #31
0
파일: FSM.cs 프로젝트: letmefly/unity
 public Token(eTokenType type)
 {
     mType = type;
 }
예제 #32
0
 public TokenTypeLu(string tokenInterned, eTokenType tokenType)
 {
     TokenInterned = tokenInterned;
     TokenType     = tokenType;
 }
 public Token(eTokenType type, char value)
 {
     Type  = type;
     Value = value.ToString();
 }
예제 #34
0
 public cToken(eTokenType a_type, object a_value)
 {
     cf_Type  = a_type;
     cf_Value = a_value;
 }