コード例 #1
0
        public override Verb CreateVerb(string[] tokens)
        {
            var invokableName = tokens[2];

            Color(position, tokens[1].Length, Whitespaces);
            Color(invokableName.Length, Invokeables);
            Color(tokens[3].Length, Structures);
            Color(tokens[4].Length, Whitespaces);

            AdvanceTabs();
            var index     = NextPosition;
            var arguments = new Arguments();

            while (index < source.Length)
            {
                if (parser.Scan(source, index))
                {
                    index = parser.Position;
                    var expression = (Block)parser.Value;
                    arguments.AddBlockArgument(expression);
                }
                else
                {
                    break;
                }
            }

            RegressTabs();
            return(new FunctionInvoke(invokableName, arguments));
        }
コード例 #2
0
        public override Verb CreateVerb(string[] tokens)
        {
            var hasPoint = tokens[1].Trim().IsNotEmpty();
            var message  = tokens[2];

            Color(position, tokens[1].Length, Structures);
            Color(message.Length, Messaging);
            Color(1, Structures);

            return(GetExpression(source, NextPosition, CloseBracket(), true).Map((argumentExp, i) =>
            {
                var index = i;
                var fieldName = "";
                if (freeParser.Scan(source, index, $"^ {REGEX_ASSIGN}"))
                {
                    index = freeParser.Position;
                    freeParser.Colorize(Whitespaces, Structures, Structures);
                    var op = freeParser.Tokens[2];
                    return GetExpression(source, index, EndOfLine()).Map((expression, j) =>
                    {
                        overridePosition = j;
                        if (!hasPoint)
                        {
                            fieldName = message;
                            message = "item";
                        }
                        if (op.IsNotEmpty())
                        {
                            var combined = CombineOperation(message, op, argumentExp, expression);
                            if (combined.IsNone)
                            {
                                return null;
                            }
                            expression = combined.Value;
                        }
                        var arguments = new Arguments();
                        arguments.AddBlockArgument(argumentExp);
                        arguments.AddBlockArgument(expression);
                        return hasPoint ? new SendMessage(SetterName(message), arguments) :
                        new SendMessageToField(fieldName, SetterName(message), arguments);
                    }, () => null);
                }
                overridePosition = index;
                return new SendMessage(GetterName(message), new Arguments(argumentExp));
            }, () => null));
        }