docs: private AstNode memberExpr(boolean allowCallSyntax)
          throws IOException
      {
          int tt = peekToken(), lineno = ts.lineno;
          AstNode pn;
  
          if (tt != Token.NEW) {
              pn = primaryExpr();
          } else {
              consumeToken();
              int pos = ts.tokenBeg;
              NewExpression nx = new NewExpression(pos);
  
              AstNode target = memberExpr(false);
              int end = getNodeEnd(target);
              nx.setTarget(target);
  
              int lp = -1;
              if (matchToken(Token.LP, true)) {
                  lp = ts.tokenBeg;
                  List<AstNode> args = argumentList();
                  if (args != null && args.size() > ARGC_LIMIT)
                      reportError("msg.too.many.constructor.args");
                  int rp = ts.tokenBeg;
                  end = ts.tokenEnd;
                  if (args != null)
                      nx.setArguments(args);
                  nx.setParens(lp - pos, rp - pos);
              }
  
              // Experimental syntax: allow an object literal to follow a new
              // expression, which will mean a kind of anonymous class built with
              // the JavaAdapter.  the object literal will be passed as an
              // additional argument to the constructor.
              if (matchToken(Token.LC, true)) {
                  ObjectLiteral initializer = objectLiteral();
                  end = getNodeEnd(initializer);
                  nx.setInitializer(initializer);
              }
              nx.setLength(end - pos);
              pn = nx;
          }
          pn.setLineno(lineno);
          AstNode tail = memberExprTail(allowCallSyntax, pn);
          return tail;
      }