Esempio n. 1
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);
        }
Esempio n. 2
0
        public override Verb CreateVerb(string[] tokens)
        {
            Color(position, length, Structures);
            var index = NextPosition;
            var stack = new Stack <Parameters>();

            stack.Push(firstParameters);
            while (index < source.Length)
            {
                if (parametersParser.Parse(source, index).If(out var parameters, out var i))
                {
                    index = i;
                    stack.Push(parameters);
                    if (freeParser.Scan(source, index, pattern))
                    {
                        index = freeParser.Position;
                        freeParser.ColorAll(Structures);
                        continue;
                    }

                    break;
                }
            }

            if (index < source.Length && functionBodyParser.Parse(source, index).If(out var block, out var j))
            {
                var anyLambda = none <Lambda>();
                while (stack.Count > 0)
                {
                    var parameters = stack.Pop();
                    anyLambda = anyLambda.Map(l => getLambda(parameters, l)).DefaultTo(() => new Lambda(new Region(), block, parameters, false)).Some();
                }

                if (anyLambda.If(out var lambda))
                {
                    overridePosition = j;
                    return(new CreateFunction(functionName, lambda, false, visibility, overriding, null)
                    {
                        Index = position
                    });
                }
            }

            return(null);
        }
Esempio n. 3
0
        public override Verb CreateVerb(string[] tokens)
        {
            Color(position, tokens[1].Length, KeyWords);
            Color(tokens[2].Length, Structures);
            if (functionBodyParser.Parse(source, NextPosition).If(out var block, out var index))
            {
                overridePosition = index;
                var staticBlock = new Block
                {
                    new CreateFunction("__$init", new Lambda(new Region(), block, new Parameters(), false),
                                       false, Protected, false, null)
                };
                AddStaticBlock(staticBlock);
                return(new NullOp());
            }

            return(null);
        }
Esempio n. 4
0
        public override Verb CreateVerb(string[] tokens)
        {
            Color(position, tokens[1].Length, KeyWords);
            var macroName = tokens[2];

            Color(macroName.Length, Variables);
            Color(tokens[3].Length, Structures);
            var parametersParser = new ParametersParser();

            if (parametersParser.Parse(source, NextPosition).If(out var parameters, out var index) &&
                bodyParser.Parse(source, index).If(out var block, out var newIndex))
            {
                var parameterBlock = new ParameterBlock(parameters, block, parameters.Splatting);
                overridePosition = newIndex;
                return(new CreateMacro(macroName, parameterBlock));
            }

            return(null);
        }
Esempio n. 5
0
        public override Verb CreateVerb(string[] tokens)
        {
            Color(position, tokens[1].Length, KeyWords);
            var name = tokens[2];

            Color(name.Length, Variables);
            Color(tokens[3].Length, Structures);
            var parametersParser = new ParametersParser();

            if (parametersParser.Parse(source, NextPosition).If(out var parameters, out var i) &&
                functionBodyParser.Parse(source, i).If(out var block, out var j))
            {
                overridePosition = j;
                return(new CreatePseudoRecursion(name, parameters, block)
                {
                    Index = position
                });
            }

            return(null);
        }
Esempio n. 6
0
        public override Verb CreateVerb(string[] tokens)
        {
            var whitespaces = tokens[1];

            statementIndex = position + whitespaces.Length;

            var tokens2Length  = tokens[2].Length;
            var visibilityName = tokens[2].Trim();

            visibility = ParseVisibility(visibilityName);

            var tokens3Length = tokens[3].Length;

            @override = tokens3Length > 0;

            var tokens4Length = tokens[4].Length;
            var memoize       = tokens4Length > 0;

            var tokens5Length = tokens[5].Length;
            var type          = tokens[5].Trim();

            var tokens6Length = tokens[6].Length;

            functionName = LongToMangledPrefix(type, tokens[6].Trim());

            var parameterType  = tokens[7];
            var parametersType = parameterType switch
            {
                "(" => ParametersType.Standard,
                "[" => ParametersType.Pattern,
                _ => ParametersType.Message
            };

            var xMethod = false;
            var isDef   = true;

            lockedDown = false;
            var isInit   = false;
            var isCoFunc = false;

            switch (type)
            {
            case "cofunc":
                isCoFunc = true;
                break;

            case "xfunc":
                xMethod = true;
                break;

            case "pure":
                lockedDown = true;
                break;

            case "init":
                isDef  = false;
                isInit = true;
                break;
            }

            if (lockedDown)
            {
                type.Must().Not.Equal("set").OrThrow(VerboseName, () => "Setters not allowed in views");
            }

            if (InClassDefinition)
            {
                xMethod.Must().Not.BeTrue().OrThrow(VerboseName, () => "xfunc not allowed inside class definitions");
            }
            else
            {
                visibilityName.Must().BeEmpty()
                .OrThrow(VerboseName, () => $"Visibility specifier {visibility} not allowed allowed outside of class definition");
                isDef.Must().BeTrue().OrThrow(VerboseName, () => $"{type} specifier not allowed outside of a class definition");
            }

            Color(position, whitespaces.Length, Whitespaces);
            Color(tokens2Length, KeyWords);
            Color(tokens3Length, KeyWords);
            Color(tokens4Length, KeyWords);
            Color(tokens5Length, KeyWords);
            var invokable  = parametersType == ParametersType.Standard || parametersType == ParametersType.Pattern;
            var entityType = invokable ? Invokeables : Messaging;

            Color(tokens6Length, entityType);
            Color(parameterType.Length, Structures);

            var index            = NextPosition;
            var parametersParser = new ParametersParser(parametersType);

            if (parametersParser.Parse(source, index).If(out parameters, out index))
            {
                if (source.Drop(index).Keep(1) == "(")
                {
                    var curriedFunctionParser = new CurriedFunctionParser(functionName, parameters, visibility, @override);
                    if (curriedFunctionParser.Scan(source, index))
                    {
                        overridePosition = curriedFunctionParser.Position;
                        return(curriedFunctionParser.Verb);
                    }
                }
            }
            else
            {
                var builder = new StringBuilder();
                var messageParameterParser = new MessageParameterParser();
                var variableParser         = new VariableParser();
                var parameterList          = new List <Parameter>();
                if (variableParser.Scan(source, index))
                {
                    var variable  = (Variable)variableParser.Value;
                    var parameter = new Parameter(variable.Name);
                    builder.Append(functionName);
                    builder.Append("_");
                    parameterList.Add(parameter);
                    index = variableParser.Position;
                }
                else
                {
                    return(null);
                }

                while (messageParameterParser.Scan(source, index))
                {
                    var parameter = new Parameter(messageParameterParser.ParameterName);
                    parameterList.Add(parameter);
                    builder.Append(messageParameterParser.MessageName);
                    builder.Append("_");
                    index = messageParameterParser.Result.Position;
                }

                functionName = builder.ToString();
                parameters   = new Parameters(parameterList);
            }

            parameters.Must().Not.BeNull().OrThrow(VerboseName, () => "Parameters malformed");
            var currying = parametersParser.Currying;

            functionBodyParser.ExtractCondition = parametersType == ParametersType.Pattern;
            if (functionBodyParser.Parse(source, index).If(out var block, out var i))
            {
                index = i;
                var condition = functionBodyParser.Condition;
                var where = functionBodyParser.Where;
                Verb verb;
                if (isInit)
                {
                    verb         = createInitializer(index, block);
                    result.Value = lambda;
                    singleLine   = !functionBodyParser.MultiCapable;
                    return(verb);
                }

                if (isCoFunc)
                {
                    overridePosition = index;
                    var builder = new CofunctionBuilder(functionName, parameters, block);
                    return(builder.Generate());
                }

                verb           = createFunction(index, currying, condition, memoize, lockedDown, block);
                lambda.XMethod = xMethod;
                lambda.Expand  = type == "rec";
                result.Value   = lambda;
                singleLine     = !functionBodyParser.MultiCapable;
                if (lambda.Where == null)
                {
                    lambda.Where = where;
                }

                return(verb);
            }

            return(null);
        }
Esempio n. 7
0
        public override Verb CreateVerb(string[] tokens)
        {
            var whitespaces = tokens[1];

            statementIndex = position + whitespaces.Length;

            var tokens2Length  = tokens[2].Length;
            var visibilityName = tokens[2].Trim();

            visibility = ParseVisibility(visibilityName);

            var tokens3Length = tokens[3].Length;

            _override = tokens3Length > 0;

            var tokens4Length = tokens[4].Length;
            var memoize       = tokens4Length > 0;

            var tokens5Length = tokens[5].Length;
            var type          = tokens[5].Trim();

            var tokens6Length = tokens[6].Length;

            functionName = LongToMangledPrefix(type, tokens[6].Trim());

            var parameterType  = tokens[7];
            var parametersType = ParametersType.Message;

            switch (parameterType)
            {
            case "(":
                parametersType = ParametersType.Standard;
                break;

            case "[":
                parametersType = ParametersType.Pattern;
                break;
            }

            var xMethod = false;
            var isDef   = true;

            lockedDown = false;
            var isInit   = false;
            var isCoFunc = false;

            switch (type)
            {
            case "cofunc":
                isCoFunc = true;
                break;

            case "xfunc":
                xMethod = true;
                break;

            case "pure":
                lockedDown = true;
                break;

            case "init":
                isDef  = false;
                isInit = true;
                break;
            }

            Reject(LockedDown && type == "set", VerboseName, "Setters not allowed in views");
            Reject(!InClassDefinition && visibilityName.IsNotEmpty(), VerboseName,
                   $"Visibility specifier {visibility} not allowed allowed outside of class definition");
            Reject(!InClassDefinition && !isDef, VerboseName, $"{type} specifier not allowed outside of a class definition");
            Reject(InClassDefinition && xMethod, VerboseName, "xfunc not allowed inside class definitions");
            Color(position, whitespaces.Length, Whitespaces);
            Color(tokens2Length, KeyWords);
            Color(tokens3Length, KeyWords);
            Color(tokens4Length, KeyWords);
            Color(tokens5Length, KeyWords);
            var invokable  = parametersType == ParametersType.Standard || parametersType == ParametersType.Pattern;
            var entityType = invokable ? Invokeables : Messaging;

            Color(tokens6Length, entityType);
            Color(parameterType.Length, Structures);

            var index            = NextPosition;
            var parametersParser = new ParametersParser(parametersType);

            if (parametersParser.Parse(source, index).If(out var parsed))
            {
                int newIndex;
                (parameters, newIndex) = parsed;
                index = newIndex;
                if (source.Skip(index).Take(1) == "(")
                {
                    var curriedFunctionParser = new CurriedFunctionParser(functionName, parameters, visibility, _override);
                    if (curriedFunctionParser.Scan(source, index))
                    {
                        overridePosition = curriedFunctionParser.Position;
                        return(curriedFunctionParser.Verb);
                    }
                }
            }
            else
            {
                var builder = new StringBuilder();
                var messageParameterParser = new MessageParameterParser();
                var variableParser         = new VariableParser();
                var parameterList          = new List <Parameter>();
                if (variableParser.Scan(source, index))
                {
                    var variable  = (Variable)variableParser.Value;
                    var parameter = new Parameter(variable.Name);
                    builder.Append(functionName);
                    builder.Append("_");
                    parameterList.Add(parameter);
                    index = variableParser.Position;
                }
                else
                {
                    return(null);
                }

                while (messageParameterParser.Scan(source, index))
                {
                    var parameter = new Parameter(messageParameterParser.ParameterName);
                    parameterList.Add(parameter);
                    builder.Append(messageParameterParser.MessageName);
                    builder.Append("_");
                    index = messageParameterParser.Result.Position;
                }

                functionName = builder.ToString();
                parameters   = new Parameters(parameterList);
            }

            RejectNull(parameters, VerboseName, "Parameters malformed");
            var currying = parametersParser.Currying;

            functionBodyParser.ExtractCondition = parametersType == ParametersType.Pattern;
            if (functionBodyParser.Parse(source, index).If(out var block, out var i))
            {
                index = i;
                var condition = functionBodyParser.Condition;
                var where = functionBodyParser.Where;
                Verb verb;
                if (isInit)
                {
                    verb         = createInitializer(index, block);
                    result.Value = lambda;
                    singleLine   = !functionBodyParser.MultiCapable;
                    return(verb);
                }

                if (isCoFunc)
                {
                    overridePosition = index;
                    var builder = new CofunctionBuilder(functionName, parameters, block);
                    return(builder.Generate());
                }

                verb           = createFunction(index, currying, condition, memoize, lockedDown, block);
                lambda.XMethod = xMethod;
                lambda.Expand  = type == "rec";
                result.Value   = lambda;
                singleLine     = !functionBodyParser.MultiCapable;
                if (lambda.Where == null)
                {
                    lambda.Where = where;
                }
                return(verb);
            }

            return(null);

/*         return functionBodyParser.Parse(source, index).Map((block, i) =>
 *       {
 *          index = i;
 *          var condition = functionBodyParser.Condition;
 *          var where = functionBodyParser.Where;
 *          Verb verb;
 *          if (isInit)
 *          {
 *             verb = createInitializer(index, block);
 *             result.Value = lambda;
 *             singleLine = !functionBodyParser.MultiCapable;
 *             return verb;
 *          }
 *
 *          if (isCoFunc)
 *          {
 *             overridePosition = index;
 *             var builder = new CofunctionBuilder(functionName, parameters, block);
 *             return builder.Generate();
 *          }
 *
 *          verb = createFunction(index, currying, condition, memoize, lockedDown, block);
 *          lambda.XMethod = xMethod;
 *          lambda.Expand = type == "rec";
 *          result.Value = lambda;
 *          singleLine = !functionBodyParser.MultiCapable;
 *          if (lambda.Where == null)
 *             lambda.Where = where;
 *          return verb;
 *       }, () => null);*/
        }