Program: 147231
Project: 147231
Buggy source:
private void lexTagBody(String string,List<Token> tokens){
  while (pos < string.length()) {
    Matcher matcher=closeTagRe.matcher(string.substring(pos));
    if (matcher.find()) {
      pos+=matcher.group(0).length();
      mode=LexerMode.IN_RAW;
      return;
    }
 else {
switch (string.charAt(pos)) {
case '\n':
        ++lineNumber;
      ++pos;
    break;
case ' ':
case '\t':
  ++pos;
break;
case '+':
tokens.add(this.createToken(TokenType.PLUS));
++pos;
break;
case '<':
if (pos + 1 < string.length()) {
if (string.charAt(pos + 1) == '=') {
tokens.add(this.createToken(TokenType.LE));
pos+=2;
}
 else {
tokens.add(this.createToken(TokenType.LT));
pos++;
}
}
 else {
tokens.add(this.createToken(TokenType.LT));
++pos;
}
break;
case '>':
if (pos + 1 < string.length()) {
if (string.charAt(pos + 1) == '=') {
tokens.add(this.createToken(TokenType.GE));
pos+=2;
}
 else {
tokens.add(this.createToken(TokenType.GT));
pos++;
}
}
 else {
tokens.add(this.createToken(TokenType.GT));
++pos;
}
break;
case '_':
tokens.add(this.createToken(TokenType.CONCAT));
++pos;
break;
case '%':
tokens.add(this.createToken(TokenType.MODULO));
++pos;
break;
case '*':
tokens.add(this.createToken(TokenType.MUL));
++pos;
break;
case '-':
tokens.add(this.createToken(TokenType.MINUS));
++pos;
break;
case '/':
tokens.add(this.createToken(TokenType.DIVIDE));
++pos;
break;
case '!':
if (pos + 1 < string.length()) {
if (string.charAt(pos + 1) == '=') {
tokens.add(this.createToken(TokenType.NE));
++pos;
++pos;
}
 else {
tokens.add(this.createToken(TokenType.NOT));
++pos;
}
}
 else {
tokens.add(this.createToken(TokenType.NOT));
++pos;
}
break;
case '|':
if (pos + 1 < string.length()) {
if (string.charAt(pos + 1) == '|') {
tokens.add(this.createToken(TokenType.OROR));
++pos;
++pos;
}
 else {
tokens.add(this.createToken(TokenType.PIPE));
++pos;
}
}
 else {
tokens.add(this.createToken(TokenType.PIPE));
++pos;
}
break;
case '&':
if (pos + 1 < string.length()) {
if (string.charAt(pos + 1) == '&') {
tokens.add(this.createToken(TokenType.ANDAND));
++pos;
++pos;
}
 else {
throw this.createError("String_Node_Str");
}
}
 else {
throw this.createError("String_Node_Str");
}
break;
case '.':
if (pos + 1 < string.length()) {
if (string.charAt(pos + 1) == '.') {
tokens.add(this.createToken(TokenType.RANGE));
++pos;
++pos;
}
 else {
tokens.add(this.createToken(TokenType.DOT));
++pos;
}
}
 else {
tokens.add(this.createToken(TokenType.DOT));
++pos;
}
break;
case '[':
tokens.add(this.createToken(TokenType.LBRACKET));
++pos;
break;
case ']':
tokens.add(this.createToken(TokenType.RBRACKET));
++pos;
break;
case '{':
tokens.add(this.createToken(TokenType.LBRACE));
++pos;
break;
case '?':
tokens.add(this.createToken(TokenType.QUESTION));
++pos;
break;
case ':':
tokens.add(this.createToken(TokenType.KOLON));
++pos;
break;
case '}':
tokens.add(this.createToken(TokenType.RBRACE));
++pos;
break;
case '(':
tokens.add(this.createToken(TokenType.LPAREN));
++pos;
break;
case ')':
tokens.add(this.createToken(TokenType.RPAREN));
++pos;
break;
case ',':
tokens.add(this.createToken(TokenType.COMMA));
++pos;
break;
case '=':
if (pos + 1 < string.length()) {
if (source.substring(pos).startsWith("String_Node_Str")) {
tokens.add(this.createToken(TokenType.EQAULS));
pos+=2;
}
 else if (source.substring(pos).startsWith("String_Node_Str")) {
tokens.add(this.createToken(TokenType.ARROW));
pos+=2;
}
 else {
tokens.add(this.createToken(TokenType.ASSIGN));
++pos;
}
}
 else {
throw this.createError("String_Node_Str");
}
break;
case '"':
tokens.add(this.lexDqString());
break;
case '\'':
tokens.add(this.lexSqString());
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
tokens.add(lexNumber(string));
break;
case '$':
++pos;
tokens.add(lexDollarVar());
break;
case '#':
{
lexLineComment();
break;
}
default :
tokens.add(lexOthers());
break;
}
}
}
}

Fixed version (ground truth):
private void lexTagBody(String string,List<Token> tokens){
  while (pos < string.length()) {
    Matcher matcher=closeTagRe.matcher(string.substring(pos));
    if (matcher.find()) {
      pos+=matcher.group(0).length();
      mode=LexerMode.IN_RAW;
      return;
    }
 else {
switch (string.charAt(pos)) {
case '\n':
        ++lineNumber;
      ++pos;
    break;
case ' ':
case '\t':
  ++pos;
break;
case '+':
tokens.add(this.createToken(TokenType.PLUS));
++pos;
break;
case '<':
if (pos + 1 < string.length()) {
if (string.charAt(pos + 1) == '=') {
tokens.add(this.createToken(TokenType.LE));
pos+=2;
}
 else {
tokens.add(this.createToken(TokenType.LT));
pos++;
}
}
 else {
tokens.add(this.createToken(TokenType.LT));
++pos;
}
break;
case '>':
if (pos + 1 < string.length()) {
if (string.charAt(pos + 1) == '=') {
tokens.add(this.createToken(TokenType.GE));
pos+=2;
}
 else {
tokens.add(this.createToken(TokenType.GT));
pos++;
}
}
 else {
tokens.add(this.createToken(TokenType.GT));
++pos;
}
break;
case '_':
tokens.add(this.createToken(TokenType.CONCAT));
++pos;
break;
case '%':
tokens.add(this.createToken(TokenType.MODULO));
++pos;
break;
case '*':
tokens.add(this.createToken(TokenType.MUL));
++pos;
break;
case '-':
tokens.add(this.createToken(TokenType.MINUS));
++pos;
break;
case '/':
tokens.add(this.createToken(TokenType.DIVIDE));
++pos;
break;
case '!':
if (pos + 1 < string.length()) {
if (string.charAt(pos + 1) == '=') {
tokens.add(this.createToken(TokenType.NE));
++pos;
++pos;
}
 else {
tokens.add(this.createToken(TokenType.NOT));
++pos;
}
}
 else {
tokens.add(this.createToken(TokenType.NOT));
++pos;
}
break;
case '|':
if (pos + 1 < string.length()) {
if (string.charAt(pos + 1) == '|') {
tokens.add(this.createToken(TokenType.OROR));
++pos;
++pos;
}
 else {
tokens.add(this.createToken(TokenType.PIPE));
++pos;
}
}
 else {
tokens.add(this.createToken(TokenType.PIPE));
++pos;
}
break;
case '&':
if (pos + 1 < string.length()) {
if (string.charAt(pos + 1) == '&') {
tokens.add(this.createToken(TokenType.ANDAND));
++pos;
++pos;
}
 else {
throw this.createError("String_Node_Str");
}
}
 else {
throw this.createError("String_Node_Str");
}
break;
case '.':
if (pos + 1 < string.length()) {
if (string.charAt(pos + 1) == '.') {
tokens.add(this.createToken(TokenType.RANGE));
++pos;
++pos;
}
 else {
tokens.add(this.createToken(TokenType.DOT));
++pos;
}
}
 else {
tokens.add(this.createToken(TokenType.DOT));
++pos;
}
break;
case '[':
tokens.add(this.createToken(TokenType.LBRACKET));
++pos;
break;
case ']':
tokens.add(this.createToken(TokenType.RBRACKET));
++pos;
break;
case '{':
tokens.add(this.createToken(TokenType.LBRACE));
++pos;
break;
case '?':
tokens.add(this.createToken(TokenType.QUESTION));
++pos;
break;
case ':':
tokens.add(this.createToken(TokenType.KOLON));
++pos;
break;
case '}':
tokens.add(this.createToken(TokenType.RBRACE));
++pos;
break;
case '(':
tokens.add(this.createToken(TokenType.LPAREN));
++pos;
break;
case ')':
tokens.add(this.createToken(TokenType.RPAREN));
++pos;
break;
case ',':
tokens.add(this.createToken(TokenType.COMMA));
++pos;
break;
case '=':
if (pos + 1 < string.length()) {
if (source.substring(pos).startsWith("String_Node_Str")) {
tokens.add(this.createToken(TokenType.EQUALS));
pos+=2;
}
 else if (source.substring(pos).startsWith("String_Node_Str")) {
tokens.add(this.createToken(TokenType.ARROW));
pos+=2;
}
 else {
tokens.add(this.createToken(TokenType.ASSIGN));
++pos;
}
}
 else {
throw this.createError("String_Node_Str");
}
break;
case '"':
tokens.add(this.lexDqString());
break;
case '\'':
tokens.add(this.lexSqString());
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
tokens.add(lexNumber(string));
break;
case '$':
++pos;
tokens.add(lexDollarVar());
break;
case '#':
{
lexLineComment();
break;
}
default :
tokens.add(lexOthers());
break;
}
}
}
}