etc/EJS/ejs_fulljslint.js
function parse(rbp, initial) {
        var left;
        var o;
        if (nexttoken.id === '(end)') {
            error("Unexpected early end of program.", token);
        }
        advance();
        if (option.adsafe && token.value === 'ADSAFE') {
            if (nexttoken.id !== '.' || !(peek(0).identifier) ||
                    peek(1).id !== '(') {
                warning('ADsafe violation.', token);
            }
        }
        if (initial) {
            anonname = 'anonymous';
            funct['(verb)'] = token.value;
        }
        if (initial && token.fud) {
            left = token.fud();
        } else {
            if (token.nud) {
                o = token.exps;
                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) {
                o = nexttoken.exps;
                advance();
                if (token.led) {
                    left = token.led(left);
                } else {
                    error("Expected an operator and instead saw '{a}'.",
                        token, token.id);
                }
            }
            if (initial && !o) {
                warning(
"Expected an assignment or function call and instead saw an expression.",
                        token);
            }
        }
        if (!option.evil && left && left.value === 'eval') {
            warning("eval is evil.", left);
        }
        return left;
    }
function parse(rbp, initial) {
        var left;
        var o;
        if (nexttoken.id === '(end)') {
            error("Unexpected early end of program.", token);
        }
        advance();
        if (option.adsafe && token.value === 'ADSAFE') {
            if (nexttoken.id !== '.' || !(peek(0).identifier) ||
                    peek(1).id !== '(') {
                warning('ADsafe violation.', token);
            }
        }
        if (initial) {
            anonname = 'anonymous';
            funct['(verb)'] = token.value;
        }
        if (initial && token.fud) {
            left = token.fud();
        } else {
            if (token.nud) {
                o = token.exps;
                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) {
                o = nexttoken.exps;
                advance();
                if (token.led) {
                    left = token.led(left);
                } else {
                    error("Expected an operator and instead saw '{a}'.",
                        token, token.id);
                }
            }
            if (initial && !o) {
                warning(
"Expected an assignment or function call and instead saw an expression.",
                        token);
            }
        }
        if (!option.evil && left && left.value === 'eval') {
            warning("eval is evil.", left);
        }
        return left;
    }
function parse ( rbp , initial ) { var left ; var o ; if ( nexttoken . id === '(end)' ) { error ( "Unexpected early end of program." , token ) ; } advance ( ) ; if ( option . adsafe && token . value === 'ADSAFE' ) { if ( nexttoken . id !== '.' || ! ( peek ( 0 ) . identifier ) || peek ( 1 ) . id !== '(' ) { warning ( 'ADsafe violation.' , token ) ; } } if ( initial ) { anonname = 'anonymous' ; funct [ '(verb)' ] = token . value ; } if ( initial && token . fud ) { left = token . fud ( ) ; } else { if ( token . nud ) { o = token . exps ; 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 ) { o = nexttoken . exps ; advance ( ) ; if ( token . led ) { left = token . led ( left ) ; } else { error ( "Expected an operator and instead saw '{a}'." , token , token . id ) ; } } if ( initial && ! o ) { warning ( "Expected an assignment or function call and instead saw an expression." , token ) ; } } if ( ! option . evil && left && left . value === 'eval' ) { warning ( "eval is evil." , left ) ; } return left ; }
.nud     Null denotation .fud     First null denotation .led     Left denotation lbp     Left binding power rbp     Right binding power They are key to 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 key to the parsing method called Top Down Operator Precedence .