I can add a mechanism to process statements in your parser by implementing the model of recursive descent. The function() will expect a define token, an identifier, a left paren, a list of 0 or more variable declarations, a right paren, an endOfLine, constants and variables, an indent, statements, and a dedent. It will return a FunctionNode or null. The parameterDeclarations() function will process the parameters and return a collection of VariableNode. The constant parsing logic will determine negative and integer or float (based on number) and account for char, string, and boolean by looking for relevant tokens. The function() will expect an indent, call expression() until it returns null, print the resultant expressions, and expect dedent. The parse() function will call function() in its loop, add every FunctionNode returned to the ProgramNode, and end the loop on null. parse() will return the ProgramNode. Finally, in main, parse() will return the ProgramNode, and you can print every FunctionNode to get a full view of the parse tree so far. I am confident that I can deliver a high-quality solution that meets your needs and exceeds your expectations.