示例#1
0
        public FunctionDeclarationNode IsFunctionDeclaration(GeneralDeclarationNode generalDecla)
        {
            StackContext.Context.CanDeclareReturn = true;

            var position = new Token {
                Row = _parser.CurrentToken.Row, Column = _parser.CurrentToken.Column
            };

            var functionNode = new FunctionDeclarationNode {
                Identifier = generalDecla, Position = position
            };

            if (!_parser.Utilities.CompareTokenType(TokenType.OpenParenthesis))
            {
                throw new Exception("Open parenthesis expected at row: " + _parser.CurrentToken.Row + " , column: " + _parser.CurrentToken.Column);
            }

            _parser.Utilities.NextToken();

            List <GeneralDeclarationNode> parameters = new List <GeneralDeclarationNode>();

            ParameterList(parameters);

            functionNode.Parameters = parameters;

            if (!_parser.Utilities.CompareTokenType(TokenType.CloseParenthesis))
            {
                throw new Exception("Close parenthesis expected at row: " + _parser.CurrentToken.Row + " , column: " + _parser.CurrentToken.Column);
            }

            _parser.Utilities.NextToken();

            if (_parser.Utilities.CompareTokenType(TokenType.OpenCurlyBracket))
            {
                _parser.Utilities.NextToken();

                var sentences = _parser.ListOfSpecialSentences();
                functionNode.Sentences = sentences;
            }

            if (_parser.Utilities.CompareTokenType(TokenType.CloseCurlyBracket))
            {
                _parser.Utilities.NextToken();
            }
            else
            {
                throw new Exception("Close function body symbol expected at row: " + _parser.CurrentToken.Row + " , column: " + _parser.CurrentToken.Column);
            }

            functionNode.Position = _parser.CurrentToken;

            StackContext.Context.CanDeclareReturn = false;

            return(functionNode);
        }