Program: 80304
Project: 80304
Buggy source:
private void parse(){
  for (; i < cs.length; i++) {
    char c=cs[i];
    if (c == ',') {
      checkIfNeedAddNode();
    }
 else     if (c == '\'' || c == '"') {
      clearStringBuffer();
      for (i++; i < cs.length; i++) {
        char n=cs[i];
        if (n == c)         break;
        sb.append(n);
      }
      addNode(new StringNode(clearStringBuffer()));
    }
 else     if (c == '@') {
      String name=readToDot().toUpperCase();
      if ("String_Node_Str".equals(name)) {
        addNode(new IocSelfNode());
      }
 else       if ("String_Node_Str".equals(name)) {
        addNode(new IocContextNode());
      }
 else       if ("String_Node_Str".equals(name)) {
        addNode(new IocObjectNameNode());
      }
      continue;
    }
 else     if (c == '$') {
      String name=readToDot();
      addNode(new IocObjectNode(name));
      continue;
    }
 else     if (c == '(') {
      String funcName=Strings.trim(clearStringBuffer());
      argss.push(new LinkedArray<ChainNode>(ChainNode.class,5));
      ends.push(')');
      i++;
      parse();
      ends.popLast();
      ChainNode[] args=argss.popLast().toArray();
      int pos=funcName.lastIndexOf('.');
      if (pos > 0) {
        String className=funcName.substring(0,pos);
        funcName=funcName.substring(pos + 1);
        addNode(new StaticFunctionNode(className,funcName,args));
      }
 else {
        addNode(new ObjectFunctionNode(funcName,args));
      }
      clearStringBuffer();
    }
 else     if (ends.size() > 0 && c == ends.last()) {
      checkIfNeedAddNode();
      return;
    }
 else {
      sb.append(c);
    }
  }
  checkIfNeedAddNode();
}

Fixed version (ground truth):
private void parse(){
  for (; i < cs.length; i++) {
    char c=cs[i];
    if (c == ',') {
      checkIfNeedAddNode();
    }
 else     if (null != first && c == '.') {
      String fn=clearStringBuffer();
      if (!Strings.isBlank(fn)) {
        addNode(new FieldNode(fn));
      }
    }
 else     if (c == '\'' || c == '"') {
      clearStringBuffer();
      for (i++; i < cs.length; i++) {
        char n=cs[i];
        if (n == c)         break;
        sb.append(n);
      }
      addNode(new StringNode(clearStringBuffer()));
    }
 else     if (c == '@') {
      String name=readToDot().toUpperCase();
      if ("String_Node_Str".equals(name)) {
        addNode(new IocSelfNode());
      }
 else       if ("String_Node_Str".equals(name)) {
        addNode(new IocContextNode());
      }
 else       if ("String_Node_Str".equals(name)) {
        addNode(new IocObjectNameNode());
      }
      continue;
    }
 else     if (c == '$') {
      String name=readToDot();
      addNode(new IocObjectNode(name));
      continue;
    }
 else     if (c == '(') {
      String funcName=Strings.trim(clearStringBuffer());
      argss.push(new LinkedArray<ChainNode>(ChainNode.class,5));
      ends.push(')');
      i++;
      parse();
      ends.popLast();
      ChainNode[] args=argss.popLast().toArray();
      int pos=funcName.lastIndexOf('.');
      if (pos > 0) {
        String className=funcName.substring(0,pos);
        funcName=funcName.substring(pos + 1);
        addNode(new StaticFunctionNode(className,funcName,args));
      }
 else       if (pos == 0) {
        addNode(new ObjectFunctionNode(funcName.substring(1),args));
      }
 else {
        addNode(new ObjectFunctionNode(funcName,args));
      }
      clearStringBuffer();
    }
 else     if (ends.size() > 0 && c == ends.last()) {
      checkIfNeedAddNode();
      return;
    }
 else {
      sb.append(c);
    }
  }
  checkIfNeedAddNode();
}