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