Program: 12203
Project: 12203
Buggy source:
/** 
 * Given the id already read, this routine parses an <attr_value_make>. It builds and returns an action list for these RHS make's.  It returns null if any error occurred. <pre>  {@code <attr_value_make> ::= ^ <rhs_value> <value_make>+ <value_make> ::= <rhs_value> <preferences>}</pre> <p>parser.cpp::parse_attr_value_make
 * @param id
 * @return make action
 * @throws IOException
 * @throws ParserException
 */
Action parse_attr_value_make(SymbolImpl id) throws IOException, ParserException {
  RhsValue value;
  Action new_actions, last;
  expect(LexemeType.UP_ARROW,"String_Node_Str");
  RhsValue attr=parse_rhs_value();
  if (attr == null) {
    return null;
  }
  String szAttribute=String.format("String_Node_Str",attr);
  Action all_actions=null;
  while (currentType() == LexemeType.PERIOD) {
    lexer.getNextLexeme();
    char first_letter=attr.getFirstLetter();
    String namebuf="String_Node_Str" + first_letter + '*'+ placeholder_counter[first_letter - 'a']++;
    Variable new_var=syms.make_variable(namebuf);
    new_var.current_binding_value=null;
    if (!"String_Node_Str".equals(szAttribute)) {
      new_actions=parse_preferences_soar8_non_operator(id,attr,new_var.toRhsValue());
    }
 else {
      new_actions=parse_preferences(id,attr,new_var.toRhsValue());
    }
    for (last=new_actions; last.next != null; last=last.next) {
    }
    last.next=all_actions;
    all_actions=new_actions;
    id=new_var;
    attr=parse_rhs_value();
    if (attr == null) {
      return null;
    }
    szAttribute=String.format("String_Node_Str",attr);
  }
  do {
    value=parse_rhs_value();
    if (!"String_Node_Str".equals(szAttribute)) {
      new_actions=parse_preferences_soar8_non_operator(id,attr,value);
    }
 else {
      new_actions=parse_preferences(id,attr,value);
    }
    for (last=new_actions; last.next != null; last=last.next) {
    }
    last.next=all_actions;
    all_actions=new_actions;
  }
 while ((currentType() != LexemeType.R_PAREN) && (currentType() != LexemeType.UP_ARROW));
  return all_actions;
}

Fixed version (ground truth):
/** 
 * Given the id already read, this routine parses an <attr_value_make>. It builds and returns an action list for these RHS make's.  It returns null if any error occurred. <pre>  {@code <attr_value_make> ::= ^ <rhs_value> <value_make>+ <value_make> ::= <rhs_value> <preferences>}</pre> <p>parser.cpp::parse_attr_value_make
 * @param id
 * @return make action
 * @throws IOException
 * @throws ParserException
 */
Action parse_attr_value_make(SymbolImpl id) throws IOException, ParserException {
  RhsValue value;
  Action new_actions, last;
  expect(LexemeType.UP_ARROW,"String_Node_Str");
  RhsValue attr=parse_rhs_value();
  if (attr == null) {
    return null;
  }
  String szAttribute=String.format("String_Node_Str",attr);
  Action all_actions=null;
  while (currentType() == LexemeType.PERIOD) {
    lexer.getNextLexeme();
    char first_letter=Character.toLowerCase(attr.getFirstLetter());
    String namebuf="String_Node_Str" + first_letter + '*'+ placeholder_counter[first_letter - 'a']++;
    Variable new_var=syms.make_variable(namebuf);
    new_var.current_binding_value=null;
    if (!"String_Node_Str".equals(szAttribute)) {
      new_actions=parse_preferences_soar8_non_operator(id,attr,new_var.toRhsValue());
    }
 else {
      new_actions=parse_preferences(id,attr,new_var.toRhsValue());
    }
    for (last=new_actions; last.next != null; last=last.next) {
    }
    last.next=all_actions;
    all_actions=new_actions;
    id=new_var;
    attr=parse_rhs_value();
    if (attr == null) {
      return null;
    }
    szAttribute=String.format("String_Node_Str",attr);
  }
  do {
    value=parse_rhs_value();
    if (!"String_Node_Str".equals(szAttribute)) {
      new_actions=parse_preferences_soar8_non_operator(id,attr,value);
    }
 else {
      new_actions=parse_preferences(id,attr,value);
    }
    for (last=new_actions; last.next != null; last=last.next) {
    }
    last.next=all_actions;
    all_actions=new_actions;
  }
 while ((currentType() != LexemeType.R_PAREN) && (currentType() != LexemeType.UP_ARROW));
  return all_actions;
}