Exemple #1
0
 internal static bool IsBinaryOperator(UserDefinedOperator Op)
 {
     switch (Op)
     {
     case UserDefinedOperator.Plus:
     case UserDefinedOperator.Minus:
     case UserDefinedOperator.Multiply:
     case UserDefinedOperator.Divide:
     case UserDefinedOperator.Power:
     case UserDefinedOperator.IntegralDivide:
     case UserDefinedOperator.Concatenate:
     case UserDefinedOperator.ShiftLeft:
     case UserDefinedOperator.ShiftRight:
     case UserDefinedOperator.Modulus:
     case UserDefinedOperator.Or:
     case UserDefinedOperator.Xor:
     case UserDefinedOperator.And:
     case UserDefinedOperator.Like:
     case UserDefinedOperator.Equal:
     case UserDefinedOperator.NotEqual:
     case UserDefinedOperator.Less:
     case UserDefinedOperator.LessEqual:
     case UserDefinedOperator.GreaterEqual:
     case UserDefinedOperator.Greater:
         return(true);
     }
     return(false);
 }
Exemple #2
0
        public override Verb CreateVerb(string[] tokens)
        {
            var type = tokens[2];
            var name = tokens[4];

            Color(position, tokens[1].Length, Whitespaces);
            Color(type.Length, KeyWords);
            Color(tokens[3].Length, Whitespaces);
            Color(name.Length, Operators);
            Color(tokens[5].Length, Structures);

            var index            = position + length;
            var parametersParser = new ParametersParser();
            var parsed           = parametersParser.Parse(source, index);

            parsed.If(out var parameters, out index).Must().BeTrue().OrThrow("Operator parser", () => "Parameters malformed");
            if (functionBodyParser.Parse(source, index).If(out var block, out var newIndex))
            {
                overridePosition = newIndex;
                var lambda   = new Lambda(new Region(), block, parameters, false);
                var affinity = 0;
                var pre      = false;
                switch (type)
                {
                case "nofix":
                    affinity = 0;
                    break;

                case "prefix":
                    affinity = 1;
                    pre      = true;
                    break;

                case "postfix":
                    affinity = 1;
                    break;

                case "infix":
                    affinity = 2;
                    break;
                }

                var userDefinedOperator = new UserDefinedOperator(affinity, pre, lambda);
                CompilerState.RegisterOperator(name, userDefinedOperator);

                return(new NullOp());
            }

            return(null);
        }
Exemple #3
0
 internal static bool IsUnaryOperator(UserDefinedOperator Op)
 {
     switch (Op)
     {
     case UserDefinedOperator.Narrow:
     case UserDefinedOperator.Widen:
     case UserDefinedOperator.IsTrue:
     case UserDefinedOperator.IsFalse:
     case UserDefinedOperator.Negate:
     case UserDefinedOperator.Not:
     case UserDefinedOperator.UnaryPlus:
         return(true);
     }
     return(false);
 }
Exemple #4
0
        internal static UserDefinedOperator MapToUserDefinedOperator(MethodBase Method)
        {
            int index = 1;

            do
            {
                if (Method.Name.Equals(OperatorCLSNames[index]))
                {
                    int length             = Method.GetParameters().Length;
                    UserDefinedOperator op = (UserDefinedOperator)((sbyte)index);
                    if ((length == 1) && IsUnaryOperator(op))
                    {
                        return(op);
                    }
                    if ((length == 2) && IsBinaryOperator(op))
                    {
                        return(op);
                    }
                }
                index++;
            }while (index <= 0x1b);
            return(UserDefinedOperator.UNDEF);
        }
Exemple #5
0
 public void RegisterOperator(string name, UserDefinedOperator _operator) => operators[name] = _operator;
 internal static bool IsUnaryOperator(UserDefinedOperator Op)
 {
     switch (Op)
     {
         case UserDefinedOperator.Narrow:
         case UserDefinedOperator.Widen:
         case UserDefinedOperator.IsTrue:
         case UserDefinedOperator.IsFalse:
         case UserDefinedOperator.Negate:
         case UserDefinedOperator.Not:
         case UserDefinedOperator.UnaryPlus:
             return true;
     }
     return false;
 }
 internal static bool IsBinaryOperator(UserDefinedOperator Op)
 {
     switch (Op)
     {
         case UserDefinedOperator.Plus:
         case UserDefinedOperator.Minus:
         case UserDefinedOperator.Multiply:
         case UserDefinedOperator.Divide:
         case UserDefinedOperator.Power:
         case UserDefinedOperator.IntegralDivide:
         case UserDefinedOperator.Concatenate:
         case UserDefinedOperator.ShiftLeft:
         case UserDefinedOperator.ShiftRight:
         case UserDefinedOperator.Modulus:
         case UserDefinedOperator.Or:
         case UserDefinedOperator.Xor:
         case UserDefinedOperator.And:
         case UserDefinedOperator.Like:
         case UserDefinedOperator.Equal:
         case UserDefinedOperator.NotEqual:
         case UserDefinedOperator.Less:
         case UserDefinedOperator.LessEqual:
         case UserDefinedOperator.GreaterEqual:
         case UserDefinedOperator.Greater:
             return true;
     }
     return false;
 }