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;
    }
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;
    }
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 ; }
.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.
. 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 .