Пример #1
0
        private VariableExpr ParseVariable()
        {
            var nameToken = _tokenIt.NextToken;
            var name      = _tokenIt.ExpectId();

            return(Exprs.Ident(name, nameToken) as VariableExpr);
        }
Пример #2
0
        private Tuple <bool, Expr> IsMatch(FluentPluginHelper helper, Type type, Token klass, Token instance, Token prop, Token method)
        {
            var memberName = string.Empty;
            var rootVar    = string.Empty;
            var match      = false;
            var nameToken  = klass;

            // 1. Class property
            if (klass != null && prop != null)
            {
                rootVar = klass.Text;
                if (helper.IsClassProp(type, prop.Text))
                {
                    memberName = prop.Text;
                    match      = true;
                }
            }
            // 2. Class method
            else if (klass != null && method != null)
            {
                rootVar = type.Name;
                if (helper.IsClassMethod(type, method.Text))
                {
                    memberName = method.Text;
                    match      = true;
                }
            }
            // 3. Instance property
            else if (instance != null && prop != null)
            {
                rootVar = instance.Text;
                if (helper.IsInstanceProp(type, prop.Text))
                {
                    memberName = prop.Text;
                    match      = true;
                    nameToken  = instance;
                }
            }
            // 4. Instance method
            else if (instance != null && method != null)
            {
                rootVar = instance.Text;
                if (helper.IsInstanceMethod(type, method.Text))
                {
                    memberName = method.Text;
                    match      = true;
                    nameToken  = instance;
                }
            }
            if (!match)
            {
                return(new Tuple <bool, Expr>(false, null));
            }

            var varExp = Exprs.Ident(rootVar, null);
            var memExp = Exprs.MemberAccess(varExp, memberName, false, null);

            return(new Tuple <bool, Expr>(memberName != null, memExp));
        }
Пример #3
0
        /// <summary>
        /// Parses the fluent function call.
        /// </summary>
        /// <returns></returns>
        public override Expr Parse()
        {
            // 1. Is it a function call?
            var nameExp = Exprs.Ident(_result.Name, null);

            _tokenIt.Advance(_result.TokenCount);
            var exp = _parser.ParseFuncExpression(nameExp, null);

            return(exp);
        }
Пример #4
0
        public object ToEnumerableLoop(BindingCallExpr expr)
        {
            var token          = expr.ParamList[2] as TokenData;
            var varname        = (string)expr.ParamList[0];
            var enableWith     = (bool)expr.ParamList[1];
            var collectionName = varname + "s";
            var varExpr        = Exprs.Ident(collectionName, token);
            var loopexpr       = Exprs.ForEach(varname, varExpr, token);

            ((BlockExpr)loopexpr).EnableAutoVariable = enableWith;
            return(loopexpr);
        }
Пример #5
0
        private void AppendPathPart(List <Expr> pathExps, TokenData token, string text, bool isConstant)
        {
            if (string.IsNullOrEmpty(text))
            {
                text = token.Token.Text;
            }

            var start = isConstant ? Exprs.Const(new LString(text), _tokenIt.NextToken) as Expr
                                    : Exprs.Ident(text, _tokenIt.NextToken) as Expr;

            _parser.SetupContext(start, token);
            pathExps.Add(start);
        }
Пример #6
0
        /// <summary>
        /// Sorts expression
        /// </summary>
        /// <returns></returns>
        public override Expr Parse(object context)
        {
            var constExp = context as ConstantExpr;
            var c        = _tokenIt.NextToken;
            var t        = _tokenIt.Advance();

            _parser.SetupContext(constExp, c);

            // Get the function symbol.
            var paramListExpressions = new List <Expr>();

            paramListExpressions.Add(constExp);
            var nameExp = Exprs.Ident(t.Token.Text, t);
            var expr    = Exprs.FunctionCall(nameExp, paramListExpressions, t);

            // Move the postfix token.
            _tokenIt.Advance();
            return(expr);
        }
        /// <summary>
        /// run step 123.
        /// </summary>
        /// <returns></returns>
        public override Expr Parse()
        {
            var startToken = _tokenIt.NextToken;
            // 1. index number: it's 1 based so substract 1.
            var index     = Convert.ToDouble(_tokenIt.NextToken.Token.Text) - 1;
            var indexExpr = Exprs.Const(new LNumber(index), _tokenIt.NextToken);

            _tokenIt.Advance();

            // 2. "st" or "nd" or "rd" or "th"
            _tokenIt.Advance();

            // 3. identifier
            var ident     = _tokenIt.NextToken.Token.Text + "s";
            var identExpr = Exprs.Ident(ident, _tokenIt.NextToken);

            _tokenIt.Advance();

            return(Exprs.Index(identExpr, indexExpr, false, startToken));
        }
Пример #8
0
        /// <summary>
        /// Parse the expression.
        /// </summary>
        /// <returns></returns>
        public override Expr Parse()
        {
            var  printToken = _tokenIt.NextToken;
            var  lineToken  = _tokenIt.AdvanceAndGet <Token>();
            Expr lineExp    = null;

            if (lineToken.Kind == TokenKind.Multi)
            {
                lineExp = _parser.ParseInterpolatedExpression(lineToken);
            }
            else
            {
                lineExp = Exprs.Const(new LString((string)lineToken.Value), printToken);
            }

            var nameExp = Exprs.Ident(printToken.Token.Text, printToken);
            var exp     = (FunctionCallExpr)Exprs.FunctionCall(nameExp, null, printToken);

            exp.ParamListExpressions.Add(lineExp);

            // Move past this plugin.
            _tokenIt.Advance();
            return(exp);
        }
Пример #9
0
        /// <summary>
        /// run step 123.
        /// </summary>
        /// <returns></returns>
        public override Expr Parse()
        {
            var startToken     = _tokenIt.NextToken;
            var conditionToken = startToken;
            var assignToken    = startToken;
            var incToken       = startToken;
            var loopToken      = startToken;
            var varToken       = startToken;

            _tokenIt.ExpectIdText("repeat");
            Expr     varnameExpr = null;
            Expr     startVal    = null;
            Expr     endVal      = null;
            Expr     incVal      = null;
            Operator op          = Operator.LessThanEqual;

            // Case 1: repeat to 10
            if (_tokenIt.NextToken.Token.Text == "to")
            {
                var result = ParseTo();
                startVal = Exprs.Const(new LNumber(1.0), startToken);
                op       = result.Item1;
                endVal   = result.Item2;
                incVal   = result.Item3;
            }
            // Case 2: repeat 1 to 10
            else if (_tokenIt.NextToken.Token.Kind == TokenKind.LiteralNumber)
            {
                var num    = _tokenIt.ExpectNumber();
                var result = ParseTo();
                startVal = Exprs.Const(new LNumber(num), startToken);
                op       = result.Item1;
                endVal   = result.Item2;
                incVal   = result.Item3;
            }
            // Case 3: repeat ndx to 10
            else if (_tokenIt.NextToken.Token.Kind == TokenKind.Ident)
            {
                var variableName = _tokenIt.ExpectId();
                varnameExpr = Exprs.Ident(variableName, _tokenIt.LastToken);
                if (_tokenIt.NextToken.Token.Type == TokenTypes.Assignment)
                {
                    _tokenIt.Advance();

                    // Upto "to"
                    startVal = ParseExpr(_terminatorForTo);
                }
                else
                {
                    startVal = Exprs.Const(new LNumber(0), startToken);
                }
                var result = ParseTo();
                op     = result.Item1;
                endVal = result.Item2;
                incVal = result.Item3;
            }
            // auto-create variable name.
            if (varnameExpr == null)
            {
                varnameExpr = Exprs.Ident("it", _tokenIt.LastToken);
            }

            // Now setup the stmts
            var start     = Exprs.Assign(true, varnameExpr, startVal, varToken);
            var condition = Exprs.Compare(varnameExpr, op, endVal, varToken);
            var incExp    = Exprs.Unary(varnameExpr.ToQualifiedName(), incVal, 0, Operator.PlusEqual, incToken);
            var incStmt   = Exprs.Assign(false, varnameExpr, incExp, assignToken);
            var loopStmt  = Exprs.For(start, condition, incStmt, loopToken);

            ParseBlock(loopStmt as BlockExpr);
            return(loopStmt);
        }
Пример #10
0
        /// <summary>
        /// run step 123.
        /// </summary>
        /// <returns></returns>
        public override Expr Parse()
        {
            _tokenIt.Expect(Tokens.Run);

            // 1. Expect run ( function | step  )
            if (_tokenIt.NextToken.Token == Tokens.Function || _tokenIt.NextToken.Token.Text == "step")
            {
                _tokenIt.Advance();
            }

            // 2. Expect identifier for function name
            if (!(_tokenIt.NextToken.Token.IsLiteralAny() || _tokenIt.NextToken.Token.Kind == TokenKind.Ident))
            {
                _tokenIt.BuildSyntaxExpectedException("identifier or string");
            }

            // 3. get the name of the function to run.
            var name      = _tokenIt.NextToken.Token.Text;
            var nameToken = _tokenIt.NextToken;
            var next      = _tokenIt.Peek(1, false);

            // Case 1: run step cleanup ; | newline | eof
            if (Terminators.ExpFlexibleEnd.ContainsKey(next.Token) || next.Token == Tokens.EndToken)
            {
                var nameExp = Exprs.Ident(name, nameToken);
                var funcExp = Exprs.FunctionCall(nameExp, null, nameToken);

                // Move past token
                _tokenIt.Advance();
                return(funcExp);
            }

            // Case 2: run step cleanup on <functioncall>
            if (next.Token.Text == "on" || next.Token.Text == "after")
            {
                _tokenIt.Advance(1);
                var runExp  = ParseRunExpr(nameToken);
                var nameExp = Exprs.Ident(name, nameToken);
                var funcExp = Exprs.FunctionCall(nameExp, null, nameToken);
                runExp.FuncCallOnAfterExpr = funcExp;
                runExp.Mode = next.Token.Text;
                return(runExp);
            }

            // Case 3: run step cleanup('c:\tempdir') on <functioncall>
            if (next.Token == Tokens.LeftParenthesis || next.Token == Tokens.Dot)
            {
                var funcExp = _parser.ParseIdExpression(name, null, false);

                if (_tokenIt.NextToken.Token.Text == "on" || _tokenIt.NextToken.Token.Text == "after")
                {
                    var t      = _tokenIt.NextToken;
                    var runExp = ParseRunExpr(nameToken);
                    runExp.FuncCallOnAfterExpr = funcExp;
                    runExp.Mode = t.Token.Text;
                    return(runExp);
                }
                return(funcExp);
            }
            // Some other token e.g. + - < etc.
            var funcname = Exprs.Ident(name, nameToken);
            var funcExp2 = Exprs.FunctionCall(funcname, null, nameToken);

            // Move past token
            _tokenIt.Advance();
            return(funcExp2);

            //throw this.TokenIt.BuildSyntaxUnexpectedTokenException();
        }
Пример #11
0
        /// <summary>
        /// Parses the fluent function call.
        /// </summary>
        /// <returns></returns>
        public override Expr Parse()
        {
            // 1. Is it a function call?
            var fnameToken = _tokenIt.NextToken;

            _tokenIt.Advance(_result.TokenCount);

            var       remainderOfFuncName = string.Empty;
            var       parts     = new List <Expr>();
            TokenData firstPart = null;

            // NOTES:
            // Given: function "Find user by" *
            // And: called via Find use by name role
            // wildcard part 1: name
            // wildcard part 2: role
            // full wildcard: "name role"
            var partsToken = _tokenIt.NextToken;

            // 1. Capture all the remaining parts of the wild card.
            while (_tokenIt.NextToken.Token.Kind == TokenKind.Ident)
            {
                var part = _tokenIt.NextToken.Token.Text;

                // a. Store the token of the first wildcard part
                if (firstPart == null)
                {
                    firstPart = _tokenIt.NextToken;
                }

                // b. Build up the full name from all wildcards
                remainderOfFuncName += " " + part;

                // c. Create a constant expr from the wildcard
                // as it will be part of an array of strings passed to function
                var partExp = Exprs.Const(new LString(part), _tokenIt.NextToken);
                parts.Add(partExp);

                // d. Move to the next token for another possible wildcard.
                _tokenIt.Advance();

                // e. Check for end of statement.
                if (_tokenIt.IsEndOfStmtOrBlock())
                {
                    break;
                }
            }

            var exp = new FunctionCallExpr();

            exp.ParamListExpressions = new List <Expr>();
            exp.ParamList            = new List <object>();
            remainderOfFuncName      = remainderOfFuncName.Trim();
            var fullWildCard = Exprs.Const(new LString(string.Empty), fnameToken) as ConstantExpr;

            // 2. Create a constant expr representing the full wildcard
            if (!string.IsNullOrEmpty(remainderOfFuncName))
            {
                fullWildCard.Value = remainderOfFuncName;
                _parser.SetupContext(fullWildCard, firstPart);
            }

            var token = _tokenIt.NextToken.Token;

            // CASE 1: Parse parameters with parenthesis "("
            if (token == Tokens.LeftParenthesis)
            {
                _parser.ParseParameters(exp, true, false, false);
            }
            // CASE 2: Parse parameters with ":" until newline.
            else if (token == Tokens.Colon)
            {
                _tokenIt.Advance();
                _parser.ParseParameters(exp, false, false, true);
            }
            exp.NameExp = Exprs.Ident(_result.Name, fnameToken);
            // Have to restructure the arguments.
            // 1. const expr     , fullwildcard,   "name role"
            // 2. list<constexpr>, wildcard parts, ["name", "role"]
            // 3. list<expr>,      args,           "kishore", "admin"
            var args = new List <Expr>();

            args.Add(fullWildCard);
            args.Add(Exprs.Array(parts, partsToken));
            args.Add(Exprs.Array(exp.ParamListExpressions, fnameToken));

            // Finally reset the parameters expr on the function call.
            exp.ParamListExpressions = args;
            return(exp);
        }