public ParseTree ProgramParse(ArrayList<String> tokens)
	{
		// Create a parse tree out of the string of tokens using the grammar rules for the language
		ParseTree program = new ParseTree("");
		
		if (!tokens.isEmpty()){
			String nextToken = tokens.remove(0);
			
			if (nextToken == "PROGRAM")
			{
				program.root = nextToken;
				
				if (!tokens.isEmpty()){
				
					nextToken = tokens.remove(0);
					
					if (isValidIdentifier(nextToken))
					{
						ParseTree progName = new ParseTree(nextToken);
						program.Insert(progName);
					}
					
					else
					{
						System.out.println("Error: The program identifier is not valid.");
						System.exit(1);
						
					}
					
					while (!tokens.isEmpty() && nextToken != "END"){
						nextToken = tokens.remove(0);
						ParseTree nextChild = new ParseTree(nextToken);
						
						if (nextToken == "BEGIN"){
							// Must be the start of a new routine
						}
						else{
							// Must be an identifier, followed by a value
							if (isValidIdentifier(nextToken)){
								program.Insert(nextChild);
								
							}
						}
						
					}
				}
			}
			else{
				System.out.println("Error: PROGRAM keyword not found.");
				System.exit(1);
			}
		
		}
		else{
			// Nothing to assemble, report error
		}
		
		// Lots of stuff here
		
		// Return the parse tree
		return program;
	}