home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1999 November / PCONLINE_11_99.ISO / filesbbs / OS2 / APCHSSL2.ZIP / OS2HTTPD / jserv / com / netscape / javascript / Parser.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-04-09  |  12.1 KB  |  947 lines

  1. package com.netscape.javascript;
  2.  
  3. import java.io.IOException;
  4.  
  5. class Parser {
  6.    private static final boolean implementsCatchCond = false;
  7.    private int lastExprEndLine;
  8.    // $FF: renamed from: nf com.netscape.javascript.IRFactory
  9.    private IRFactory field_0;
  10.    // $FF: renamed from: er com.netscape.javascript.ErrorReporter
  11.    private ErrorReporter field_1;
  12.    // $FF: renamed from: ok boolean
  13.    private boolean field_2;
  14.  
  15.    private Object statementHelper(TokenStream var1, Source var2) throws IOException, JavaScriptException {
  16.       Object var3 = null;
  17.       boolean var4 = false;
  18.       boolean var6 = false;
  19.       int var5 = var1.getToken();
  20.       switch (var5) {
  21.          case -1:
  22.             this.reportError(var1, "msg.scanner.caught.error");
  23.          case 1:
  24.          case 88:
  25.             var3 = this.field_0.createLeaf(131);
  26.             var4 = true;
  27.             break;
  28.          case 5:
  29.             Object var32 = null;
  30.             int var42 = 0;
  31.             var2.append('\u0005');
  32.             if ((var1.flags & 8) == 0) {
  33.                this.reportError(var1, "msg.bad.return");
  34.             }
  35.  
  36.             var1.flags |= 512;
  37.             var5 = var1.peekTokenSameLine();
  38.             var1.flags &= -513;
  39.             if (var5 != 0 && var5 != 1 && var5 != 88 && var5 != 92) {
  40.                var42 = var1.getLineno();
  41.                var32 = this.expr(var1, var2, false);
  42.                if (var1.getLineno() == var42) {
  43.                   this.wellTerminated(var1, -1);
  44.                }
  45.  
  46.                var1.flags |= 16;
  47.             } else {
  48.                var1.flags |= 32;
  49.             }
  50.  
  51.             if ((var1.flags & 48) == 48) {
  52.                this.reportError(var1, "msg.fn.retval");
  53.             }
  54.  
  55.             var3 = this.field_0.createReturn(var32, var42);
  56.             break;
  57.          case 62:
  58.             int var31 = var1.getLineno();
  59.             var2.append('>');
  60.             var3 = this.field_0.createThrow(this.expr(var1, var2, false), var31);
  61.             if (var31 == var1.getLineno()) {
  62.                this.wellTerminated(var1, -1);
  63.             }
  64.             break;
  65.          case 75:
  66.             int var30 = var1.getLineno();
  67.             Object var48 = null;
  68.             Object var52 = null;
  69.             var4 = true;
  70.             var2.append('K');
  71.             var2.append('[');
  72.             var2.append('\u0001');
  73.             Object var41 = this.statement(var1, var2);
  74.             var2.append('\\');
  75.             var2.append('\u0001');
  76.             var48 = this.field_0.createLeaf(132);
  77.             int var53 = var1.peekToken();
  78.             if (var53 == 124) {
  79.                while(var1.matchToken(124)) {
  80.                   var2.append('|');
  81.                   this.mustMatchToken(var1, 93, "msg.no.paren.catch");
  82.                   var2.append(']');
  83.                   this.mustMatchToken(var1, 44, "msg.bad.catchcond");
  84.                   String var12 = var1.getString();
  85.                   var2.addString(44, var12);
  86.                   Object var13 = null;
  87.                   this.mustMatchToken(var1, 94, "msg.bad.catchcond");
  88.                   var2.append('^');
  89.                   this.mustMatchToken(var1, 91, "msg.no.brace.catchblock");
  90.                   var2.append('[');
  91.                   var2.append('\u0001');
  92.                   this.field_0.addChildToBack(var48, this.field_0.createCatch(var12, var13, this.statements(var1, var2), var1.getLineno()));
  93.                   var1.matchToken(92);
  94.                   var2.append('\\');
  95.                   var2.append('\u0001');
  96.                }
  97.             } else if (var53 != 125) {
  98.                this.mustMatchToken(var1, 125, "msg.try.no.catchfinally");
  99.             }
  100.  
  101.             if (var1.matchToken(125)) {
  102.                var2.append('}');
  103.                var2.append('[');
  104.                var2.append('\u0001');
  105.                var52 = this.statement(var1, var2);
  106.                var2.append('\\');
  107.                var2.append('\u0001');
  108.             }
  109.  
  110.             var3 = this.field_0.createTryCatchFinally(var41, var48, var52, var30);
  111.             break;
  112.          case 91:
  113.             var4 = true;
  114.             var3 = this.statements(var1, var2);
  115.             this.mustMatchToken(var1, 92, "msg.no.brace.block");
  116.             break;
  117.          case 112:
  118.             var4 = true;
  119.             var2.append('p');
  120.             int var29 = var1.getLineno();
  121.             Object var40 = this.condition(var1, var2);
  122.             var2.append('[');
  123.             var2.append('\u0001');
  124.             Object var47 = this.statement(var1, var2);
  125.             Object var51 = null;
  126.             if (var1.matchToken(113)) {
  127.                var2.append('\\');
  128.                var2.append('q');
  129.                var2.append('[');
  130.                var2.append('\u0001');
  131.                var51 = this.statement(var1, var2);
  132.             }
  133.  
  134.             var2.append('\\');
  135.             var2.append('\u0001');
  136.             var3 = this.field_0.createIf(var40, var47, var51, var29);
  137.             break;
  138.          case 114:
  139.             var4 = true;
  140.             var2.append('r');
  141.             var3 = this.field_0.createSwitch(var1.getLineno());
  142.             Object var28 = null;
  143.             this.mustMatchToken(var1, 93, "msg.no.paren.switch");
  144.             var2.append(']');
  145.             this.field_0.addChildToBack(var3, this.expr(var1, var2, false));
  146.             this.mustMatchToken(var1, 94, "msg.no.paren.after.switch");
  147.             var2.append('^');
  148.             this.mustMatchToken(var1, 91, "msg.no.brace.switch");
  149.             var2.append('[');
  150.             var2.append('\u0001');
  151.  
  152.             while((var5 = var1.getToken()) != 92 && var5 != 0) {
  153.                switch (var5) {
  154.                   case 115:
  155.                      var2.append('s');
  156.                      var28 = this.field_0.createUnary(115, this.expr(var1, var2, false));
  157.                      var2.append('b');
  158.                      var2.append('\u0001');
  159.                      break;
  160.                   case 116:
  161.                      var28 = this.field_0.createLeaf(116);
  162.                      var2.append('t');
  163.                      var2.append('b');
  164.                      var2.append('\u0001');
  165.                      break;
  166.                   default:
  167.                      this.reportError(var1, "msg.bad.switch");
  168.                }
  169.  
  170.                this.mustMatchToken(var1, 98, "msg.no.colon.case");
  171.                Object var39 = this.field_0.createLeaf(132);
  172.  
  173.                while((var5 = var1.peekToken()) != 92 && var5 != 115 && var5 != 116 && var5 != 0) {
  174.                   this.field_0.addChildToBack(var39, this.statement(var1, var2));
  175.                }
  176.  
  177.                this.field_0.addChildToBack(var28, var39);
  178.                this.field_0.addChildToBack(var3, var28);
  179.             }
  180.  
  181.             var2.append('\\');
  182.             var2.append('\u0001');
  183.             break;
  184.          case 117:
  185.             var4 = true;
  186.             var2.append('u');
  187.             int var27 = var1.getLineno();
  188.             Object var38 = this.condition(var1, var2);
  189.             var2.append('[');
  190.             var2.append('\u0001');
  191.             Object var46 = this.statement(var1, var2);
  192.             var2.append('\\');
  193.             var2.append('\u0001');
  194.             var3 = this.field_0.createWhile(var38, var46, var27);
  195.             break;
  196.          case 118:
  197.             var2.append('v');
  198.             var2.append('[');
  199.             var2.append('\u0001');
  200.             int var26 = var1.getLineno();
  201.             Object var37 = this.statement(var1, var2);
  202.             var2.append('\\');
  203.             this.mustMatchToken(var1, 117, "msg.no.while.do");
  204.             var2.append('u');
  205.             Object var45 = this.condition(var1, var2);
  206.             var3 = this.field_0.createDoWhile(var37, var45, var26);
  207.             break;
  208.          case 119:
  209.             var4 = true;
  210.             var2.append('w');
  211.             int var25 = var1.getLineno();
  212.             Object var10 = null;
  213.             this.mustMatchToken(var1, 93, "msg.no.paren.for");
  214.             var2.append(']');
  215.             var5 = var1.peekToken();
  216.             Object var36;
  217.             if (var5 == 88) {
  218.                var36 = this.field_0.createLeaf(131);
  219.             } else if (var5 == 122) {
  220.                var1.getToken();
  221.                var36 = this.variables(var1, var2, true);
  222.             } else {
  223.                var36 = this.expr(var1, var2, true);
  224.             }
  225.  
  226.             var5 = var1.peekToken();
  227.             Object var44;
  228.             if (var5 == 102 && var1.getOp() == 63) {
  229.                var1.matchToken(102);
  230.                var2.append('?');
  231.                var44 = this.expr(var1, var2, false);
  232.             } else {
  233.                this.mustMatchToken(var1, 88, "msg.no.semi.for");
  234.                var2.append('X');
  235.                if (var1.peekToken() == 88) {
  236.                   var44 = this.field_0.createLeaf(131);
  237.                } else {
  238.                   var44 = this.expr(var1, var2, false);
  239.                }
  240.  
  241.                this.mustMatchToken(var1, 88, "msg.no.semi.for.cond");
  242.                var2.append('X');
  243.                if (var1.peekToken() == 94) {
  244.                   var10 = this.field_0.createLeaf(131);
  245.                } else {
  246.                   var10 = this.expr(var1, var2, false);
  247.                }
  248.             }
  249.  
  250.             this.mustMatchToken(var1, 94, "msg.no.paren.for.ctrl");
  251.             var2.append('^');
  252.             var2.append('[');
  253.             var2.append('\u0001');
  254.             Object var11 = this.statement(var1, var2);
  255.             var2.append('\\');
  256.             var2.append('\u0001');
  257.             if (var10 == null) {
  258.                var3 = this.field_0.createForIn(var36, var44, var11, var25);
  259.             } else {
  260.                var3 = this.field_0.createFor(var36, var44, var10, var11, var25);
  261.             }
  262.             break;
  263.          case 120:
  264.             int var24 = var1.getLineno();
  265.             var2.append('x');
  266.             String var35 = this.matchLabel(var1);
  267.             if (var35 != null) {
  268.                var2.addString(44, var35);
  269.             }
  270.  
  271.             var3 = this.field_0.createBreak(var35, var24);
  272.             break;
  273.          case 121:
  274.             int var23 = var1.getLineno();
  275.             var2.append('y');
  276.             String var34 = this.matchLabel(var1);
  277.             if (var34 != null) {
  278.                var2.addString(44, var34);
  279.             }
  280.  
  281.             var3 = this.field_0.createContinue(var34, var23);
  282.             break;
  283.          case 122:
  284.             int var22 = var1.getLineno();
  285.             var3 = this.variables(var1, var2, false);
  286.             if (var1.getLineno() == var22) {
  287.                this.wellTerminated(var1, -1);
  288.             }
  289.             break;
  290.          case 123:
  291.             var4 = true;
  292.             var2.append('{');
  293.             int var7 = var1.getLineno();
  294.             this.mustMatchToken(var1, 93, "msg.no.paren.with");
  295.             var2.append(']');
  296.             Object var8 = this.expr(var1, var2, false);
  297.             this.mustMatchToken(var1, 94, "msg.no.paren.after.with");
  298.             var2.append('^');
  299.             var2.append('[');
  300.             var2.append('\u0001');
  301.             Object var9 = this.statement(var1, var2);
  302.             var2.append('\\');
  303.             var2.append('\u0001');
  304.             var3 = this.field_0.createWith(var8, var9, var7);
  305.             break;
  306.          default:
  307.             int var33 = var1.getTokenno();
  308.             var1.ungetToken(var5);
  309.             int var43 = var1.getLineno();
  310.             var3 = this.expr(var1, var2, false);
  311.             if (var1.peekToken() == 98) {
  312.                if (var5 != 44 || var1.getTokenno() != var33) {
  313.                   this.reportError(var1, "msg.bad.label");
  314.                }
  315.  
  316.                var1.getToken();
  317.                String var50 = var1.getString();
  318.                var3 = this.field_0.createLabel(var50, var43);
  319.                var2.append('b');
  320.                var2.append('\u0001');
  321.                return var3;
  322.             }
  323.  
  324.             var3 = this.field_0.createExprStatement(var3, var43);
  325.             if (var1.getLineno() == var43 || var5 == 109 && var1.getLineno() == this.lastExprEndLine) {
  326.                this.wellTerminated(var1, var5);
  327.             }
  328.       }
  329.  
  330.       var1.matchToken(88);
  331.       if (!var4) {
  332.          var2.append('X');
  333.          var2.append('\u0001');
  334.       }
  335.  
  336.       return var3;
  337.    }
  338.  
  339.    public Object parse(TokenStream var1) throws IOException {
  340.       this.field_2 = true;
  341.       Source var2 = new Source();
  342.       int var4 = var1.getLineno();
  343.       Object var5 = this.field_0.createLeaf(132);
  344.  
  345.       while(this.field_2) {
  346.          var1.flags |= 512;
  347.          int var3 = var1.getToken();
  348.          var1.flags &= -513;
  349.          if (var3 <= 0) {
  350.             break;
  351.          }
  352.  
  353.          if (var3 == 109) {
  354.             try {
  355.                this.field_0.addChildToBack(var5, this.function(var1, var2));
  356.                var2.append('\u0001');
  357.                this.wellTerminated(var1, 109);
  358.             } catch (JavaScriptException var7) {
  359.                this.field_2 = false;
  360.             }
  361.          } else {
  362.             var1.ungetToken(var3);
  363.             this.field_0.addChildToBack(var5, this.statement(var1, var2));
  364.          }
  365.       }
  366.  
  367.       if (!this.field_2) {
  368.          return null;
  369.       } else {
  370.          Object var6 = this.field_0.createScript(var5, var1.getSourceName(), var4, var1.getLineno(), var2.buf.toString());
  371.          return var6;
  372.       }
  373.    }
  374.  
  375.    private void mustMatchToken(TokenStream var1, int var2, String var3) throws IOException, JavaScriptException {
  376.       int var4;
  377.       if ((var4 = var1.getToken()) != var2) {
  378.          this.reportError(var1, var3);
  379.          var1.ungetToken(var4);
  380.       }
  381.  
  382.    }
  383.  
  384.    private Object parseFunctionBody(TokenStream var1, Source var2) throws IOException {
  385.       int var4 = var1.flags;
  386.       var1.flags &= -49;
  387.       var1.flags |= 8;
  388.  
  389.       Object var3;
  390.       try {
  391.          var3 = this.statements(var1, var2);
  392.       } finally {
  393.          var1.flags = var4;
  394.       }
  395.  
  396.       return var3;
  397.    }
  398.  
  399.    public Parser(IRFactory var1) {
  400.       this.field_0 = var1;
  401.    }
  402.  
  403.    private Object statement(TokenStream var1, Source var2) throws IOException {
  404.       try {
  405.          return this.statementHelper(var1, var2);
  406.       } catch (JavaScriptException var5) {
  407.          int var3 = var1.getLineno();
  408.  
  409.          int var4;
  410.          do {
  411.             var4 = var1.getToken();
  412.          } while(var4 != 88 && var4 != 1 && var4 != 0 && var4 != -1);
  413.  
  414.          return this.field_0.createExprStatement(this.field_0.createName("error"), var3);
  415.       }
  416.    }
  417.  
  418.    private Object addExpr(TokenStream var1, Source var2) throws IOException, JavaScriptException {
  419.       int var3;
  420.       Object var4;
  421.       for(var4 = this.mulExpr(var1, var2); (var3 = var1.getToken()) == 23 || var3 == 24; var4 = this.field_0.createBinary(var3, var4, this.mulExpr(var1, var2))) {
  422.          var2.append((char)var3);
  423.       }
  424.  
  425.       var1.ungetToken(var3);
  426.       return var4;
  427.    }
  428.  
  429.    private Object function(TokenStream var1, Source var2) throws IOException, JavaScriptException {
  430.       String var3 = null;
  431.       Object var4 = this.field_0.createLeaf(93);
  432.       int var6 = var1.getLineno();
  433.       var2.append('m');
  434.       var2.append(var2.functionNumber);
  435.       ++var2.functionNumber;
  436.       var2 = new Source();
  437.       var2.append('m');
  438.       if (var1.matchToken(44)) {
  439.          var3 = var1.getString();
  440.          var2.addString(44, var3);
  441.       }
  442.  
  443.       this.mustMatchToken(var1, 93, "msg.no.paren.parms");
  444.       var2.append(']');
  445.       if (!var1.matchToken(94)) {
  446.          boolean var7 = true;
  447.  
  448.          do {
  449.             if (!var7) {
  450.                var2.append('_');
  451.             }
  452.  
  453.             var7 = false;
  454.             this.mustMatchToken(var1, 44, "msg.no.parm");
  455.             String var8 = var1.getString();
  456.             this.field_0.addChildToBack(var4, this.field_0.createName(var8));
  457.             var2.addString(44, var8);
  458.          } while(var1.matchToken(95));
  459.  
  460.          this.mustMatchToken(var1, 94, "msg.no.paren.after.parms");
  461.       }
  462.  
  463.       var2.append('^');
  464.       this.mustMatchToken(var1, 91, "msg.no.brace.body");
  465.       var2.append('[');
  466.       var2.append('\u0001');
  467.       Object var5 = this.parseFunctionBody(var1, var2);
  468.       this.mustMatchToken(var1, 92, "msg.no.brace.after.body");
  469.       var2.append('\\');
  470.       return this.field_0.createFunction(var3, var4, var5, var1.getSourceName(), var6, var1.getLineno(), var2.buf.toString());
  471.    }
  472.  
  473.    private Object argumentList(TokenStream var1, Source var2, Object var3) throws IOException, JavaScriptException {
  474.       var1.flags |= 512;
  475.       boolean var4 = var1.matchToken(94);
  476.       var1.flags &= -513;
  477.       if (!var4) {
  478.          boolean var5 = true;
  479.  
  480.          do {
  481.             if (!var5) {
  482.                var2.append('_');
  483.             }
  484.  
  485.             var5 = false;
  486.             this.field_0.addChildToBack(var3, this.assignExpr(var1, var2, false));
  487.          } while(var1.matchToken(95));
  488.  
  489.          this.mustMatchToken(var1, 94, "msg.no.paren.arg");
  490.       }
  491.  
  492.       var2.append('^');
  493.       return var3;
  494.    }
  495.  
  496.    private boolean wellTerminated(TokenStream var1, int var2) throws IOException, JavaScriptException {
  497.       int var3 = var1.peekTokenSameLine();
  498.       if (var3 == -1) {
  499.          this.reportError(var1, "msg.scanner.caught.error");
  500.          return false;
  501.       } else {
  502.          if (var3 != 0 && var3 != 1 && var3 != 88 && var3 != 92) {
  503.             int var4 = Context.getContext().getLanguageVersion();
  504.             if ((var3 == 109 || var2 == 109) && var4 < 120) {
  505.                return true;
  506.             }
  507.  
  508.             this.reportError(var1, "msg.no.semi.stmt");
  509.          }
  510.  
  511.          return true;
  512.       }
  513.    }
  514.  
  515.    private void reportError(TokenStream var1, String var2) throws JavaScriptException {
  516.       if (this.field_2) {
  517.          this.field_2 = false;
  518.          if ((var1.flags & 1) == 0) {
  519.             String var3 = Context.getMessage(var2, (Object[])null);
  520.             Context.reportError(var3, var1.getSourceName(), var1.getLineno(), var1.getLine(), var1.getOffset());
  521.          }
  522.       }
  523.  
  524.       throw new JavaScriptException(var2);
  525.    }
  526.  
  527.    private Object bitOrExpr(TokenStream var1, Source var2, boolean var3) throws IOException, JavaScriptException {
  528.       Object var4;
  529.       for(var4 = this.bitXorExpr(var1, var2, var3); var1.matchToken(11); var4 = this.field_0.createBinary(11, var4, this.bitXorExpr(var1, var2, var3))) {
  530.          var2.append('\u000b');
  531.       }
  532.  
  533.       return var4;
  534.    }
  535.  
  536.    private Object eqExpr(TokenStream var1, Source var2, boolean var3) throws IOException, JavaScriptException {
  537.       Object var4;
  538.       for(var4 = this.relExpr(var1, var2, var3); var1.matchToken(101); var4 = this.field_0.createBinary(101, var1.getOp(), var4, this.relExpr(var1, var2, var3))) {
  539.          var2.append('e');
  540.          var2.append((char)var1.getOp());
  541.       }
  542.  
  543.       return var4;
  544.    }
  545.  
  546.    private Object relExpr(TokenStream var1, Source var2, boolean var3) throws IOException, JavaScriptException {
  547.       Object var4;
  548.       int var5;
  549.       for(var4 = this.shiftExpr(var1, var2); var1.matchToken(102); var4 = this.field_0.createBinary(102, var5, var4, this.shiftExpr(var1, var2))) {
  550.          var5 = var1.getOp();
  551.          if (var3 && var5 == 63) {
  552.             var1.ungetToken(102);
  553.             break;
  554.          }
  555.  
  556.          var2.append('f');
  557.          var2.append((char)var5);
  558.       }
  559.  
  560.       return var4;
  561.    }
  562.  
  563.    private Object shiftExpr(TokenStream var1, Source var2) throws IOException, JavaScriptException {
  564.       Object var3;
  565.       for(var3 = this.addExpr(var1, var2); var1.matchToken(103); var3 = this.field_0.createBinary(var1.getOp(), var3, this.addExpr(var1, var2))) {
  566.          var2.append('g');
  567.          var2.append((char)var1.getOp());
  568.       }
  569.  
  570.       return var3;
  571.    }
  572.  
  573.    private Object unaryExpr(TokenStream var1, Source var2) throws IOException, JavaScriptException {
  574.       var1.flags |= 512;
  575.       int var3 = var1.getToken();
  576.       var1.flags &= -513;
  577.       switch (var3) {
  578.          case -1:
  579.             this.reportError(var1, "msg.scanner.caught.error");
  580.             return this.field_0.createName("err");
  581.          case 23:
  582.          case 24:
  583.             var2.append('h');
  584.             var2.append((char)var3);
  585.             return this.field_0.createUnary(104, var3, this.unaryExpr(var1, var2));
  586.          case 31:
  587.             var2.append('\u001f');
  588.             return this.field_0.createUnary(31, this.unaryExpr(var1, var2));
  589.          case 104:
  590.             var2.append('h');
  591.             var2.append((char)var1.getOp());
  592.             return this.field_0.createUnary(104, var1.getOp(), this.unaryExpr(var1, var2));
  593.          case 105:
  594.          case 106:
  595.             var2.append((char)var3);
  596.             return this.field_0.createUnary(var3, 129, this.memberExpr(var1, var2, true));
  597.          default:
  598.             var1.ungetToken(var3);
  599.             int var4 = var1.getLineno();
  600.             Object var5 = this.memberExpr(var1, var2, true);
  601.             int var6;
  602.             if (((var6 = var1.peekToken()) == 105 || var6 == 106) && var1.getLineno() == var4) {
  603.                int var7 = var1.getToken();
  604.                var2.append((char)var7);
  605.                return this.field_0.createUnary(var7, 130, var5);
  606.             } else {
  607.                return var5;
  608.             }
  609.       }
  610.    }
  611.  
  612.    private Object memberExpr(TokenStream var1, Source var2, boolean var3) throws IOException, JavaScriptException {
  613.       var1.flags |= 512;
  614.       int var4 = var1.peekToken();
  615.       var1.flags &= -513;
  616.       Object var5;
  617.       if (var4 == 30) {
  618.          var1.getToken();
  619.          var2.append('\u001e');
  620.          var5 = this.field_0.createLeaf(30);
  621.          this.field_0.addChildToBack(var5, this.memberExpr(var1, var2, false));
  622.          if (var1.matchToken(93)) {
  623.             var2.append(']');
  624.             var5 = this.argumentList(var1, var2, var5);
  625.          }
  626.       } else {
  627.          var5 = this.primaryExpr(var1, var2);
  628.       }
  629.  
  630.       this.lastExprEndLine = var1.getLineno();
  631.  
  632.       while((var4 = var1.getToken()) > 0) {
  633.          if (var4 == 107) {
  634.             var2.append('k');
  635.             this.mustMatchToken(var1, 44, "msg.no.name.after.dot");
  636.             String var6 = var1.getString();
  637.             var2.addString(44, var6);
  638.             var5 = this.field_0.createBinary(107, var5, this.field_0.createName(var1.getString()));
  639.             this.lastExprEndLine = var1.getLineno();
  640.          } else if (var4 == 89) {
  641.             var2.append('Y');
  642.             var5 = this.field_0.createBinary(89, var5, this.expr(var1, var2, false));
  643.             this.mustMatchToken(var1, 90, "msg.no.bracket.index");
  644.             var2.append('Z');
  645.             this.lastExprEndLine = var1.getLineno();
  646.          } else {
  647.             if (!var3 || var4 != 93) {
  648.                var1.ungetToken(var4);
  649.                break;
  650.             }
  651.  
  652.             var5 = this.field_0.createUnary(43, var5);
  653.             var2.append(']');
  654.             var5 = this.argumentList(var1, var2, var5);
  655.             this.lastExprEndLine = var1.getLineno();
  656.          }
  657.       }
  658.  
  659.       if (var4 == -1) {
  660.          this.reportError(var1, "msg.scanner.caught.error");
  661.       }
  662.  
  663.       return var5;
  664.    }
  665.  
  666.    private Object statements(TokenStream var1, Source var2) throws IOException {
  667.       Object var3 = this.field_0.createBlock(var1.getLineno());
  668.  
  669.       int var4;
  670.       while((var4 = var1.peekToken()) > 0 && var4 != 92) {
  671.          this.field_0.addChildToBack(var3, this.statement(var1, var2));
  672.       }
  673.  
  674.       return var3;
  675.    }
  676.  
  677.    private Object condition(TokenStream var1, Source var2) throws IOException, JavaScriptException {
  678.       this.mustMatchToken(var1, 93, "msg.no.paren.cond");
  679.       var2.append(']');
  680.       Object var3 = this.expr(var1, var2, false);
  681.       this.mustMatchToken(var1, 94, "msg.no.paren.after.cond");
  682.       var2.append('^');
  683.       return var3;
  684.    }
  685.  
  686.    private Object variables(TokenStream var1, Source var2, boolean var3) throws IOException, JavaScriptException {
  687.       Object var4 = this.field_0.createVariables(var1.getLineno());
  688.       boolean var5 = true;
  689.       var2.append('z');
  690.  
  691.       do {
  692.          this.mustMatchToken(var1, 44, "msg.bad.var");
  693.          String var8 = var1.getString();
  694.          if (!var5) {
  695.             var2.append('_');
  696.          }
  697.  
  698.          var5 = false;
  699.          var2.addString(44, var8);
  700.          Object var6 = this.field_0.createName(var8);
  701.          if (var1.matchToken(96)) {
  702.             if (var1.getOp() != 127) {
  703.                this.reportError(var1, "msg.bad.var.init");
  704.             }
  705.  
  706.             var2.append('`');
  707.             var2.append('\u007f');
  708.             Object var7 = this.assignExpr(var1, var2, var3);
  709.             this.field_0.addChildToBack(var6, var7);
  710.          }
  711.  
  712.          this.field_0.addChildToBack(var4, var6);
  713.       } while(var1.matchToken(95));
  714.  
  715.       return var4;
  716.    }
  717.  
  718.    private Object expr(TokenStream var1, Source var2, boolean var3) throws IOException, JavaScriptException {
  719.       Object var4;
  720.       for(var4 = this.assignExpr(var1, var2, var3); var1.matchToken(95); var4 = this.field_0.createBinary(95, var4, this.assignExpr(var1, var2, var3))) {
  721.          var2.append('_');
  722.       }
  723.  
  724.       return var4;
  725.    }
  726.  
  727.    private Object condExpr(TokenStream var1, Source var2, boolean var3) throws IOException, JavaScriptException {
  728.       Object var6 = this.orExpr(var1, var2, var3);
  729.       if (var1.matchToken(97)) {
  730.          var2.append('a');
  731.          Object var4 = this.assignExpr(var1, var2, false);
  732.          this.mustMatchToken(var1, 98, "msg.no.colon.cond");
  733.          var2.append('b');
  734.          Object var5 = this.assignExpr(var1, var2, var3);
  735.          return this.field_0.createTernary(var6, var4, var5);
  736.       } else {
  737.          return var6;
  738.       }
  739.    }
  740.  
  741.    private Object bitXorExpr(TokenStream var1, Source var2, boolean var3) throws IOException, JavaScriptException {
  742.       Object var4;
  743.       for(var4 = this.bitAndExpr(var1, var2, var3); var1.matchToken(12); var4 = this.field_0.createBinary(12, var4, this.bitAndExpr(var1, var2, var3))) {
  744.          var2.append('\f');
  745.       }
  746.  
  747.       return var4;
  748.    }
  749.  
  750.    private Object bitAndExpr(TokenStream var1, Source var2, boolean var3) throws IOException, JavaScriptException {
  751.       Object var4;
  752.       for(var4 = this.eqExpr(var1, var2, var3); var1.matchToken(13); var4 = this.field_0.createBinary(13, var4, this.eqExpr(var1, var2, var3))) {
  753.          var2.append('\r');
  754.       }
  755.  
  756.       return var4;
  757.    }
  758.  
  759.    private Object primaryExpr(TokenStream var1, Source var2) throws IOException, JavaScriptException {
  760.       var1.flags |= 512;
  761.       int var3 = var1.getToken();
  762.       var1.flags &= -513;
  763.       switch (var3) {
  764.          case -1:
  765.             this.reportError(var1, "msg.scanner.caught.error");
  766.             break;
  767.          case 44:
  768.             String var15 = var1.getString();
  769.             var2.addString(44, var15);
  770.             return this.field_0.createName(var15);
  771.          case 45:
  772.             Number var17 = var1.getNumber();
  773.             var2.addNumber(var17);
  774.             return this.field_0.createNumber(var17);
  775.          case 46:
  776.             String var18 = var1.getString();
  777.             var2.addString(46, var18);
  778.             return this.field_0.createString(var18);
  779.          case 56:
  780.             String var19 = var1.regExpFlags;
  781.             var1.regExpFlags = null;
  782.             String var9 = var1.getString();
  783.             var2.addString(56, '/' + var9 + '/' + var19);
  784.             return this.field_0.createRegExp(var9, var19);
  785.          case 89:
  786.             var2.append('Y');
  787.             Object var13 = this.field_0.createLeaf(133);
  788.             var1.flags |= 512;
  789.             boolean var14 = var1.matchToken(90);
  790.             var1.flags &= -513;
  791.             if (!var14) {
  792.                boolean var16 = true;
  793.  
  794.                do {
  795.                   var1.flags |= 512;
  796.                   var3 = var1.peekToken();
  797.                   var1.flags &= -513;
  798.                   if (!var16) {
  799.                      var2.append('_');
  800.                   } else {
  801.                      var16 = false;
  802.                   }
  803.  
  804.                   if (var3 == 90) {
  805.                      break;
  806.                   }
  807.  
  808.                   if (var3 == 95) {
  809.                      this.field_0.addChildToBack(var13, this.field_0.createLeaf(108, 74));
  810.                   } else {
  811.                      this.field_0.addChildToBack(var13, this.assignExpr(var1, var2, false));
  812.                   }
  813.                } while(var1.matchToken(95));
  814.  
  815.                this.mustMatchToken(var1, 90, "msg.no.bracket.arg");
  816.             }
  817.  
  818.             var2.append('Z');
  819.             return this.field_0.createArrayLiteral(var13);
  820.          case 91:
  821.             Object var12 = this.field_0.createLeaf(134);
  822.             var2.append('[');
  823.             if (!var1.matchToken(92)) {
  824.                boolean var5 = true;
  825.  
  826.                label49:
  827.                do {
  828.                   if (!var5) {
  829.                      var2.append('_');
  830.                   } else {
  831.                      var5 = false;
  832.                   }
  833.  
  834.                   var3 = var1.getToken();
  835.                   Object var6;
  836.                   switch (var3) {
  837.                      case 44:
  838.                      case 46:
  839.                         String var7 = var1.getString();
  840.                         var2.addString(44, var7);
  841.                         var6 = this.field_0.createString(var1.getString());
  842.                         break;
  843.                      case 45:
  844.                         Number var8 = var1.getNumber();
  845.                         var2.addNumber(var8);
  846.                         var6 = this.field_0.createNumber(var8);
  847.                         break;
  848.                      case 92:
  849.                         var1.ungetToken(var3);
  850.                         break label49;
  851.                      default:
  852.                         this.reportError(var1, "msg.bad.prop");
  853.                         break label49;
  854.                   }
  855.  
  856.                   this.mustMatchToken(var1, 98, "msg.no.colon.prop");
  857.                   var2.append('\u0086');
  858.                   this.field_0.addChildToBack(var12, var6);
  859.                   this.field_0.addChildToBack(var12, this.assignExpr(var1, var2, false));
  860.                } while(var1.matchToken(95));
  861.  
  862.                this.mustMatchToken(var1, 92, "msg.no.brace.prop");
  863.             }
  864.  
  865.             var2.append('\\');
  866.             return this.field_0.createObjectLiteral(var12);
  867.          case 93:
  868.             var2.append(']');
  869.             Object var4 = this.expr(var1, var2, false);
  870.             var2.append('^');
  871.             this.mustMatchToken(var1, 94, "msg.no.paren");
  872.             return var4;
  873.          case 108:
  874.             var2.append('l');
  875.             var2.append((char)var1.getOp());
  876.             return this.field_0.createLeaf(108, var1.getOp());
  877.          case 109:
  878.             return this.function(var1, var2);
  879.          case 126:
  880.             this.reportError(var1, "msg.reserved.id");
  881.             break;
  882.          default:
  883.             this.reportError(var1, "msg.syntax");
  884.       }
  885.  
  886.       return null;
  887.    }
  888.  
  889.    private String matchLabel(TokenStream var1) throws IOException, JavaScriptException {
  890.       int var2 = var1.getLineno();
  891.       String var3 = null;
  892.       int var4 = var1.peekTokenSameLine();
  893.       if (var4 == 44) {
  894.          var1.getToken();
  895.          var3 = var1.getString();
  896.       }
  897.  
  898.       if (var2 == var1.getLineno()) {
  899.          this.wellTerminated(var1, -1);
  900.       }
  901.  
  902.       return var3;
  903.    }
  904.  
  905.    private Object assignExpr(TokenStream var1, Source var2, boolean var3) throws IOException, JavaScriptException {
  906.       Object var4 = this.condExpr(var1, var2, var3);
  907.       if (var1.matchToken(96)) {
  908.          var2.append('`');
  909.          var2.append((char)var1.getOp());
  910.          var4 = this.field_0.createBinary(96, var1.getOp(), var4, this.assignExpr(var1, var2, var3));
  911.       }
  912.  
  913.       return var4;
  914.    }
  915.  
  916.    private Object orExpr(TokenStream var1, Source var2, boolean var3) throws IOException, JavaScriptException {
  917.       Object var4 = this.andExpr(var1, var2, var3);
  918.       if (var1.matchToken(99)) {
  919.          var2.append('c');
  920.          var4 = this.field_0.createBinary(99, var4, this.orExpr(var1, var2, var3));
  921.       }
  922.  
  923.       return var4;
  924.    }
  925.  
  926.    private Object andExpr(TokenStream var1, Source var2, boolean var3) throws IOException, JavaScriptException {
  927.       Object var4 = this.bitOrExpr(var1, var2, var3);
  928.       if (var1.matchToken(100)) {
  929.          var2.append('d');
  930.          var4 = this.field_0.createBinary(100, var4, this.andExpr(var1, var2, var3));
  931.       }
  932.  
  933.       return var4;
  934.    }
  935.  
  936.    private Object mulExpr(TokenStream var1, Source var2) throws IOException, JavaScriptException {
  937.       int var3;
  938.       Object var4;
  939.       for(var4 = this.unaryExpr(var1, var2); (var3 = var1.peekToken()) == 25 || var3 == 26 || var3 == 27; var4 = this.field_0.createBinary(var3, var4, this.unaryExpr(var1, var2))) {
  940.          var3 = var1.getToken();
  941.          var2.append((char)var3);
  942.       }
  943.  
  944.       return var4;
  945.    }
  946. }
  947.