docs: final public AstCompositeExpression CompositeExpression() throws ParseException {
                                                                       /*@bgen(jjtree) CompositeExpression */
    AstCompositeExpression jjtn000 = new AstCompositeExpression(JJTCOMPOSITEEXPRESSION);
    boolean jjtc000 = true;
    jjtree.openNodeScope(jjtn000);
      try {
        label_1:
        while (true) {
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case LITERAL_EXPRESSION:
          case START_DYNAMIC_EXPRESSION:
          case START_DEFERRED_EXPRESSION:
            ;
            break;
          default:
            jj_la1[0] = jj_gen;
            break label_1;
          }
          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
          case START_DEFERRED_EXPRESSION:
            DeferredExpression();
            break;
          case START_DYNAMIC_EXPRESSION:
            DynamicExpression();
            break;
          case LITERAL_EXPRESSION:
            LiteralExpression();
            break;
          default:
            jj_la1[1] = jj_gen;
            jj_consume_token(-1);
            throw new ParseException();
          }
        }
        jj_consume_token(0);
                                     jjtree.closeNodeScope(jjtn000, true);
                                     jjtc000 = false;
                                     {if (true) return jjtn000;}
      } catch (Throwable jjte000) {
        if (jjtc000) {
          jjtree.clearNodeScope(jjtn000);
          jjtc000 = false;
        } else {
          jjtree.popNode();
        }
        if (jjte000 instanceof RuntimeException) {
          {if (true) throw (RuntimeException)jjte000;}
        }
        if (jjte000 instanceof ParseException) {
          {if (true) throw (ParseException)jjte000;}
        }
        {if (true) throw (Error)jjte000;}
      } finally {
        if (jjtc000) {
          jjtree.closeNodeScope(jjtn000, true);
        }
      }
      throw new Error("Missing return statement in function");
    }