Program: 83243
Project: 83243
Buggy source:
@Override public void parse(IParserManager pm,IToken token) throws SyntaxError {
switch (this.mode) {
case START:
    this.firstToken=token;
  this.pm=pm;
this.mode=PARAMETERS;
IToken next=token.next();
int nextNextType=next.next().type();
if (nextNextType == Symbols.CLOSE_PARENTHESIS || nextNextType == Symbols.COMMA) {
this.mode=PARAMETER_NAME;
return;
}
this.parser=this.tryParser=new ParameterListParser(this);
return;
case PARAMETERS:
if (token.type() == Symbols.CLOSE_PARENTHESIS && this.tryParser.isInMode(ParameterListParser.SEPERATOR)) {
this.mode=ARROW;
return;
}
try {
this.pm=pm;
this.parser.parse(this,token);
}
 catch (SyntaxError error) {
pm.jump(this.firstToken);
pm.setParser(this);
this.mode=TUPLE;
}
return;
case PARAMETER_NAME:
if (!ParserUtil.isIdentifier(token.type())) {
throw new SyntaxError(token,"String_Node_Str");
}
this.mode=SEPARATOR;
this.addParameter(new MethodParameter(token.raw(),token.nameValue()));
return;
case SEPARATOR:
int type=token.type();
if (type == Symbols.CLOSE_PARENTHESIS) {
this.mode=ARROW;
return;
}
this.mode=PARAMETER_NAME;
if (token.type() != Symbols.COMMA) {
throw new SyntaxError(token,"String_Node_Str");
}
return;
case TUPLE:
if (token.type() == Symbols.OPEN_PARENTHESIS) {
Tuple t=new Tuple(token);
this.value=t;
this.mode=TUPLE_END;
pm.pushParser(new ExpressionListParser(t));
return;
}
pm.popParser();
return;
case TUPLE_END:
pm.popParser();
if (token.type() == Symbols.CLOSE_PARENTHESIS) {
this.value.expandPosition(token);
this.consumer.setValue(this.value);
return;
}
throw new SyntaxError(token,"String_Node_Str",true);
case ARROW:
if (token.type() != Symbols.ARROW_OPERATOR) {
pm.jump(this.firstToken);
this.mode=TUPLE;
return;
}
LambdaExpression le=new LambdaExpression(token.raw(),this.params,this.parameterCount);
pm.pushParser(pm.newExpressionParser(le));
this.value=le;
this.mode=END;
return;
case END:
pm.popParser(true);
this.consumer.setValue(this.value);
return;
}
}

Fixed version (ground truth):
@Override public void parse(IParserManager pm,IToken token) throws SyntaxError {
switch (this.mode) {
case START:
    this.firstToken=token;
  this.pm=pm;
this.mode=PARAMETERS;
IToken next=token.next();
int nextNextType=next.next().type();
if (nextNextType == Symbols.CLOSE_PARENTHESIS || nextNextType == Symbols.COMMA) {
this.mode=PARAMETER_NAME;
return;
}
this.parser=this.tryParser=new ParameterListParser(this);
return;
case PARAMETERS:
if (token.type() == Symbols.CLOSE_PARENTHESIS && this.tryParser.isInMode(ParameterListParser.SEPERATOR)) {
this.mode=ARROW;
return;
}
try {
this.pm=pm;
this.parser.parse(this,token);
}
 catch (SyntaxError error) {
pm.jump(this.firstToken);
pm.setParser(this);
this.mode=TUPLE;
}
return;
case PARAMETER_NAME:
if (!ParserUtil.isIdentifier(token.type())) {
pm.jump(this.firstToken);
this.mode=TUPLE;
return;
}
this.mode=SEPARATOR;
this.addParameter(new MethodParameter(token.raw(),token.nameValue()));
return;
case SEPARATOR:
int type=token.type();
if (type == Symbols.CLOSE_PARENTHESIS) {
this.mode=ARROW;
return;
}
this.mode=PARAMETER_NAME;
if (token.type() != Symbols.COMMA) {
throw new SyntaxError(token,"String_Node_Str");
}
return;
case TUPLE:
if (token.type() == Symbols.OPEN_PARENTHESIS) {
Tuple t=new Tuple(token);
this.value=t;
this.mode=TUPLE_END;
pm.pushParser(new ExpressionListParser(t));
return;
}
pm.popParser();
return;
case TUPLE_END:
pm.popParser();
if (token.type() == Symbols.CLOSE_PARENTHESIS) {
this.value.expandPosition(token);
this.consumer.setValue(this.value);
return;
}
throw new SyntaxError(token,"String_Node_Str",true);
case ARROW:
if (token.type() != Symbols.ARROW_OPERATOR) {
pm.jump(this.firstToken);
this.mode=TUPLE;
return;
}
LambdaExpression le=new LambdaExpression(token.raw(),this.params,this.parameterCount);
pm.pushParser(pm.newExpressionParser(le));
this.value=le;
this.mode=END;
return;
case END:
pm.popParser(true);
this.consumer.setValue(this.value);
return;
}
}