code: private ExprCfg parseTerm()
    {
      ExprCfg term = parseSimpleTerm();
  
      while (true) {
        ExprToken token = scanToken();
  
        switch (token) {
        /*
        case LBRACE:
        {
          ExprCfg expr = parseExpr();
          token = scanToken();
          if (token != ExprToken.RBRACE) {
            throw error(L.l("Expected ']' at {0}.  All open array braces must have matching closing brace.", token));
          }
  
          term = term.createField(expr);
          break;
        }
        */
  
        case LPAREN:
        {
          ExprCfg []args = parseArgs();
  
          ExprCfg expr = term.createMethod(args);
  
          if (expr == null)
            throw error(L.l("Method call not supported in this context `{0}'.",
                            term));
          term = expr;
  
          break;
        }
  
        case DOT:
        {
          int ch = skipWhitespace(read());
  
          if (! Character.isJavaIdentifierStart((char) ch))
            throw error(L.l("Expected `]' at {0}.  Field references must be identifiers.", badChar(ch)));
  
          String field = readName(ch);
  
          term = term.createField(field);
          break;
        }
  
        /*
        case Expr.NOT: {
          if (Expr.NOT == token && term != null && term.isConstant())
            throw new ELParseException(L.l("invalid expression `{0}'", _string));
  
          unreadToken();
          return term;
        }
        */
  
        default:
          unreadToken();
          return term;
        }
      }
    }
docs: term ::= simple-term
  ::= term '[' expr ']'
  ::= term . identifier