Beispiel #1
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);
        }
Beispiel #2
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);
        }
        /// <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();
        }