Program: 180591
Project: 180591
Buggy source:
/** 
 * Parses an Epox program string as an executable <code>Node</code> tree. The given <code>source</code> parameter must contain a valid Epox program string, comprised only of nodes that have been declared. The data-types  of each function's inputs must correspond to valid data-types, otherwise  a <code>MalformedProgramException</code> will be thrown.
 * @param source the program string to be parsed as an Epox program.
 * @return a <code>Node</code> which is the root of a tree which isequivalent to the provided source string. A <code>null</code> value will be returned if the <code>source</code> parameter is <code>null</code>.
 * @throws MalformedProgramException if the given string does not representa valid Epox program.
 */
public Node parse(String source) throws MalformedProgramException {
  if (source == null) {
    return null;
  }
  int openingBracket=source.indexOf('(');
  String identifier=null;
  List<String> args=null;
  if (openingBracket == -1) {
    identifier=source;
    args=new ArrayList<String>();
  }
 else {
    identifier=source.substring(0,openingBracket).trim();
    int closingBracket=source.lastIndexOf(')');
    String argumentStr=source.substring(openingBracket + 1,closingBracket);
    args=splitArguments(argumentStr);
  }
  Node node=nodes.get(identifier).newInstance();
  if (node == null) {
    throw new MalformedProgramException("String_Node_Str" + identifier);
  }
 else   if (node.getArity() != args.size()) {
    throw new MalformedProgramException("String_Node_Str" + identifier + "String_Node_Str"+ node.getArity()+ "String_Node_Str"+ args.size()+ "String_Node_Str");
  }
 else {
    for (int i=0; i < args.size(); i++) {
      node.setChild(i,parse(args.get(i)));
    }
    if (node.dataType() == null) {
      if (node.isNonTerminal()) {
        throw new MalformedProgramException("String_Node_Str" + identifier + "String_Node_Str");
      }
 else {
        throw new MalformedProgramException("String_Node_Str" + identifier + "String_Node_Str");
      }
    }
  }
  return node;
}

Fixed version (ground truth):
/** 
 * Parses an Epox program string as an executable <code>Node</code> tree. The given <code>source</code> parameter must contain a valid Epox program string, comprised only of nodes that have been declared. The data-types  of each function's inputs must correspond to valid data-types, otherwise  a <code>MalformedProgramException</code> will be thrown.
 * @param source the program string to be parsed as an Epox program.
 * @return a <code>Node</code> which is the root of a tree which isequivalent to the provided source string. A <code>null</code> value will be returned if the <code>source</code> parameter is <code>null</code>.
 * @throws MalformedProgramException if the given string does not representa valid Epox program.
 */
public Node parse(String source) throws MalformedProgramException {
  if (source == null) {
    return null;
  }
  int openingBracket=source.indexOf('(');
  String identifier=null;
  List<String> args=null;
  if (openingBracket == -1) {
    identifier=source;
    args=new ArrayList<String>();
  }
 else {
    identifier=source.substring(0,openingBracket).trim();
    int closingBracket=source.lastIndexOf(')');
    String argumentStr=source.substring(openingBracket + 1,closingBracket);
    args=splitArguments(argumentStr);
  }
  Node node=nodes.get(identifier);
  if (node == null) {
    throw new MalformedProgramException("String_Node_Str" + identifier);
  }
 else   if (node.getArity() != args.size()) {
    throw new MalformedProgramException("String_Node_Str" + identifier + "String_Node_Str"+ node.getArity()+ "String_Node_Str"+ args.size()+ "String_Node_Str");
  }
 else {
    node=node.newInstance();
    for (int i=0; i < args.size(); i++) {
      node.setChild(i,parse(args.get(i)));
    }
    if (node.dataType() == null) {
      if (node.isNonTerminal()) {
        throw new MalformedProgramException("String_Node_Str" + identifier + "String_Node_Str");
      }
 else {
        throw new MalformedProgramException("String_Node_Str" + identifier + "String_Node_Str");
      }
    }
  }
  return node;
}