⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.java

📁 java中比较著名的js引擎当属mozilla开源的rhino
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
                break;        }        return pn;    }    private Node expr(boolean inForInit)        throws IOException, ParserException    {        Node pn = assignExpr(inForInit);        while (matchToken(Token.COMMA)) {            decompiler.addToken(Token.COMMA);            pn = nf.createBinary(Token.COMMA, pn, assignExpr(inForInit));        }        return pn;    }    private Node assignExpr(boolean inForInit)        throws IOException, ParserException    {        Node pn = condExpr(inForInit);        int tt = peekToken();        if (Token.FIRST_ASSIGN <= tt && tt <= Token.LAST_ASSIGN) {            consumeToken();            decompiler.addToken(tt);            pn = nf.createAssignment(tt, pn, assignExpr(inForInit));        }        return pn;    }    private Node condExpr(boolean inForInit)        throws IOException, ParserException    {        Node ifTrue;        Node ifFalse;        Node pn = orExpr(inForInit);        if (matchToken(Token.HOOK)) {            decompiler.addToken(Token.HOOK);            ifTrue = assignExpr(false);            mustMatchToken(Token.COLON, "msg.no.colon.cond");            decompiler.addToken(Token.COLON);            ifFalse = assignExpr(inForInit);            return nf.createCondExpr(pn, ifTrue, ifFalse);        }        return pn;    }    private Node orExpr(boolean inForInit)        throws IOException, ParserException    {        Node pn = andExpr(inForInit);        if (matchToken(Token.OR)) {            decompiler.addToken(Token.OR);            pn = nf.createBinary(Token.OR, pn, orExpr(inForInit));        }        return pn;    }    private Node andExpr(boolean inForInit)        throws IOException, ParserException    {        Node pn = bitOrExpr(inForInit);        if (matchToken(Token.AND)) {            decompiler.addToken(Token.AND);            pn = nf.createBinary(Token.AND, pn, andExpr(inForInit));        }        return pn;    }    private Node bitOrExpr(boolean inForInit)        throws IOException, ParserException    {        Node pn = bitXorExpr(inForInit);        while (matchToken(Token.BITOR)) {            decompiler.addToken(Token.BITOR);            pn = nf.createBinary(Token.BITOR, pn, bitXorExpr(inForInit));        }        return pn;    }    private Node bitXorExpr(boolean inForInit)        throws IOException, ParserException    {        Node pn = bitAndExpr(inForInit);        while (matchToken(Token.BITXOR)) {            decompiler.addToken(Token.BITXOR);            pn = nf.createBinary(Token.BITXOR, pn, bitAndExpr(inForInit));        }        return pn;    }    private Node bitAndExpr(boolean inForInit)        throws IOException, ParserException    {        Node pn = eqExpr(inForInit);        while (matchToken(Token.BITAND)) {            decompiler.addToken(Token.BITAND);            pn = nf.createBinary(Token.BITAND, pn, eqExpr(inForInit));        }        return pn;    }    private Node eqExpr(boolean inForInit)        throws IOException, ParserException    {        Node pn = relExpr(inForInit);        for (;;) {            int tt = peekToken();            switch (tt) {              case Token.EQ:              case Token.NE:              case Token.SHEQ:              case Token.SHNE:                consumeToken();                int decompilerToken = tt;                int parseToken = tt;                if (compilerEnv.getLanguageVersion() == Context.VERSION_1_2) {                    // JavaScript 1.2 uses shallow equality for == and != .                    // In addition, convert === and !== for decompiler into                    // == and != since the decompiler is supposed to show                    // canonical source and in 1.2 ===, !== are allowed                    // only as an alias to ==, !=.                    switch (tt) {                      case Token.EQ:                        parseToken = Token.SHEQ;                        break;                      case Token.NE:                        parseToken = Token.SHNE;                        break;                      case Token.SHEQ:                        decompilerToken = Token.EQ;                        break;                      case Token.SHNE:                        decompilerToken = Token.NE;                        break;                    }                }                decompiler.addToken(decompilerToken);                pn = nf.createBinary(parseToken, pn, relExpr(inForInit));                continue;            }            break;        }        return pn;    }    private Node relExpr(boolean inForInit)        throws IOException, ParserException    {        Node pn = shiftExpr();        for (;;) {            int tt = peekToken();            switch (tt) {              case Token.IN:                if (inForInit)                    break;                // fall through              case Token.INSTANCEOF:              case Token.LE:              case Token.LT:              case Token.GE:              case Token.GT:                consumeToken();                decompiler.addToken(tt);                pn = nf.createBinary(tt, pn, shiftExpr());                continue;            }            break;        }        return pn;    }    private Node shiftExpr()        throws IOException, ParserException    {        Node pn = addExpr();        for (;;) {            int tt = peekToken();            switch (tt) {              case Token.LSH:              case Token.URSH:              case Token.RSH:                consumeToken();                decompiler.addToken(tt);                pn = nf.createBinary(tt, pn, addExpr());                continue;            }            break;        }        return pn;    }    private Node addExpr()        throws IOException, ParserException    {        Node pn = mulExpr();        for (;;) {            int tt = peekToken();            if (tt == Token.ADD || tt == Token.SUB) {                consumeToken();                decompiler.addToken(tt);                // flushNewLines                pn = nf.createBinary(tt, pn, mulExpr());                continue;            }            break;        }        return pn;    }    private Node mulExpr()        throws IOException, ParserException    {        Node pn = unaryExpr();        for (;;) {            int tt = peekToken();            switch (tt) {              case Token.MUL:              case Token.DIV:              case Token.MOD:                consumeToken();                decompiler.addToken(tt);                pn = nf.createBinary(tt, pn, unaryExpr());                continue;            }            break;        }        return pn;    }    private Node unaryExpr()        throws IOException, ParserException    {        int tt;        tt = peekToken();        switch(tt) {        case Token.VOID:        case Token.NOT:        case Token.BITNOT:        case Token.TYPEOF:            consumeToken();            decompiler.addToken(tt);            return nf.createUnary(tt, unaryExpr());        case Token.ADD:            consumeToken();            // Convert to special POS token in decompiler and parse tree            decompiler.addToken(Token.POS);            return nf.createUnary(Token.POS, unaryExpr());        case Token.SUB:            consumeToken();            // Convert to special NEG token in decompiler and parse tree            decompiler.addToken(Token.NEG);            return nf.createUnary(Token.NEG, unaryExpr());        case Token.INC:        case Token.DEC:            consumeToken();            decompiler.addToken(tt);            return nf.createIncDec(tt, false, memberExpr(true));        case Token.DELPROP:            consumeToken();            decompiler.addToken(Token.DELPROP);            return nf.createUnary(Token.DELPROP, unaryExpr());        case Token.ERROR:            consumeToken();            break;        // XML stream encountered in expression.        case Token.LT:            if (compilerEnv.isXmlAvailable()) {                consumeToken();                Node pn = xmlInitializer();                return memberExprTail(true, pn);            }            // Fall thru to the default handling of RELOP        default:            Node pn = memberExpr(true);            // Don't look across a newline boundary for a postfix incop.            tt = peekTokenOrEOL();            if (tt == Token.INC || tt == Token.DEC) {                consumeToken();                decompiler.addToken(tt);                return nf.createIncDec(tt, true, pn);            }            return pn;        }        return nf.createName("err"); // Only reached on error.  Try to continue.    }    private Node xmlInitializer() throws IOException    {        int tt = ts.getFirstXMLToken();        if (tt != Token.XML && tt != Token.XMLEND) {            reportError("msg.syntax");            return null;        }        /* Make a NEW node to append to. */        Node pnXML = nf.createLeaf(Token.NEW);        String xml = ts.getString();        boolean fAnonymous = xml.trim().startsWith("<>");        Node pn = nf.createName(fAnonymous ? "XMLList" : "XML");        nf.addChildToBack(pnXML, pn);        pn = null;        Node expr;        for (;;tt = ts.getNextXMLToken()) {            switch (tt) {            case Token.XML:                xml = ts.getString();                decompiler.addName(xml);                mustMatchToken(Token.LC, "msg.syntax");                decompiler.addToken(Token.LC);                expr = (peekToken() == Token.RC)                    ? nf.createString("")                    : expr(false);                mustMatchToken(Token.RC, "msg.syntax");                decompiler.addToken(Token.RC);                if (pn == null) {                    pn = nf.createString(xml);                } else {                    pn = nf.createBinary(Token.ADD, pn, nf.createString(xml));                }                int nodeType;                if (ts.isXMLAttribute()) {                    nodeType = Token.ESCXMLATTR;                } else {                    nodeType = Token.ESCXMLTEXT;                }                expr = nf.createUnary(nodeType, expr);                pn = nf.createBinary(Token.ADD, pn, expr);                break;            case Token.XMLEND:                xml = ts.getString();                decompiler.addName(xml);                if (pn == null) {                    pn = nf.createString(xml);                } else {                    pn = nf.createBinary(Token.ADD, pn, nf.createString(xml));                }                nf.addChildToBack(pnXML, pn);                return pnXML;            default:                reportError("msg.syntax");                return null;            }        }    }    private void argumentList(Node listNode)        throws IOException, ParserException    {        boolean matched;        matched = matchToken(Token.RP);        if (!matched) {            boolean first = true;            do {                if (!first)                    decompiler.addToken(Token.COMMA);                first = false;                nf.addChildToBack(listNode, assignExpr(false));            } while (matchToken(Token.COMMA));            mustMatchToken(Token.RP, "msg.no.paren.arg");        }        decompiler.addToken(Token.RP);    }    private Node memberExpr(boolean allowCallSyntax)        throws IOException, ParserException    {        int tt;        Node pn;        /* Check for new expressions. */        tt = peekToken();        if (tt == Token.NEW) {            /* Eat the NEW token. */            consumeToken();            decompiler.addToken(Token.NEW);            /* Make a NEW node to append to. */            pn = nf.createCallOrNew(Token.NEW, memberExpr(false));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -