code: function expression(rbp, initial) {
          var left, isArray = false, isObject = false;
  
          if (nexttoken.id === '(end)')
              error("Unexpected early end of program.", token);
  
          advance();
          if (initial) {
              anonname = 'anonymous';
              funct['(verb)'] = token.value;
          }
          if (initial === true && token.fud) {
              left = token.fud();
          } else {
              if (token.nud) {
                  left = token.nud();
              } else {
                  if (nexttoken.type === '(number)' && token.id === '.') {
                      warning("A leading decimal point can be confused with a dot: '.{a}'.",
                              token, nexttoken.value);
                      advance();
                      return token;
                  } else {
                      error("Expected an identifier and instead saw '{a}'.",
                              token, token.id);
                  }
              }
              while (rbp < nexttoken.lbp) {
                  isArray = token.value === 'Array';
                  isObject = token.value === 'Object';
                  advance();
                  if (isArray && token.id === '(' && nexttoken.id === ')')
                      warning("Use the array literal notation [].", token);
                  if (isObject && token.id === '(' && nexttoken.id === ')')
                      warning("Use the object literal notation {}.", token);
                  if (token.led) {
                      left = token.led(left);
                  } else {
                      error("Expected an operator and instead saw '{a}'.",
                          token, token.id);
                  }
              }
          }
          return left;
      }
docs: .nud     Null denotation .fud     First null denotation .led     Left denotation lbp     Left binding power rbp     Right binding power They are elements of the parsing method called Top Down Operator Precedence.