?? parser.java
字號:
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); decompiler.addToken(Token.NEW); decompiler.addToken(Token.DOT); String xml = ts.getString(); boolean fAnonymous = xml.trim().startsWith("<>"); decompiler.addName(fAnonymous ? "XMLList" : "XML"); 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.addString(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.addString(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)); if (matchToken(Token.LP)) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -