Exemplo n.º 1
0
        private SemanticCheckResult CheckFunctionDeclaration(SemActs semActs, FunctionDeclareExpr exp)
        {
            // 1. Number of params
            var func = exp.Function;
            var initialErrorCount = _errors.Count;

            if (func.Meta.Arguments.Count > 12)
            {
                AddErrorCode(ErrorCodes.Func1004, exp);
            }

            // 2. Too many aliases on function
            if (func.Meta.Aliases != null && func.Meta.Aliases.Count > 5)
            {
                AddError(ErrorCodes.Func1005, exp);
            }

            // 3. Parameter named arguments?
            if (func.Meta.ArgumentsLookup.ContainsKey("arguments"))
            {
                AddErrorCode(ErrorCodes.Func1003, exp);
            }

            return(initialErrorCount == _errors.Count
                       ? SemanticCheckResult.Valid
                       : SemanticCheckResult.ErrorContinue);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Parses a function declaration statement.
        /// This method is made public to allow other plugins to be used to allow different
        /// words to represent "function" e.g. "def" instead of "function"
        /// </summary>
        /// <param name="token">The tokendata representing the starting token e.g. "function".</param>
        /// <param name="expectToken">Whether or not to expect the token in tokenData.
        /// If false, advances the token iterator</param>
        /// <returns></returns>
        public Expr Parse(TokenData token, bool expectToken)
        {
            var stmt = new FunctionDeclareExpr();

            _parser.SetupContext(stmt.Function, token);

            if (expectToken)
            {
                _tokenIt.Expect(token.Token);
            }
            else
            {
                _tokenIt.Advance();
            }

            // Function name.
            var           name      = _tokenIt.ExpectId(true, true);
            var           aliases   = new List <string>();
            var           nextToken = _tokenIt.NextToken;
            List <string> argNames  = null;

            // Option 1: Wild card
            if (nextToken.Token == Tokens.Multiply)
            {
                stmt.Function.Meta.HasWildCard = true;
                nextToken = _tokenIt.Advance();
            }
            // Option 2: Aliases
            else if (nextToken.Token == Tokens.Comma)
            {
                // Collect all function aliases
                while (nextToken.Token == Tokens.Comma)
                {
                    _tokenIt.Advance();
                    var alias = _tokenIt.ExpectId(true, true);
                    aliases.Add(alias);
                    nextToken = _tokenIt.NextToken;
                }
                if (aliases.Count > 0)
                {
                    stmt.Function.Meta.Aliases = aliases;
                }
            }

            // Get the parameters.
            if (nextToken.Token == Tokens.LeftParenthesis)
            {
                _tokenIt.Expect(Tokens.LeftParenthesis);
                argNames = _parser.ParseNames();
                _tokenIt.Expect(Tokens.RightParenthesis);
            }

            stmt.Function.Meta.Init(name, argNames);

            // Now parser the function block.
            ParseBlock(stmt.Function);

            return(stmt);
        }
Exemplo n.º 3
0
 /// <summary>
 /// Visits the function call expression tree
 /// </summary>
 /// <param name="exp"></param>
 public object VisitFunctionDeclare(FunctionDeclareExpr exp)
 {
     _callBackOnNodeStart(exp);
     for (var ndx = 0; ndx < exp.Function.Statements.Count; ndx++)
     {
         var stmt = exp.Function.Statements[ndx];
         stmt.Visit(this);
     }
     _callBackOnNodeEnd(exp);
     return(null);
 }
Exemplo n.º 4
0
        /// <summary>
        /// Parses a function declaration statement.
        /// This method is made public to allow other plugins to be used to allow different 
        /// words to represent "function" e.g. "def" instead of "function"
        /// </summary>
        /// <param name="token">The tokendata representing the starting token e.g. "function".</param>
        /// <param name="expectToken">Whether or not to expect the token in tokenData. 
        /// If false, advances the token iterator</param>
        /// <returns></returns>
        public Expr Parse(TokenData token, bool expectToken)
        {
            var stmt = new FunctionDeclareExpr();
            _parser.SetupContext(stmt.Function, token);

            if (expectToken) _tokenIt.Expect(token.Token);
            else _tokenIt.Advance();

            // Function name.
            var name = _tokenIt.ExpectId(true, true);
            var aliases = new List<string>();
            var nextToken = _tokenIt.NextToken;
            List<string> argNames = null;

            // Option 1: Wild card 
            if (nextToken.Token == Tokens.Multiply)
            {
                stmt.Function.Meta.HasWildCard = true;
                nextToken = _tokenIt.Advance();
            }
            // Option 2: Aliases
            else if (nextToken.Token == Tokens.Comma)
            {
                // Collect all function aliases
                while (nextToken.Token == Tokens.Comma)
                {
                    _tokenIt.Advance();
                    var alias = _tokenIt.ExpectId(true, true);
                    aliases.Add(alias);
                    nextToken = _tokenIt.NextToken;
                }
                if (aliases.Count > 0)
                    stmt.Function.Meta.Aliases = aliases;
            }

            // Get the parameters.
            if (nextToken.Token == Tokens.LeftParenthesis)
            {
                _tokenIt.Expect(Tokens.LeftParenthesis);
                argNames = _parser.ParseNames();
                _tokenIt.Expect(Tokens.RightParenthesis);
            }

            stmt.Function.Meta.Init(name, argNames);
            
            // Now parser the function block.
            ParseBlock(stmt.Function);
            
            return stmt;
        }
Exemplo n.º 5
0
        public Expr OnParseFunctionDeclare()
        {
            var tokenIt        = this._parser.TokenIt;
            var initiatorToken = tokenIt.NextToken;
            var expr           = new FunctionDeclareExpr();
            // <codeFunctionDeclare>

            var token       = tokenIt.NextToken;
            var expectToken = true;

            expr.Function      = new FunctionExpr();
            expr.Function.Meta = new FunctionMetaData();
            _parser.SetupContext(expr.Function, token);

            if (expectToken)
            {
                tokenIt.Expect(token.Token);
            }
            else
            {
                tokenIt.Advance();
            }

            // Function name.
            var           name      = tokenIt.ExpectId(true, true);
            var           aliases   = new List <string>();
            var           nextToken = tokenIt.NextToken;
            List <string> argNames  = null;

            // Option 1: Wild card
            if (nextToken.Token == Tokens.Multiply)
            {
                expr.Function.Meta.HasWildCard = true;
                nextToken = tokenIt.Advance();
            }
            // Option 2: Aliases
            else if (nextToken.Token == Tokens.Comma)
            {
                // Collect all function aliases
                while (nextToken.Token == Tokens.Comma)
                {
                    tokenIt.Advance();
                    var alias = tokenIt.ExpectId(true, true);
                    aliases.Add(alias);
                    nextToken = tokenIt.NextToken;
                }
                if (aliases.Count > 0)
                {
                    expr.Function.Meta.Aliases = aliases;
                }
            }

            // Get the parameters.
            if (nextToken.Token == Tokens.LeftParenthesis)
            {
                tokenIt.Expect(Tokens.LeftParenthesis);
                argNames = _parser.ParseNames();
                tokenIt.Expect(Tokens.RightParenthesis);
            }
            expr.Function.Meta.Init(name, argNames);

            // Now parser the function block.
            OnParseFunctionDeclareBlock(expr.Function);

            // </codeFunctionDeclare>
            this._parser.SetupContext(expr, initiatorToken);
            return(expr);
        }
Exemplo n.º 6
0
 /// <summary>
 /// Visits the function call expression tree
 /// </summary>
 /// <param name="exp"></param>
 public object VisitFunctionDeclare(FunctionDeclareExpr exp)
 {
     _callBackOnNodeStart(exp);
     for(var ndx = 0; ndx < exp.Function.Statements.Count; ndx++)
     {
         var stmt = exp.Function.Statements[ndx];
         stmt.Visit(this);
     }
     _callBackOnNodeEnd(exp);
     return null;
 }
Exemplo n.º 7
0
        private SemanticCheckResult CheckFunctionDeclaration(SemActs semActs, FunctionDeclareExpr exp)
        {
            // 1. Number of params
            var func = exp.Function;
            var initialErrorCount = _errors.Count;

            if (func.Meta.Arguments.Count > 12)
                AddErrorCode(ErrorCodes.Func1004, exp);

            // 2. Too many aliases on function
            if (func.Meta.Aliases != null && func.Meta.Aliases.Count > 5)
                AddError(ErrorCodes.Func1005, exp);

            // 3. Parameter named arguments?
            if (func.Meta.ArgumentsLookup.ContainsKey("arguments"))
                AddErrorCode(ErrorCodes.Func1003, exp);

            return initialErrorCount == _errors.Count
                       ? SemanticCheckResult.Valid
                       : SemanticCheckResult.ErrorContinue;
        }
Exemplo n.º 8
0
 /// <summary>
 /// Execute the continue.
 /// </summary>
 public object VisitFunctionDeclare(FunctionDeclareExpr expr)
 {
     return(LObjects.Null);
 }