src/main/java/ognl/OgnlParser.java
final public void shiftExpression() throws ParseException {
    additiveExpression();
    label_9:
    while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case 29:
      case 30:
      case 31:
      case 32:
      case 33:
      case 34:
        ;
        break;
      default:
        jj_la1[23] = jj_gen;
        break label_9;
      }
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case 29:
      case 30:
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case 29:
          jj_consume_token(29);
          break;
        case 30:
          jj_consume_token(30);
          break;
        default:
          jj_la1[24] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
                         ASTShiftLeft jjtn001 = new ASTShiftLeft(JJTSHIFTLEFT);
                         boolean jjtc001 = true;
                         jjtree.openNodeScope(jjtn001);
        try {
          additiveExpression();
        } catch (Throwable jjte001) {
                         if (jjtc001) {
                           jjtree.clearNodeScope(jjtn001);
                           jjtc001 = false;
                         } else {
                           jjtree.popNode();
                         }
                         if (jjte001 instanceof RuntimeException) {
                           {if (true) throw (RuntimeException)jjte001;}
                         }
                         if (jjte001 instanceof ParseException) {
                           {if (true) throw (ParseException)jjte001;}
                         }
                         {if (true) throw (Error)jjte001;}
        } finally {
                         if (jjtc001) {
                           jjtree.closeNodeScope(jjtn001,  2);
                         }
        }
        break;
      case 31:
      case 32:
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case 31:
          jj_consume_token(31);
          break;
        case 32:
          jj_consume_token(32);
          break;
        default:
          jj_la1[25] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
                         ASTShiftRight jjtn002 = new ASTShiftRight(JJTSHIFTRIGHT);
                         boolean jjtc002 = true;
                         jjtree.openNodeScope(jjtn002);
        try {
          additiveExpression();
        } catch (Throwable jjte002) {
                         if (jjtc002) {
                           jjtree.clearNodeScope(jjtn002);
                           jjtc002 = false;
                         } else {
                           jjtree.popNode();
                         }
                         if (jjte002 instanceof RuntimeException) {
                           {if (true) throw (RuntimeException)jjte002;}
                         }
                         if (jjte002 instanceof ParseException) {
                           {if (true) throw (ParseException)jjte002;}
                         }
                         {if (true) throw (Error)jjte002;}
        } finally {
                         if (jjtc002) {
                           jjtree.closeNodeScope(jjtn002,  2);
                         }
        }
        break;
      case 33:
      case 34:
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case 33:
          jj_consume_token(33);
          break;
        case 34:
          jj_consume_token(34);
          break;
        default:
          jj_la1[26] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
                           ASTUnsignedShiftRight jjtn003 = new ASTUnsignedShiftRight(JJTUNSIGNEDSHIFTRIGHT);
                           boolean jjtc003 = true;
                           jjtree.openNodeScope(jjtn003);
        try {
          additiveExpression();
        } catch (Throwable jjte003) {
                           if (jjtc003) {
                             jjtree.clearNodeScope(jjtn003);
                             jjtc003 = false;
                           } else {
                             jjtree.popNode();
                           }
                           if (jjte003 instanceof RuntimeException) {
                             {if (true) throw (RuntimeException)jjte003;}
                           }
                           if (jjte003 instanceof ParseException) {
                             {if (true) throw (ParseException)jjte003;}
                           }
                           {if (true) throw (Error)jjte003;}
        } finally {
                           if (jjtc003) {
                             jjtree.closeNodeScope(jjtn003,  2);
                           }
        }
        break;
      default:
        jj_la1[27] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    }
  }
final public void shiftExpression() throws ParseException {
    additiveExpression();
    label_9:
    while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case 29:
      case 30:
      case 31:
      case 32:
      case 33:
      case 34:
        ;
        break;
      default:
        jj_la1[23] = jj_gen;
        break label_9;
      }
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case 29:
      case 30:
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case 29:
          jj_consume_token(29);
          break;
        case 30:
          jj_consume_token(30);
          break;
        default:
          jj_la1[24] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
                         ASTShiftLeft jjtn001 = new ASTShiftLeft(JJTSHIFTLEFT);
                         boolean jjtc001 = true;
                         jjtree.openNodeScope(jjtn001);
        try {
          additiveExpression();
        } catch (Throwable jjte001) {
                         if (jjtc001) {
                           jjtree.clearNodeScope(jjtn001);
                           jjtc001 = false;
                         } else {
                           jjtree.popNode();
                         }
                         if (jjte001 instanceof RuntimeException) {
                           {if (true) throw (RuntimeException)jjte001;}
                         }
                         if (jjte001 instanceof ParseException) {
                           {if (true) throw (ParseException)jjte001;}
                         }
                         {if (true) throw (Error)jjte001;}
        } finally {
                         if (jjtc001) {
                           jjtree.closeNodeScope(jjtn001,  2);
                         }
        }
        break;
      case 31:
      case 32:
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case 31:
          jj_consume_token(31);
          break;
        case 32:
          jj_consume_token(32);
          break;
        default:
          jj_la1[25] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
                         ASTShiftRight jjtn002 = new ASTShiftRight(JJTSHIFTRIGHT);
                         boolean jjtc002 = true;
                         jjtree.openNodeScope(jjtn002);
        try {
          additiveExpression();
        } catch (Throwable jjte002) {
                         if (jjtc002) {
                           jjtree.clearNodeScope(jjtn002);
                           jjtc002 = false;
                         } else {
                           jjtree.popNode();
                         }
                         if (jjte002 instanceof RuntimeException) {
                           {if (true) throw (RuntimeException)jjte002;}
                         }
                         if (jjte002 instanceof ParseException) {
                           {if (true) throw (ParseException)jjte002;}
                         }
                         {if (true) throw (Error)jjte002;}
        } finally {
                         if (jjtc002) {
                           jjtree.closeNodeScope(jjtn002,  2);
                         }
        }
        break;
      case 33:
      case 34:
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case 33:
          jj_consume_token(33);
          break;
        case 34:
          jj_consume_token(34);
          break;
        default:
          jj_la1[26] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
                           ASTUnsignedShiftRight jjtn003 = new ASTUnsignedShiftRight(JJTUNSIGNEDSHIFTRIGHT);
                           boolean jjtc003 = true;
                           jjtree.openNodeScope(jjtn003);
        try {
          additiveExpression();
        } catch (Throwable jjte003) {
                           if (jjtc003) {
                             jjtree.clearNodeScope(jjtn003);
                             jjtc003 = false;
                           } else {
                             jjtree.popNode();
                           }
                           if (jjte003 instanceof RuntimeException) {
                             {if (true) throw (RuntimeException)jjte003;}
                           }
                           if (jjte003 instanceof ParseException) {
                             {if (true) throw (ParseException)jjte003;}
                           }
                           {if (true) throw (Error)jjte003;}
        } finally {
                           if (jjtc003) {
                             jjtree.closeNodeScope(jjtn003,  2);
                           }
        }
        break;
      default:
        jj_la1[27] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    }
  }
bit shift expressions (level 4)