private AST functionDeclaration() { #if WRITE_DEBUG_INFO Console.WriteLine("function declaration"); #endif if (m_isInsideFunctionDefinition) { throw new Error("Trying to define a function inside a function (are you missing the END word?)", Error.ErrorType.SYNTAX, lookAhead(1).LineNr, lookAhead(1).LinePosition); } else { m_isInsideFunctionDefinition = true; } AST_FunctionDefinitionNode funcDeclarationTree = new AST_FunctionDefinitionNode(new Token(Token.TokenType.FUNC_DECLARATION, "<FUNC_DECL>", lookAhead(1).LineNr, lookAhead(1).LinePosition)); funcDeclarationTree.addChild(match(Token.TokenType.BUILT_IN_TYPE_NAME)); // child 0 (function return type) funcDeclarationTree.addChild(match(Token.TokenType.NAME)); // child 1 (function name) match(Token.TokenType.PARANTHESIS_LEFT); funcDeclarationTree.addChild(parameterList()); // child 2 (parameter list) match(Token.TokenType.PARANTHESIS_RIGHT); allowLineBreak(); funcDeclarationTree.addChild(statementList(false)); // child 3 match(Token.TokenType.BLOCK_END); m_isInsideFunctionDefinition = false; return(funcDeclarationTree); }
private AST_FunctionDefinitionNode createFunctionDefinitionNode(string returnTypeName, string functionName, AST parameterList) { AST_FunctionDefinitionNode functionNode = new AST_FunctionDefinitionNode(new Token(Token.TokenType.FUNC_DECLARATION, "<EXTERNAL_FUNC_DECLARATION>")); functionNode.addChild(new Token(Token.TokenType.BUILT_IN_TYPE_NAME, returnTypeName)); functionNode.addChild(new Token(Token.TokenType.NAME, functionName)); functionNode.addChild(parameterList); functionNode.addChild(new Token(Token.TokenType.STATEMENT_LIST, "<EMPTY_STATEMENT_LIST>")); return functionNode; }
private AST_FunctionDefinitionNode createFunctionDefinitionNode(string returnTypeName, string functionName, AST parameterList) { AST_FunctionDefinitionNode functionNode = new AST_FunctionDefinitionNode(new Token(Token.TokenType.FUNC_DECLARATION, "<EXTERNAL_FUNC_DECLARATION>")); functionNode.addChild(new Token(Token.TokenType.BUILT_IN_TYPE_NAME, returnTypeName)); functionNode.addChild(new Token(Token.TokenType.NAME, functionName)); functionNode.addChild(parameterList); functionNode.addChild(new Token(Token.TokenType.STATEMENT_LIST, "<EMPTY_STATEMENT_LIST>")); return(functionNode); }
private AST functionDeclaration() { #if WRITE_DEBUG_INFO Console.WriteLine("function declaration"); #endif if (m_isInsideFunctionDefinition) { throw new Error("Trying to define a function inside a function (are you missing the END word?)", Error.ErrorType.SYNTAX, lookAhead(1).LineNr, lookAhead(1).LinePosition); } else { m_isInsideFunctionDefinition = true; } AST_FunctionDefinitionNode funcDeclarationTree = new AST_FunctionDefinitionNode(new Token(Token.TokenType.FUNC_DECLARATION, "<FUNC_DECL>", lookAhead(1).LineNr, lookAhead(1).LinePosition)); funcDeclarationTree.addChild(match(Token.TokenType.BUILT_IN_TYPE_NAME)); // child 0 (function return type) funcDeclarationTree.addChild(match(Token.TokenType.NAME)); // child 1 (function name) match(Token.TokenType.PARANTHESIS_LEFT); funcDeclarationTree.addChild(parameterList()); // child 2 (parameter list) match(Token.TokenType.PARANTHESIS_RIGHT); allowLineBreak(); funcDeclarationTree.addChild(statementList(false)); // child 3 match(Token.TokenType.BLOCK_END); m_isInsideFunctionDefinition = false; return funcDeclarationTree; }