src/main/java/ognl/OgnlParser.java
final public void navigationChain() throws ParseException {
    primaryExpression();
    label_13:
    while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case 43:
      case 44:
      case 52:
      case DYNAMIC_SUBSCRIPT:
        ;
        break;
      default:
        jj_la1[36] = jj_gen;
        break label_13;
      }
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case 43:
        jj_consume_token(43);
          ASTChain jjtn001 = new ASTChain(JJTCHAIN);
          boolean jjtc001 = true;
          jjtree.openNodeScope(jjtn001);
        try {
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case IDENT:
            if (jj_2_1(2)) {
              methodCall();
            } else {
              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
              case IDENT:
                propertyName();
                break;
              default:
                jj_la1[37] = jj_gen;
                jj_consume_token(-1);
                throw new ParseException();
              }
            }
            break;
          case 54:
            if (jj_2_2(2)) {
              projection();
            } else {
              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
              case 54:
                selection();
                break;
              default:
                jj_la1[38] = jj_gen;
                jj_consume_token(-1);
                throw new ParseException();
              }
            }
            break;
          case 44:
            jj_consume_token(44);
            expression();
            jj_consume_token(45);
            break;
          default:
            jj_la1[39] = jj_gen;
            jj_consume_token(-1);
            throw new ParseException();
          }
        } 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 52:
      case DYNAMIC_SUBSCRIPT:
          ASTChain jjtn002 = new ASTChain(JJTCHAIN);
          boolean jjtc002 = true;
          jjtree.openNodeScope(jjtn002);
        try {
          index();
        } 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 44:
        jj_consume_token(44);
        expression();
                           ASTEval jjtn003 = new ASTEval(JJTEVAL);
                           boolean jjtc003 = true;
                           jjtree.openNodeScope(jjtn003);
        try {
          jj_consume_token(45);
        } finally {
                           if (jjtc003) {
                             jjtree.closeNodeScope(jjtn003,  2);
                           }
        }
        break;
      default:
        jj_la1[40] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    }
  }
final public void navigationChain() throws ParseException {
    primaryExpression();
    label_13:
    while (true) {
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case 43:
      case 44:
      case 52:
      case DYNAMIC_SUBSCRIPT:
        ;
        break;
      default:
        jj_la1[36] = jj_gen;
        break label_13;
      }
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case 43:
        jj_consume_token(43);
          ASTChain jjtn001 = new ASTChain(JJTCHAIN);
          boolean jjtc001 = true;
          jjtree.openNodeScope(jjtn001);
        try {
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case IDENT:
            if (jj_2_1(2)) {
              methodCall();
            } else {
              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
              case IDENT:
                propertyName();
                break;
              default:
                jj_la1[37] = jj_gen;
                jj_consume_token(-1);
                throw new ParseException();
              }
            }
            break;
          case 54:
            if (jj_2_2(2)) {
              projection();
            } else {
              switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
              case 54:
                selection();
                break;
              default:
                jj_la1[38] = jj_gen;
                jj_consume_token(-1);
                throw new ParseException();
              }
            }
            break;
          case 44:
            jj_consume_token(44);
            expression();
            jj_consume_token(45);
            break;
          default:
            jj_la1[39] = jj_gen;
            jj_consume_token(-1);
            throw new ParseException();
          }
        } 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 52:
      case DYNAMIC_SUBSCRIPT:
          ASTChain jjtn002 = new ASTChain(JJTCHAIN);
          boolean jjtc002 = true;
          jjtree.openNodeScope(jjtn002);
        try {
          index();
        } 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 44:
        jj_consume_token(44);
        expression();
                           ASTEval jjtn003 = new ASTEval(JJTEVAL);
                           boolean jjtc003 = true;
                           jjtree.openNodeScope(jjtn003);
        try {
          jj_consume_token(45);
        } finally {
                           if (jjtc003) {
                             jjtree.closeNodeScope(jjtn003,  2);
                           }
        }
        break;
      default:
        jj_la1[40] = jj_gen;
        jj_consume_token(-1);
        throw new ParseException();
      }
    }
  }
final public void navigationChain ( ) throws ParseException { primaryExpression ( ) ; label_13 : while ( true ) { switch ( ( jj_ntk == - 1 ) ? jj_ntk ( ) : jj_ntk ) { case 43 : case 44 : case 52 : case DYNAMIC_SUBSCRIPT : ; break ; default : jj_la1 [ 36 ] = jj_gen ; break label_13 ; } switch ( ( jj_ntk == - 1 ) ? jj_ntk ( ) : jj_ntk ) { case 43 : jj_consume_token ( 43 ) ; ASTChain jjtn001 = new ASTChain ( JJTCHAIN ) ; boolean jjtc001 = true ; jjtree . openNodeScope ( jjtn001 ) ; try { switch ( ( jj_ntk == - 1 ) ? jj_ntk ( ) : jj_ntk ) { case IDENT : if ( jj_2_1 ( 2 ) ) { methodCall ( ) ; } else { switch ( ( jj_ntk == - 1 ) ? jj_ntk ( ) : jj_ntk ) { case IDENT : propertyName ( ) ; break ; default : jj_la1 [ 37 ] = jj_gen ; jj_consume_token ( - 1 ) ; throw new ParseException ( ) ; } } break ; case 54 : if ( jj_2_2 ( 2 ) ) { projection ( ) ; } else { switch ( ( jj_ntk == - 1 ) ? jj_ntk ( ) : jj_ntk ) { case 54 : selection ( ) ; break ; default : jj_la1 [ 38 ] = jj_gen ; jj_consume_token ( - 1 ) ; throw new ParseException ( ) ; } } break ; case 44 : jj_consume_token ( 44 ) ; expression ( ) ; jj_consume_token ( 45 ) ; break ; default : jj_la1 [ 39 ] = jj_gen ; jj_consume_token ( - 1 ) ; throw new ParseException ( ) ; } } 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 52 : case DYNAMIC_SUBSCRIPT : ASTChain jjtn002 = new ASTChain ( JJTCHAIN ) ; boolean jjtc002 = true ; jjtree . openNodeScope ( jjtn002 ) ; try { index ( ) ; } 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 44 : jj_consume_token ( 44 ) ; expression ( ) ; ASTEval jjtn003 = new ASTEval ( JJTEVAL ) ; boolean jjtc003 = true ; jjtree . openNodeScope ( jjtn003 ) ; try { jj_consume_token ( 45 ) ; } finally { if ( jjtc003 ) { jjtree . closeNodeScope ( jjtn003 , 2 ) ; } } break ; default : jj_la1 [ 40 ] = jj_gen ; jj_consume_token ( - 1 ) ; throw new ParseException ( ) ; } } }
navigation chain: property references, method calls, projections, selections, etc.
navigation chain : property references method calls projections selections etc .