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); }