home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2001 December / dppcpro1201.iso / Extras / maple / Viewer / WebEQ / MMLViewerInstall.cab / MMLViewerApplet.cab / webeq3 / parser / mathml / PrimaryRuleSet.class (.txt) < prev    next >
Encoding:
Java Class File  |  2001-05-24  |  19.5 KB  |  1,685 lines

  1. package webeq3.parser.mathml;
  2.  
  3. import java.util.Enumeration;
  4. import webeq3.schema.Box;
  5. import webeq3.schema.ContentBox;
  6. import webeq3.schema.MFrac;
  7. import webeq3.schema.MN;
  8. import webeq3.schema.MO;
  9. import webeq3.schema.MRoot;
  10. import webeq3.schema.MRow;
  11. import webeq3.schema.MSqrt;
  12. import webeq3.schema.MSub;
  13. import webeq3.schema.MSubsup;
  14. import webeq3.schema.MSup;
  15. import webeq3.schema.MUnder;
  16. import webeq3.schema.MUnderover;
  17.  
  18. public class PrimaryRuleSet extends P2CRuleSet {
  19.    PrimaryRuleSet(P2CConverter var1) {
  20.       super(var1);
  21.    }
  22.  
  23.    public void applyRule(int var1, Box var2, ContentBox var3) throws P2CConverterException {
  24.       switch (var1) {
  25.          case 1:
  26.             this.processAbslike(var2, var3);
  27.             break;
  28.          case 2:
  29.             this.processIdentifier(var2, var3);
  30.             break;
  31.          case 3:
  32.             this.processNumber(var2, var3);
  33.             break;
  34.          case 4:
  35.             this.processFraction(var2, var3);
  36.             break;
  37.          case 5:
  38.             this.processRoot(var2, var3);
  39.          case 6:
  40.          case 15:
  41.          case 16:
  42.          case 17:
  43.          default:
  44.             break;
  45.          case 7:
  46.             this.processPower(var2, var3);
  47.             break;
  48.          case 8:
  49.             this.processFunction(var2, var3);
  50.             break;
  51.          case 9:
  52.             this.processBinaryInfixOp(var2, var3);
  53.             break;
  54.          case 10:
  55.             this.processRepeatingInfixOp(var2, var3);
  56.             break;
  57.          case 11:
  58.             this.processUnaryPostfixOp(var2, var3);
  59.             break;
  60.          case 12:
  61.             this.processSumProduct(var2, var3);
  62.             break;
  63.          case 13:
  64.             this.processLimit(var2, var3);
  65.             break;
  66.          case 14:
  67.             this.processIntegral(var2, var3);
  68.             break;
  69.          case 18:
  70.             this.processTranspose(var2, var3);
  71.             break;
  72.          case 19:
  73.             this.processDerivative(var2, var3);
  74.             break;
  75.          case 20:
  76.             this.processHatted(var2, var3);
  77.             break;
  78.          case 21:
  79.             this.processLogicConstruct(var2, var3);
  80.       }
  81.  
  82.    }
  83.  
  84.    private int getBinaryInfixOp(Box var1) {
  85.       int var2 = -1;
  86.       if (var1.getClass().getName().equals("webeq3.schema.MO") && this.getOperatorType(var1) == 2) {
  87.          var2 = MathMLDictionary.getAnyKeyword(var1.udata);
  88.       } else if (var1.children != null && var1.children.size() > 1) {
  89.          Enumeration var3 = var1.children.elements();
  90.  
  91.          while(var3.hasMoreElements() && var2 == -1) {
  92.             Box var4 = (Box)var3.nextElement();
  93.             if (this.getOperatorType(var4) == 2) {
  94.                var2 = MathMLDictionary.getAnyKeyword(var4.udata);
  95.             }
  96.          }
  97.       }
  98.  
  99.       return var2;
  100.    }
  101.  
  102.    private int getFunction(Box var1) {
  103.       int var2 = -1;
  104.       Box var3 = ((P2CRuleSet)this).findLeftMostTerminal(var1);
  105.       if (var3.udata != null) {
  106.          var2 = MathMLDictionary.getAnyKeyword(var3.udata);
  107.       }
  108.  
  109.       return var2;
  110.    }
  111.  
  112.    private int getOperatorType(Box var1) {
  113.       byte var2 = 0;
  114.       if (var1.getClass().getName().equals("webeq3.schema.MO")) {
  115.          MO var3 = (MO)var1;
  116.          int var4 = MathMLDictionary.getAnyKeyword(var3.udata);
  117.          switch (var4) {
  118.             case 101:
  119.             case 102:
  120.             case 103:
  121.             case 104:
  122.             case 105:
  123.             case 106:
  124.             case 107:
  125.             case 108:
  126.             case 109:
  127.             case 110:
  128.             case 111:
  129.             case 112:
  130.             case 118:
  131.             case 162:
  132.             case 163:
  133.             case 164:
  134.             case 166:
  135.             case 167:
  136.             case 168:
  137.             case 198:
  138.             case 199:
  139.             case 266:
  140.             case 267:
  141.             case 278:
  142.             case 279:
  143.             case 301:
  144.             case 302:
  145.             case 303:
  146.             case 304:
  147.             case 305:
  148.             case 306:
  149.             case 307:
  150.             case 308:
  151.             case 309:
  152.             case 310:
  153.             case 311:
  154.             case 312:
  155.             case 313:
  156.             case 314:
  157.             case 320:
  158.             case 321:
  159.             case 322:
  160.             case 323:
  161.             case 324:
  162.             case 325:
  163.             case 326:
  164.             case 327:
  165.             case 328:
  166.             case 330:
  167.             case 331:
  168.             case 332:
  169.                var2 = 2;
  170.             case 113:
  171.             case 114:
  172.             case 115:
  173.             case 117:
  174.             case 120:
  175.             case 121:
  176.             case 127:
  177.             case 129:
  178.             case 130:
  179.             case 131:
  180.             case 132:
  181.             case 133:
  182.             case 134:
  183.             case 135:
  184.             case 136:
  185.             case 152:
  186.             case 153:
  187.             case 154:
  188.             case 155:
  189.             case 156:
  190.             case 157:
  191.             case 158:
  192.             case 159:
  193.             case 160:
  194.             case 165:
  195.             case 169:
  196.             case 170:
  197.             case 171:
  198.             case 172:
  199.             case 173:
  200.             case 174:
  201.             case 175:
  202.             case 176:
  203.             case 177:
  204.             case 178:
  205.             case 179:
  206.             case 180:
  207.             case 181:
  208.             case 182:
  209.             case 183:
  210.             case 184:
  211.             case 185:
  212.             case 186:
  213.             case 187:
  214.             case 188:
  215.             case 189:
  216.             case 190:
  217.             case 192:
  218.             case 193:
  219.             case 194:
  220.             case 195:
  221.             case 196:
  222.             case 197:
  223.             case 200:
  224.             case 201:
  225.             case 202:
  226.             case 203:
  227.             case 204:
  228.             case 205:
  229.             case 206:
  230.             case 207:
  231.             case 208:
  232.             case 209:
  233.             case 210:
  234.             case 211:
  235.             case 212:
  236.             case 213:
  237.             case 214:
  238.             case 215:
  239.             case 216:
  240.             case 217:
  241.             case 218:
  242.             case 219:
  243.             case 220:
  244.             case 221:
  245.             case 222:
  246.             case 223:
  247.             case 224:
  248.             case 225:
  249.             case 226:
  250.             case 227:
  251.             case 228:
  252.             case 229:
  253.             case 230:
  254.             case 231:
  255.             case 232:
  256.             case 233:
  257.             case 234:
  258.             case 235:
  259.             case 236:
  260.             case 237:
  261.             case 238:
  262.             case 239:
  263.             case 240:
  264.             case 241:
  265.             case 242:
  266.             case 243:
  267.             case 244:
  268.             case 245:
  269.             case 246:
  270.             case 247:
  271.             case 248:
  272.             case 249:
  273.             case 250:
  274.             case 251:
  275.             case 252:
  276.             case 253:
  277.             case 254:
  278.             case 255:
  279.             case 256:
  280.             case 257:
  281.             case 258:
  282.             case 259:
  283.             case 260:
  284.             case 261:
  285.             case 262:
  286.             case 263:
  287.             case 264:
  288.             case 265:
  289.             case 268:
  290.             case 269:
  291.             case 270:
  292.             case 271:
  293.             case 272:
  294.             case 274:
  295.             case 277:
  296.             case 280:
  297.             case 281:
  298.             case 282:
  299.             case 283:
  300.             case 284:
  301.             case 285:
  302.             case 286:
  303.             case 287:
  304.             case 288:
  305.             case 289:
  306.             case 299:
  307.             case 300:
  308.             case 315:
  309.             case 316:
  310.             case 317:
  311.             case 318:
  312.             case 319:
  313.             case 329:
  314.             default:
  315.                break;
  316.             case 116:
  317.                var2 = 4;
  318.                break;
  319.             case 119:
  320.             case 122:
  321.             case 123:
  322.             case 191:
  323.                var2 = 3;
  324.                break;
  325.             case 124:
  326.             case 125:
  327.             case 126:
  328.             case 128:
  329.             case 137:
  330.             case 138:
  331.             case 139:
  332.             case 140:
  333.             case 141:
  334.             case 142:
  335.             case 143:
  336.             case 144:
  337.             case 145:
  338.             case 146:
  339.             case 147:
  340.             case 148:
  341.             case 149:
  342.             case 150:
  343.             case 151:
  344.             case 161:
  345.             case 273:
  346.             case 275:
  347.             case 276:
  348.             case 290:
  349.             case 291:
  350.             case 292:
  351.             case 293:
  352.             case 294:
  353.             case 295:
  354.             case 296:
  355.             case 297:
  356.             case 298:
  357.                var2 = 1;
  358.          }
  359.       } else {
  360.          var2 = -1;
  361.       }
  362.  
  363.       return var2;
  364.    }
  365.  
  366.    private int getRepeatingInfixOp(Box var1) {
  367.       int var2 = -1;
  368.       if (this.getOperatorType(var1) == 3) {
  369.          var2 = MathMLDictionary.getAnyKeyword(var1.udata);
  370.       } else if (var1.children != null && var1.children.size() > 1) {
  371.          Enumeration var3 = var1.children.elements();
  372.  
  373.          while(var3.hasMoreElements() && var2 == -1) {
  374.             Box var4 = (Box)var3.nextElement();
  375.             if (this.getOperatorType(var4) == 3 && var2 == -1) {
  376.                var2 = MathMLDictionary.getAnyKeyword(var4.udata);
  377.             }
  378.          }
  379.       }
  380.  
  381.       return var2;
  382.    }
  383.  
  384.    public int getRuleMatch(Box var1) throws P2CConverterException {
  385.       byte var2 = -1;
  386.       if (var1.getClass().getName().equals("webeq3.schema.MRow")) {
  387.          if (this.isAbslike(var1)) {
  388.             var2 = 1;
  389.          } else if (this.isSumProduct(var1)) {
  390.             var2 = 12;
  391.          } else if (this.isIntegral(var1)) {
  392.             var2 = 14;
  393.          } else if (this.isDerivative(var1)) {
  394.             var2 = 19;
  395.          } else if (this.isLimit(var1)) {
  396.             var2 = 13;
  397.          } else if (this.isLogicConstruct(var1)) {
  398.             var2 = 21;
  399.          } else if (this.isOperator(var1)) {
  400.             if (this.isPreMinus(var1)) {
  401.                var2 = 8;
  402.             } else if (this.isLog(var1)) {
  403.                var2 = 8;
  404.             } else if (this.isPrefixFunction(var1)) {
  405.                var2 = 8;
  406.             } else if (this.isBinaryInfixOp(var1)) {
  407.                var2 = 9;
  408.             } else if (this.isRepeatingInfixOp(var1)) {
  409.                var2 = 10;
  410.             } else if (this.isUnaryPostfixOp(var1)) {
  411.                var2 = 11;
  412.             }
  413.          }
  414.       } else if (var1.getClass().getName().equals("webeq3.schema.MI")) {
  415.          var2 = 2;
  416.       } else if (var1.getClass().getName().equals("webeq3.schema.MN")) {
  417.          var2 = 3;
  418.       } else if (var1.getClass().getName().equals("webeq3.schema.MFrac")) {
  419.          var2 = 4;
  420.       } else if (!(var1 instanceof MSqrt) && !(var1 instanceof MRoot)) {
  421.          if (this.isHatted(var1)) {
  422.             var2 = 20;
  423.          } else if (this.isTranspose(var1)) {
  424.             var2 = 18;
  425.          } else if (this.isPower(var1)) {
  426.             var2 = 7;
  427.          }
  428.       } else {
  429.          var2 = 5;
  430.       }
  431.  
  432.       return var2;
  433.    }
  434.  
  435.    private boolean isAbslike(Box var1) {
  436.       boolean var2 = false;
  437.       if (var1 instanceof MRow && var1.children.size() == 3) {
  438.          Box var3 = var1.getChild(0);
  439.          Box var4 = var1.getChild(2);
  440.          if (var3 instanceof MO && var4 instanceof MO) {
  441.             char var5 = var3.udata.charAt(0);
  442.             char var6 = var4.udata.charAt(0);
  443.             if (var5 == '|' && var6 == var5 || var5 == 8968 && var6 == 8969 || var5 == 8970 && var6 == 8971) {
  444.                var2 = true;
  445.             }
  446.          }
  447.       }
  448.  
  449.       return var2;
  450.    }
  451.  
  452.    private int getUnaryPostfixOp(Box var1) {
  453.       int var2 = -1;
  454.       Box var3 = ((P2CRuleSet)this).findRightMostTerminal(var1);
  455.       if (this.getOperatorType(var3) == 4) {
  456.          var2 = MathMLDictionary.getAnyKeyword(var3.udata);
  457.       }
  458.  
  459.       return var2;
  460.    }
  461.  
  462.    private boolean isPreMinus(Box var1) {
  463.       boolean var2 = false;
  464.       if (var1 instanceof MRow) {
  465.          Box var3 = var1.getChild(0);
  466.          if (var3 != null && var3 instanceof MO && var3.adata.equals("-")) {
  467.             var2 = true;
  468.          }
  469.       }
  470.  
  471.       return var2;
  472.    }
  473.  
  474.    private boolean isBinaryInfixOp(Box var1) {
  475.       return this.getBinaryInfixOp(var1) != -1;
  476.    }
  477.  
  478.    private boolean isHatted(Box var1) {
  479.       boolean var2 = false;
  480.       if (var1.getClass().getName().equals("webeq3.schema.MOver") && var1.children != null && var1.children.size() > 1) {
  481.          var2 = true;
  482.       }
  483.  
  484.       return var2;
  485.    }
  486.  
  487.    private boolean isLimit(Box var1) {
  488.       boolean var2 = false;
  489.       Box var3 = var1.getChild(0);
  490.       if (var3 != null && var3 instanceof MUnder) {
  491.          Box var4 = ((P2CRuleSet)this).findLeftMostTerminal(var3);
  492.          int var5 = MathMLDictionary.getAnyKeyword(var4.udata);
  493.          if (var5 == 136) {
  494.             var2 = true;
  495.          }
  496.       }
  497.  
  498.       return var2;
  499.    }
  500.  
  501.    private boolean isLogicConstruct(Box var1) {
  502.       boolean var2 = false;
  503.       Box var3 = var1.getChild(0);
  504.       if (var3 != null && var3 instanceof MRow) {
  505.          Box var4 = var3.getChild(0);
  506.          if (var4 instanceof MO) {
  507.             int var5 = MathMLDictionary.getAnyKeyword(var4.udata);
  508.             if (var5 == 197 || var5 == 196 || var5 == 329) {
  509.                var2 = true;
  510.             }
  511.          }
  512.       }
  513.  
  514.       return var2;
  515.    }
  516.  
  517.    private boolean isLog(Box var1) {
  518.       boolean var2 = false;
  519.       Box var3 = var1.getChild(0);
  520.       int var4 = -1;
  521.       if (var3 instanceof MO) {
  522.          var4 = MathMLDictionary.getAnyKeyword(var3.udata);
  523.       } else if (var3 instanceof MSubsup) {
  524.          var4 = MathMLDictionary.getAnyKeyword(((P2CRuleSet)this).findLeftMostTerminal(var3).udata);
  525.       }
  526.  
  527.       if (var4 == 129) {
  528.          var2 = true;
  529.       }
  530.  
  531.       return var2;
  532.    }
  533.  
  534.    private boolean isOperator(Box var1) {
  535.       boolean var2 = false;
  536.       Enumeration var3 = var1.children.elements();
  537.  
  538.       while(var3.hasMoreElements() && !var2) {
  539.          Box var4 = (Box)var3.nextElement();
  540.          if (var4.isEmbellishedOp()) {
  541.             var4 = ((P2CRuleSet)this).findLeftMostTerminal(var4);
  542.             if (var4.getClass().getName().equals("webeq3.schema.MO")) {
  543.                var2 = MathMLDictionary.getAnyKeyword(var4.udata) != -1;
  544.             }
  545.          }
  546.       }
  547.  
  548.       return var2;
  549.    }
  550.  
  551.    private boolean isTranspose(Box var1) throws P2CConverterException {
  552.       boolean var2 = false;
  553.       if (var1 instanceof MSup) {
  554.          Box var4 = ((P2CRuleSet)this).findRightMostTerminal(var1);
  555.          String var3 = var4.udata;
  556.          if (MathMLDictionary.getAnyKeyword(var3) == 160) {
  557.             Box var5 = var1.getChild(0);
  558.             boolean var6 = PreRuleSet.isVector(var5);
  559.             boolean var7 = PreRuleSet.isMatrix(var5);
  560.             if (var6 || var7) {
  561.                var2 = true;
  562.             }
  563.          }
  564.       }
  565.  
  566.       return var2;
  567.    }
  568.  
  569.    private boolean isPower(Box var1) {
  570.       boolean var2 = false;
  571.       if (var1 instanceof MSubsup) {
  572.          var2 = true;
  573.       }
  574.  
  575.       return var2;
  576.    }
  577.  
  578.    private boolean isPrefixFunction(Box var1) {
  579.       boolean var2 = false;
  580.       Box var3 = var1.getChild(0);
  581.       if (var3 == null) {
  582.          return false;
  583.       } else {
  584.          if (var3.isOperator()) {
  585.             var2 = true;
  586.          } else {
  587.             Box var4 = var3.getParent().getChild(var3.getBoxID() + 1);
  588.             if (var4.udata.equals(String.valueOf('∩┐╝'))) {
  589.                var2 = true;
  590.             }
  591.          }
  592.  
  593.          return var2;
  594.       }
  595.    }
  596.  
  597.    private boolean isRepeatingInfixOp(Box var1) {
  598.       return this.getRepeatingInfixOp(var1) != -1;
  599.    }
  600.  
  601.    private boolean isSumProduct(Box var1) {
  602.       boolean var2 = false;
  603.       Box var3 = var1.getChild(0);
  604.       int var4 = -1;
  605.       if (var3 instanceof MO) {
  606.          var4 = MathMLDictionary.getAnyKeyword(var3.udata);
  607.       } else if (var3 instanceof MSubsup || var3 instanceof MUnderover) {
  608.          var4 = MathMLDictionary.getAnyKeyword(((P2CRuleSet)this).findLeftMostTerminal(var3).udata);
  609.       }
  610.  
  611.       if (var4 == 134 || var4 == 135) {
  612.          var2 = true;
  613.       }
  614.  
  615.       return var2;
  616.    }
  617.  
  618.    private boolean isIntegral(Box var1) {
  619.       boolean var2 = false;
  620.       Box var3 = var1.getChild(0);
  621.       int var4 = -1;
  622.       if (var3 instanceof MO) {
  623.          var4 = MathMLDictionary.getAnyKeyword(var3.udata);
  624.       } else if (var3 instanceof MSubsup || var3 instanceof MUnderover) {
  625.          var4 = MathMLDictionary.getAnyKeyword(((P2CRuleSet)this).findLeftMostTerminal(var3).udata);
  626.       }
  627.  
  628.       if (var4 == 130) {
  629.          var2 = true;
  630.       }
  631.  
  632.       return var2;
  633.    }
  634.  
  635.    private boolean isDerivative(Box var1) {
  636.       boolean var2 = false;
  637.       if (!(var1 instanceof MFrac) && !(var1.getChild(0) instanceof MFrac)) {
  638.          return false;
  639.       } else {
  640.          Box var3 = ((P2CRuleSet)this).findLeftMostTerminal(var1);
  641.          int var4 = MathMLDictionary.getAnyKeyword(var3.udata);
  642.          if (var4 == 131 || var4 == 132) {
  643.             Box var5 = var3.getParent();
  644.             if (!(var5 instanceof MFrac) && var5 != null) {
  645.                var5 = var5.getParent();
  646.                if (!(var5 instanceof MFrac) && var5 != null) {
  647.                   var5 = var5.getParent();
  648.                }
  649.             }
  650.  
  651.             if (var5 instanceof MFrac) {
  652.                Box var6 = var5.getChild(1);
  653.                Box var7 = ((P2CRuleSet)this).findLeftMostTerminal(var6);
  654.                int var8 = MathMLDictionary.getAnyKeyword(var7.udata);
  655.                if (var8 == var4) {
  656.                   var2 = true;
  657.                }
  658.             }
  659.          }
  660.  
  661.          return var2;
  662.       }
  663.    }
  664.  
  665.    private boolean isUnaryPostfixOp(Box var1) {
  666.       return this.getUnaryPostfixOp(var1) != -1;
  667.    }
  668.  
  669.    private void processAbslike(Box var1, ContentBox var2) throws P2CConverterException {
  670.       Box var3 = ((P2CRuleSet)this).findLeftMostTerminal(var1);
  671.       ContentBox var4 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  672.       ContentBox var5 = null;
  673.       switch (var3.udata.charAt(0)) {
  674.          case '|':
  675.             var5 = new ContentBox(var4, 192, -1);
  676.             var5.name = "abs";
  677.             break;
  678.          case 'Γîê':
  679.             var5 = new ContentBox(var4, 299, -1);
  680.             var5.name = "ceiling";
  681.             break;
  682.          case 'Γîè':
  683.             var5 = new ContentBox(var4, 300, -1);
  684.             var5.name = "floor";
  685.             break;
  686.          default:
  687.             P2CRuleSet.ConvertError("Fences in abslike expression are not | nor ceil nor floor", var1);
  688.       }
  689.  
  690.       var3.cpeer = var5;
  691.       var5.ppeer = var3;
  692.       ((Box)var4).addChild(var5);
  693.       Enumeration var6 = var1.children.elements();
  694.  
  695.       while(var6.hasMoreElements()) {
  696.          Box var7 = (Box)var6.nextElement();
  697.          if (!(var7 instanceof MO)) {
  698.             super.converter.processExpression(var7, var4);
  699.          }
  700.       }
  701.  
  702.    }
  703.  
  704.    private void processBinaryInfixOp(Box var1, ContentBox var2) throws P2CConverterException {
  705.       if (var1.children.size() != 3) {
  706.          P2CRuleSet.ConvertError("Binary infix operator must have two operands", var1);
  707.       }
  708.  
  709.       ContentBox var3 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  710.  
  711.       int var4;
  712.       for(var4 = 1; !((Box)var1.children.elementAt(var4)).isOperator(); ++var4) {
  713.       }
  714.  
  715.       int var5 = MathMLDictionary.getAnyKeyword(((Box)var1.children.elementAt(var4)).udata);
  716.       ContentBox var6 = new ContentBox(var3, var5, 0);
  717.       var1.cpeer = var6;
  718.       var6.ppeer = var1;
  719.       switch (var5) {
  720.          case 101:
  721.             var6.name = "eq";
  722.             break;
  723.          case 102:
  724.             var6.name = "lt";
  725.             break;
  726.          case 103:
  727.             var6.name = "leq";
  728.             break;
  729.          case 104:
  730.             var6.name = "gt";
  731.             break;
  732.          case 105:
  733.             var6.name = "geq";
  734.             break;
  735.          case 106:
  736.             var6.name = "notin";
  737.             break;
  738.          case 107:
  739.             var6.name = "notsubset";
  740.             break;
  741.          case 108:
  742.             var6.name = "notprsubset";
  743.             break;
  744.          case 109:
  745.             var6.name = "in";
  746.             break;
  747.          case 110:
  748.             var6.name = "subset";
  749.             break;
  750.          case 111:
  751.             var6.name = "prsubset";
  752.             break;
  753.          case 112:
  754.             var6.name = "tendsto";
  755.             char var7 = ((Box)var1.children.elementAt(var4)).udata.charAt(0);
  756.             if (var7 != 8600 && var7 != 8595) {
  757.                if (var7 == 8599 || var7 == 8593) {
  758.                   ((Box)var6).setAttribute(50, "below");
  759.                }
  760.             } else {
  761.                ((Box)var6).setAttribute(50, "above");
  762.             }
  763.             break;
  764.          case 118:
  765.             var6.name = "divide";
  766.             break;
  767.          case 162:
  768.             var6.name = "implies";
  769.             break;
  770.          case 163:
  771.             var6.name = "and";
  772.             break;
  773.          case 164:
  774.             var6.name = "or";
  775.             break;
  776.          case 166:
  777.             var6.name = "setdiff";
  778.             break;
  779.          case 167:
  780.             var6.name = "union";
  781.             break;
  782.          case 168:
  783.             var6.name = "intersect";
  784.             break;
  785.          case 198:
  786.             var6.name = "neq";
  787.             break;
  788.          case 266:
  789.             var6.name = "equivalent";
  790.             break;
  791.          case 267:
  792.             var6.name = "approx";
  793.             break;
  794.          case 278:
  795.             var6.name = "scalarproduct";
  796.             break;
  797.          case 279:
  798.             var6.name = "outerproduct";
  799.             break;
  800.          default:
  801.             var6 = this.wrapInCsymbol(var1.getChild(var4).getCopy(), var3);
  802.             var1.cpeer = var6;
  803.             var6.ppeer = var1;
  804.       }
  805.  
  806.       ((Box)var3).addChild(var6);
  807.       super.converter.processExpression((Box)var1.children.firstElement(), var3);
  808.       super.converter.processExpression((Box)var1.children.lastElement(), var3);
  809.    }
  810.  
  811.    private void processBVar(Box var1, ContentBox var2) throws P2CConverterException {
  812.       ContentBox var3 = new ContentBox(var2, 185, -1);
  813.       var3.name = "bvar";
  814.       var3.empty = false;
  815.       var3.ppeer = var1;
  816.       var1.cpeer = var3;
  817.       ((Box)var2).addChild(var3);
  818.       super.converter.processExpression(var1, var3);
  819.    }
  820.  
  821.    private void processHatted(Box var1, ContentBox var2) throws P2CConverterException {
  822.       Object var3 = null;
  823.       String var5 = ((P2CRuleSet)this).findRightMostTerminal(var1).udata;
  824.       if (var5.equals(String.valueOf('┬»'))) {
  825.          this.processConjugate(var1, var2);
  826.       } else if (var5.equals(String.valueOf('┬╖'))) {
  827.          this.processPrimeDotDiff(var1, var2);
  828.       } else if (!var5.equals(String.valueOf('\ue1c0')) && !var5.equals(String.valueOf('ΓåÆ')) && !var5.equals(String.valueOf('\ue192')) && !var5.equals(String.valueOf('ΓçÇ'))) {
  829.          ContentBox var4 = new ContentBox(var2, 169, 0);
  830.          var1.cpeer = var4;
  831.          var4.ppeer = var1;
  832.          var4.empty = false;
  833.          var4.name = "ci";
  834.          ((Box)var4).addChild(var1.getChild(0).getCopy());
  835.          ((Box)var2).addChild(var4);
  836.       } else {
  837.          this.processVectorHat(var1, var2);
  838.       }
  839.  
  840.    }
  841.  
  842.    private void processConjugate(Box var1, ContentBox var2) throws P2CConverterException {
  843.       ContentBox var3 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  844.       ContentBox var4 = new ContentBox(var3, 193, -1);
  845.       var4.name = "conjugate";
  846.       ((Box)var3).addChild(var4);
  847.       super.converter.processExpression((Box)var1.children.elementAt(0), var3);
  848.    }
  849.  
  850.    private void processVectorHat(Box var1, ContentBox var2) throws P2CConverterException {
  851.       ContentBox var3 = new ContentBox(var2, 169, 0);
  852.       var1.cpeer = var3;
  853.       var3.ppeer = var1;
  854.       ((Box)var3).setAttribute(50, "vector");
  855.       var3.name = "ci";
  856.       ((Box)var3).addChild(var1.getChild(0).getCopy());
  857.       ((Box)var2).addChild(var3);
  858.    }
  859.  
  860.    private void processPrimeDotDiff(Box var1, ContentBox var2) throws P2CConverterException {
  861.       ContentBox var3 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  862.       ContentBox var4 = new ContentBox(var3, 131, 206);
  863.       var4.name = "diff";
  864.       ((Box)var3).addChild(var4);
  865.       super.converter.processExpression(var1.getChild(0), var3);
  866.    }
  867.  
  868.    private void processFraction(Box var1, ContentBox var2) throws P2CConverterException {
  869.       if (var1.children.size() != 2) {
  870.          P2CRuleSet.ConvertError("Fraction needs two operands", var1);
  871.       }
  872.  
  873.       ContentBox var3 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  874.       ContentBox var4 = new ContentBox(var3, 118, -1);
  875.       var4.name = "divide";
  876.       ((Box)var3).addChild(var4);
  877.       super.converter.processExpression((Box)var1.children.firstElement(), var3);
  878.       super.converter.processExpression((Box)var1.children.lastElement(), var3);
  879.    }
  880.  
  881.    private void processFunction(Box var1, ContentBox var2) throws P2CConverterException {
  882.       Object var3 = null;
  883.       ContentBox var4 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  884.       int var5 = this.getFunction(var1.getChild(0));
  885.       if (var5 != -1) {
  886.          ContentBox var9 = new ContentBox(var4, var5, 0);
  887.          switch (var5) {
  888.             case 119:
  889.                var9.name = "minus";
  890.                ((Box)var4).addChild(var9);
  891.                break;
  892.             case 120:
  893.             case 121:
  894.             case 122:
  895.             case 123:
  896.             case 127:
  897.             case 130:
  898.             case 132:
  899.             case 133:
  900.             case 134:
  901.             case 135:
  902.             case 136:
  903.             case 152:
  904.             case 153:
  905.             case 154:
  906.             case 155:
  907.             case 156:
  908.             case 157:
  909.             case 158:
  910.             case 160:
  911.             case 162:
  912.             case 163:
  913.             case 164:
  914.             case 165:
  915.             case 166:
  916.             case 167:
  917.             case 168:
  918.             case 169:
  919.             case 170:
  920.             case 171:
  921.             case 172:
  922.             case 173:
  923.             case 174:
  924.             case 175:
  925.             case 176:
  926.             case 177:
  927.             case 178:
  928.             case 179:
  929.             case 180:
  930.             case 181:
  931.             case 182:
  932.             case 183:
  933.             case 184:
  934.             case 185:
  935.             case 186:
  936.             case 187:
  937.             case 188:
  938.             case 189:
  939.             case 190:
  940.             case 191:
  941.             case 192:
  942.             case 193:
  943.             case 194:
  944.             case 195:
  945.             case 196:
  946.             case 197:
  947.             case 198:
  948.             case 199:
  949.             case 200:
  950.             case 201:
  951.             case 202:
  952.             case 203:
  953.             case 204:
  954.             case 205:
  955.             case 206:
  956.             case 207:
  957.             case 208:
  958.             case 209:
  959.             case 210:
  960.             case 211:
  961.             case 212:
  962.             case 213:
  963.             case 214:
  964.             case 215:
  965.             case 216:
  966.             case 217:
  967.             case 218:
  968.             case 219:
  969.             case 220:
  970.             case 221:
  971.             case 222:
  972.             case 223:
  973.             case 224:
  974.             case 225:
  975.             case 226:
  976.             case 227:
  977.             case 228:
  978.             case 229:
  979.             case 230:
  980.             case 231:
  981.             case 232:
  982.             case 233:
  983.             case 234:
  984.             case 235:
  985.             case 236:
  986.             case 237:
  987.             case 238:
  988.             case 239:
  989.             case 240:
  990.             case 241:
  991.             case 242:
  992.             case 243:
  993.             case 244:
  994.             case 245:
  995.             case 246:
  996.             case 247:
  997.             case 248:
  998.             case 249:
  999.             case 250:
  1000.             case 251:
  1001.             case 252:
  1002.             case 253:
  1003.             case 254:
  1004.             case 255:
  1005.             case 256:
  1006.             case 257:
  1007.             case 258:
  1008.             case 259:
  1009.             case 260:
  1010.             case 261:
  1011.             case 262:
  1012.             case 263:
  1013.             case 264:
  1014.             case 265:
  1015.             case 266:
  1016.             case 267:
  1017.             case 271:
  1018.             case 272:
  1019.             case 274:
  1020.             case 277:
  1021.             case 278:
  1022.             case 279:
  1023.             case 280:
  1024.             case 281:
  1025.             case 282:
  1026.             case 283:
  1027.             case 284:
  1028.             case 285:
  1029.             case 286:
  1030.             case 287:
  1031.             case 288:
  1032.             case 289:
  1033.             default:
  1034.                P2CRuleSet.ConvertError("Unknown prefix operator", var1);
  1035.                break;
  1036.             case 124:
  1037.                var9.name = "max";
  1038.                ((Box)var4).addChild(var9);
  1039.                break;
  1040.             case 125:
  1041.                var9.name = "min";
  1042.                ((Box)var4).addChild(var9);
  1043.                break;
  1044.             case 126:
  1045.                var9.name = "gcd";
  1046.                ((Box)var4).addChild(var9);
  1047.                break;
  1048.             case 128:
  1049.                var9.name = "ln";
  1050.                ((Box)var4).addChild(var9);
  1051.                break;
  1052.             case 129:
  1053.                var9.name = "log";
  1054.                ((Box)var4).addChild(var9);
  1055.                this.processLogBase((Box)var1.children.firstElement(), var4);
  1056.                break;
  1057.             case 131:
  1058.                var9.name = "diff";
  1059.                ((Box)var4).addChild(var9);
  1060.                break;
  1061.             case 137:
  1062.                var9.name = "sin";
  1063.                ((Box)var4).addChild(var9);
  1064.                break;
  1065.             case 138:
  1066.                var9.name = "cos";
  1067.                ((Box)var4).addChild(var9);
  1068.                break;
  1069.             case 139:
  1070.                var9.name = "tan";
  1071.                ((Box)var4).addChild(var9);
  1072.                break;
  1073.             case 140:
  1074.                var9.name = "sec";
  1075.                ((Box)var4).addChild(var9);
  1076.                break;
  1077.             case 141:
  1078.                var9.name = "csc";
  1079.                ((Box)var4).addChild(var9);
  1080.                break;
  1081.             case 142:
  1082.                var9.name = "cot";
  1083.                ((Box)var4).addChild(var9);
  1084.                break;
  1085.             case 143:
  1086.                var9.name = "sinh";
  1087.                ((Box)var4).addChild(var9);
  1088.                break;
  1089.             case 144:
  1090.                var9.name = "cosh";
  1091.                ((Box)var4).addChild(var9);
  1092.                break;
  1093.             case 145:
  1094.                var9.name = "tanh";
  1095.                ((Box)var4).addChild(var9);
  1096.                break;
  1097.             case 146:
  1098.                var9.name = "sech";
  1099.                ((Box)var4).addChild(var9);
  1100.                break;
  1101.             case 147:
  1102.                var9.name = "csch";
  1103.                ((Box)var4).addChild(var9);
  1104.                break;
  1105.             case 148:
  1106.                var9.name = "coth";
  1107.                ((Box)var4).addChild(var9);
  1108.                break;
  1109.             case 149:
  1110.                var9.name = "arcsin";
  1111.                ((Box)var4).addChild(var9);
  1112.                break;
  1113.             case 150:
  1114.                var9.name = "arccos";
  1115.                ((Box)var4).addChild(var9);
  1116.                break;
  1117.             case 151:
  1118.                var9.name = "arctan";
  1119.                ((Box)var4).addChild(var9);
  1120.                break;
  1121.             case 159:
  1122.                var9.name = "determinant";
  1123.                ((Box)var4).addChild(var9);
  1124.                break;
  1125.             case 161:
  1126.                var9.name = "not";
  1127.                ((Box)var4).addChild(var9);
  1128.                break;
  1129.             case 268:
  1130.                var9.name = "divergence";
  1131.                ((Box)var4).addChild(var9);
  1132.                break;
  1133.             case 269:
  1134.                Box var6 = var1.getChild(0);
  1135.                if (var6 instanceof MSup) {
  1136.                   Box var7 = ((P2CRuleSet)this).findRightMostTerminal(var6);
  1137.                   if (var7 instanceof MN && var7.udata.equals("2")) {
  1138.                      var9.name = "laplacian";
  1139.                   } else {
  1140.                      P2CRuleSet.ConvertError("Nabla to some power other than '2' (not laplacian)", var1);
  1141.                   }
  1142.                } else {
  1143.                   var9.name = "grad";
  1144.                }
  1145.  
  1146.                ((Box)var4).addChild(var9);
  1147.                break;
  1148.             case 270:
  1149.                var9.name = "curl";
  1150.                ((Box)var4).addChild(var9);
  1151.                break;
  1152.             case 273:
  1153.                var9.name = "arg";
  1154.                ((Box)var4).addChild(var9);
  1155.                break;
  1156.             case 275:
  1157.                var9.name = "real";
  1158.                ((Box)var4).addChild(var9);
  1159.                break;
  1160.             case 276:
  1161.                var9.name = "imaginary";
  1162.                ((Box)var4).addChild(var9);
  1163.                break;
  1164.             case 290:
  1165.                var9.name = "arcsec";
  1166.                ((Box)var4).addChild(var9);
  1167.                break;
  1168.             case 291:
  1169.                var9.name = "arccsc";
  1170.                ((Box)var4).addChild(var9);
  1171.                break;
  1172.             case 292:
  1173.                var9.name = "arccot";
  1174.                ((Box)var4).addChild(var9);
  1175.                break;
  1176.             case 293:
  1177.                var9.name = "arcsinh";
  1178.                ((Box)var4).addChild(var9);
  1179.                break;
  1180.             case 294:
  1181.                var9.name = "arccosh";
  1182.                ((Box)var4).addChild(var9);
  1183.                break;
  1184.             case 295:
  1185.                var9.name = "arctanh";
  1186.                ((Box)var4).addChild(var9);
  1187.                break;
  1188.             case 296:
  1189.                var9.name = "arcsech";
  1190.                ((Box)var4).addChild(var9);
  1191.                break;
  1192.             case 297:
  1193.                var9.name = "arccsch";
  1194.                ((Box)var4).addChild(var9);
  1195.                break;
  1196.             case 298:
  1197.                var9.name = "arccoth";
  1198.                ((Box)var4).addChild(var9);
  1199.          }
  1200.       } else {
  1201.          if (var1.children.size() < 2) {
  1202.             P2CRuleSet.ConvertError("Function needs at least a function name and argument list", var1);
  1203.          }
  1204.  
  1205.          super.converter.processExpression((Box)var1.children.firstElement(), var4);
  1206.       }
  1207.  
  1208.       int var10 = var1.getNumChildren();
  1209.  
  1210.       for(int var11 = 1; var11 < var10; ++var11) {
  1211.          Box var8 = var1.getChild(var11);
  1212.          if (var8 instanceof MRow) {
  1213.             if (var8.getChild(0).isLFence()) {
  1214.                super.converter.processExpression(var8.getChild(1), var4);
  1215.             } else {
  1216.                super.converter.processExpression(var8, var4);
  1217.             }
  1218.          } else if (!(var8 instanceof MO) || !var8.adata.equals("⁡")) {
  1219.             super.converter.processExpression(var8, var4);
  1220.          }
  1221.       }
  1222.  
  1223.    }
  1224.  
  1225.    private void processIdentifier(Box var1, ContentBox var2) {
  1226.       ContentBox var3 = new ContentBox(var2, 169, 0);
  1227.       var1.cpeer = var3;
  1228.       var3.ppeer = var1;
  1229.       var3.adata = var1.adata;
  1230.       var3.udata = var1.udata;
  1231.       var3.empty = false;
  1232.       var3.name = "ci";
  1233.       ((Box)var2).addChild(var3);
  1234.    }
  1235.  
  1236.    private void processLimit(Box var1, ContentBox var2) throws P2CConverterException {
  1237.       if (var1.children == null || var1.children.size() < 2) {
  1238.          P2CRuleSet.ConvertError("Limit needs a low limit and an expression", var1);
  1239.       }
  1240.  
  1241.       ContentBox var3 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  1242.       ContentBox var4 = new ContentBox(var3, 136, 0);
  1243.       var4.name = "limit";
  1244.       ((Box)var3).addChild(var4);
  1245.       Box var5 = (Box)var1.children.firstElement();
  1246.       Box var6 = (Box)var5.children.elementAt(1);
  1247.       this.processBVar(((P2CRuleSet)this).findLeftMostTerminal(var6), var3);
  1248.       this.processLowLimit((Box)var6.children.lastElement(), var3);
  1249.       super.converter.processExpression((Box)var1.children.lastElement(), var3);
  1250.    }
  1251.  
  1252.    private void processLogBase(Box var1, ContentBox var2) throws P2CConverterException {
  1253.       Object var3 = null;
  1254.       if (var1.getClass().getName().equals("webeq3.schema.MSub") && var1.children.size() > 1) {
  1255.          ContentBox var4 = new ContentBox(var2, 186, 0);
  1256.          var4.name = "logbase";
  1257.          super.converter.processExpression((Box)var1.children.elementAt(1), var4);
  1258.          ((Box)var2).addChild(var4);
  1259.       }
  1260.  
  1261.    }
  1262.  
  1263.    private void processLowLimit(Box var1, ContentBox var2) throws P2CConverterException {
  1264.       ContentBox var3 = new ContentBox(var2, 183, -1);
  1265.       var3.name = "lowlimit";
  1266.       var3.empty = false;
  1267.       ((Box)var2).addChild(var3);
  1268.       super.converter.processExpression(var1, var3);
  1269.    }
  1270.  
  1271.    private void processNumber(Box var1, Box var2) {
  1272.       ContentBox var3 = new ContentBox(var2, 170, 0);
  1273.       var3.empty = false;
  1274.       var1.cpeer = var3;
  1275.       var3.ppeer = var1;
  1276.       var3.adata = var1.adata;
  1277.       var3.udata = var1.udata;
  1278.       var3.name = "cn";
  1279.       var2.addChild(var3);
  1280.    }
  1281.  
  1282.    private void processPower(Box var1, ContentBox var2) throws P2CConverterException {
  1283.       if (var1.children.size() < 2) {
  1284.          P2CRuleSet.ConvertError("Power expression needs a root and a power", var1);
  1285.       }
  1286.  
  1287.       Box var3 = var1.getChild(2);
  1288.       if (var3 instanceof MO && var3.udata.equals(String.valueOf('ΓÇ▓'))) {
  1289.          this.processPrimeDotDiff(var1, var2);
  1290.       } else {
  1291.          ContentBox var4;
  1292.          if (!(var1 instanceof MSub)) {
  1293.             var4 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  1294.             ContentBox var5 = new ContentBox(var4, 120, -1);
  1295.             var5.name = "power";
  1296.             ((Box)var4).addChild(var5);
  1297.          } else {
  1298.             var4 = var2;
  1299.          }
  1300.  
  1301.          if (!(var1 instanceof MSup)) {
  1302.             ContentBox var7 = new ContentBox(var2, 169, 0);
  1303.             var1.cpeer = var7;
  1304.             var7.ppeer = var1;
  1305.             var7.empty = false;
  1306.             var7.name = "ci";
  1307.             MSub var6 = new MSub(var1.getParent());
  1308.             ((Box)var6).addChild(var1.getChild(0).getCopy());
  1309.             ((Box)var6).addChild(var1.getChild(1).getCopy());
  1310.             ((Box)var7).addChild(var6);
  1311.             ((Box)var4).addChild(var7);
  1312.          } else {
  1313.             super.converter.processExpression((Box)var1.children.firstElement(), var4);
  1314.          }
  1315.  
  1316.          if (!(var1 instanceof MSub)) {
  1317.             super.converter.processExpression((Box)var1.children.lastElement(), var4);
  1318.          }
  1319.  
  1320.       }
  1321.    }
  1322.  
  1323.    private void processTranspose(Box var1, ContentBox var2) throws P2CConverterException {
  1324.       ContentBox var3 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  1325.       ContentBox var4 = new ContentBox(var3, 160, -1);
  1326.       var4.name = "transpose";
  1327.       ((Box)var3).addChild(var4);
  1328.       super.converter.processExpression((Box)var1.children.firstElement(), var3);
  1329.    }
  1330.  
  1331.    private void processRepeatingInfixOp(Box var1, ContentBox var2) throws P2CConverterException {
  1332.       ContentBox var3 = null;
  1333.       ContentBox var4 = null;
  1334.       int var5 = var1.children.size();
  1335.       int var6 = 0;
  1336.  
  1337.       while(var6 < var5 - 1) {
  1338.          int var7;
  1339.          for(var7 = var6 + 1; var7 < var5 - 1 && !((Box)var1.children.elementAt(var7)).isOperator(); ++var7) {
  1340.          }
  1341.  
  1342.          Box var8 = var1.getChild(var7);
  1343.          int var9 = MathMLDictionary.getAnyKeyword(var8.udata);
  1344.          var3 = new ContentBox(var2, 171, 0);
  1345.          var3.name = "apply";
  1346.          var3.ppeer = var1;
  1347.          var1.cpeer = var3;
  1348.          ContentBox var10 = new ContentBox(var3, var9, 0);
  1349.          switch (var9) {
  1350.             case 119:
  1351.                var10.name = "minus";
  1352.                break;
  1353.             case 122:
  1354.                var10.name = "plus";
  1355.                break;
  1356.             case 123:
  1357.                int var11 = var6;
  1358.                boolean var12 = true;
  1359.  
  1360.                do {
  1361.                   var12 = PreRuleSet.isVector((Box)var1.children.elementAt(var11));
  1362.                   var11 += 2;
  1363.                } while(var12 && var11 < var5 - 1 && MathMLDictionary.getAnyKeyword(((Box)var1.children.elementAt(var11 + 1)).udata) == var9);
  1364.  
  1365.                if (var12) {
  1366.                   var10.name = "vectorproduct";
  1367.                } else {
  1368.                   var10.name = "times";
  1369.                }
  1370.                break;
  1371.             case 191:
  1372.                var10.name = "compose";
  1373.          }
  1374.  
  1375.          ((Box)var3).addChild(var10);
  1376.          if (var4 != null) {
  1377.             ((Box)var4).setParent(var3);
  1378.             ((Box)var3).addChild(var4);
  1379.          } else {
  1380.             super.converter.processExpression((Box)var1.children.elementAt(var6), var3);
  1381.          }
  1382.  
  1383.          do {
  1384.             ++var6;
  1385.  
  1386.             while(var6 < var5 - 1 && !((Box)var1.children.elementAt(var6)).isOperand()) {
  1387.                ++var6;
  1388.             }
  1389.  
  1390.             super.converter.processExpression((Box)var1.children.elementAt(var6), var3);
  1391.          } while(var6 < var5 - 1 && MathMLDictionary.getAnyKeyword(((Box)var1.children.elementAt(var6 + 1)).udata) == var9);
  1392.  
  1393.          if (var6 < var5) {
  1394.             var4 = var3;
  1395.          }
  1396.       }
  1397.  
  1398.       ((Box)var3).setParent(var2);
  1399.       ((Box)var2).addChild(var3);
  1400.    }
  1401.  
  1402.    private void processRoot(Box var1, ContentBox var2) throws P2CConverterException {
  1403.       if (var1.children.size() < 2) {
  1404.          P2CRuleSet.ConvertError("Root needs a degree and an expression", var1);
  1405.       }
  1406.  
  1407.       ContentBox var3 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  1408.       ContentBox var4 = new ContentBox(var3, 127, -1);
  1409.       var4.name = "root";
  1410.       ((Box)var3).addChild(var4);
  1411.       if (var1 instanceof MSqrt) {
  1412.          Enumeration var5 = var1.children.elements();
  1413.  
  1414.          while(var5.hasMoreElements()) {
  1415.             Box var6 = (Box)var5.nextElement();
  1416.             super.converter.processExpression(var6, var3);
  1417.          }
  1418.       } else {
  1419.          this.processRootDegree((Box)var1.children.elementAt(1), var3);
  1420.          super.converter.processExpression((Box)var1.children.elementAt(0), var3);
  1421.       }
  1422.  
  1423.    }
  1424.  
  1425.    private void processRootDegree(Box var1, ContentBox var2) throws P2CConverterException {
  1426.       ContentBox var3 = new ContentBox(var2, 186, -1);
  1427.       var3.name = "degree";
  1428.       var3.empty = false;
  1429.       ((Box)var2).addChild(var3);
  1430.       super.converter.processExpression(var1, var3);
  1431.    }
  1432.  
  1433.    private void processSumProduct(Box var1, ContentBox var2) throws P2CConverterException {
  1434.       int var3 = MathMLDictionary.getAnyKeyword(((P2CRuleSet)this).findLeftMostTerminal(var1).udata);
  1435.       ContentBox var4 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  1436.       ContentBox var5 = new ContentBox(var4, var3, -1);
  1437.       if (var3 == 134) {
  1438.          var5.name = "sum";
  1439.       } else {
  1440.          var5.name = "product";
  1441.       }
  1442.  
  1443.       ((Box)var4).addChild(var5);
  1444.  
  1445.       Box var6;
  1446.       for(var6 = var1; var6.children != null && var6.children.size() > 0 && !(var6.children.firstElement() instanceof MUnderover); var6 = (Box)var6.children.firstElement()) {
  1447.       }
  1448.  
  1449.       Box var7 = (Box)var6.children.firstElement();
  1450.       if (var7.children.size() < 3) {
  1451.          P2CRuleSet.ConvertError("A sum or product needs upper and lower bounds, and an expression", var1);
  1452.       }
  1453.  
  1454.       Box var8 = (Box)var7.children.elementAt(1);
  1455.       this.processBVar((Box)var8.children.firstElement(), var4);
  1456.       this.processLowLimit((Box)var8.children.lastElement(), var4);
  1457.       if (!(var7 instanceof MUnder)) {
  1458.          Box var9 = (Box)var7.children.elementAt(2);
  1459.          this.processUpLimit(var9, var4);
  1460.       }
  1461.  
  1462.       super.converter.processExpression((Box)var6.children.elementAt(1), var4);
  1463.    }
  1464.  
  1465.    private void processDerivative(Box var1, ContentBox var2) throws P2CConverterException {
  1466.       Box var3 = var1;
  1467.       if (!(var1 instanceof MFrac)) {
  1468.          var3 = var1.getChild(0);
  1469.       }
  1470.  
  1471.       Box var4 = var3.getChild(0);
  1472.       Box var5 = var3.getChild(1);
  1473.       Box var6 = ((P2CRuleSet)this).findLeftMostTerminal(var5);
  1474.       int var7 = MathMLDictionary.getAnyKeyword(var6.udata);
  1475.       ContentBox var8 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  1476.       ContentBox var9;
  1477.       if (var7 == 131) {
  1478.          var9 = new ContentBox(var8, 131, 206);
  1479.          var9.name = "diff";
  1480.       } else {
  1481.          if (var7 != 132) {
  1482.             P2CRuleSet.ConvertError("Denominator does not start with d or partial", var1);
  1483.             return;
  1484.          }
  1485.  
  1486.          var9 = new ContentBox(var8, 132, 206);
  1487.          var9.name = "partialdiff";
  1488.       }
  1489.  
  1490.       ((Box)var8).addChild(var9);
  1491.       this.makeDifBvar(var6, var8, var7);
  1492.       Box var10 = null;
  1493.       if (var4.children.size() > 1) {
  1494.          var10 = var4.getChild(1);
  1495.       } else {
  1496.          Box var11 = var3.getParent();
  1497.          if (var3.box_id + 1 < var11.children.size()) {
  1498.             var10 = var11.getChild(var3.box_id + 1);
  1499.          } else {
  1500.             P2CRuleSet.ConvertError("Missing operand for derivative", var1);
  1501.          }
  1502.       }
  1503.  
  1504.       if (var10 != null) {
  1505.          super.converter.processExpression(var10, var8);
  1506.       }
  1507.  
  1508.    }
  1509.  
  1510.    private void makeDifBvar(Box var1, Box var2, int var3) throws P2CConverterException {
  1511.       Box var4 = var1.getParent();
  1512.       if (var4.children.size() <= var1.box_id + 1) {
  1513.          P2CRuleSet.ConvertError("Nothing next to the Diff symbol", var1);
  1514.       } else {
  1515.          Box var5 = var4.getChild(var1.box_id + 1);
  1516.          ContentBox var6 = new ContentBox(var2, 185, 0);
  1517.          var6.name = "bvar";
  1518.          if (this.isPower(var5)) {
  1519.             super.converter.processExpression(var5.getChild(0), var6);
  1520.             this.processRootDegree(var5.getChild(2), var6);
  1521.          } else {
  1522.             super.converter.processExpression(var5, var6);
  1523.          }
  1524.  
  1525.          var2.addChild(var6);
  1526.          if (var3 == 132 && var4.children.size() > var1.box_id + 3) {
  1527.             Box var7 = var4.getChild(var1.box_id + 2);
  1528.             int var8 = MathMLDictionary.getAnyKeyword(var7.udata);
  1529.             if (var8 == 132) {
  1530.                this.makeDifBvar(var7, var2, var8);
  1531.             }
  1532.          }
  1533.  
  1534.       }
  1535.    }
  1536.  
  1537.    private void processIntegral(Box var1, ContentBox var2) throws P2CConverterException {
  1538.       Box var3 = ((P2CRuleSet)this).deNestMRows(var1);
  1539.       if (var1.children.size() < 3) {
  1540.          P2CRuleSet.ConvertError("Wrong number of children in integral", var1);
  1541.       }
  1542.  
  1543.       Object var4 = null;
  1544.       Box var5 = var1.getChild(2);
  1545.       Box var9;
  1546.       if (MathMLDictionary.getAnyKeyword(var5.udata) == 131) {
  1547.          if (var1.children.size() < 4) {
  1548.             P2CRuleSet.ConvertError("Did not find bound variable after d", var1);
  1549.          }
  1550.  
  1551.          var9 = var1.getChild(3);
  1552.       } else {
  1553.          if (var5.children.size() != 2) {
  1554.             P2CRuleSet.ConvertError("Wrong number of children in dx", var1);
  1555.          }
  1556.  
  1557.          Box var6 = var5.getChild(0);
  1558.          int var7 = MathMLDictionary.getAnyKeyword(var6.udata);
  1559.          if (var7 != 131) {
  1560.             P2CRuleSet.ConvertError("Could not find <mo>ⅆ</mo>", var1);
  1561.          }
  1562.  
  1563.          var9 = var5.getChild(1);
  1564.       }
  1565.  
  1566.       Box var10 = var1.getChild(1);
  1567.       Box var11 = ((P2CRuleSet)this).findLeftMostTerminal(var3);
  1568.       Box var8 = var11.getParent();
  1569.       if (var8 instanceof MSubsup) {
  1570.          this.processDefiniteIntegral(var1, var2, var9, var10);
  1571.       } else if (var11 instanceof MO) {
  1572.          this.processIndefiniteIntegral(var1, var2, var9, var10);
  1573.       } else {
  1574.          P2CRuleSet.ConvertError("Integral does not start with MO nor MSubsup", var1);
  1575.       }
  1576.  
  1577.    }
  1578.  
  1579.    private void processIndefiniteIntegral(Box var1, ContentBox var2, Box var3, Box var4) throws P2CConverterException {
  1580.       ContentBox var5 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  1581.       ContentBox var6 = new ContentBox(var5, 130, 207);
  1582.       var6.name = "int";
  1583.       ((Box)var5).addChild(var6);
  1584.       ContentBox var7 = new ContentBox(var5, 185, 0);
  1585.       var7.name = "bvar";
  1586.       super.converter.processExpression(var3, var7);
  1587.       ((Box)var5).addChild(var7);
  1588.       super.converter.processExpression(var4, var5);
  1589.    }
  1590.  
  1591.    private void processDefiniteIntegral(Box var1, ContentBox var2, Box var3, Box var4) throws P2CConverterException {
  1592.       ContentBox var5 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  1593.       ContentBox var6 = new ContentBox(var5, 130, 207);
  1594.       var6.name = "int";
  1595.       ((Box)var5).addChild(var6);
  1596.       ContentBox var7 = new ContentBox(var5, 185, 0);
  1597.       var7.name = "bvar";
  1598.       super.converter.processExpression(var3, var7);
  1599.       ((Box)var5).addChild(var7);
  1600.       MSubsup var8 = (MSubsup)var1.getChild(0);
  1601.       if (var8.children.size() > 1) {
  1602.          Box var9 = ((Box)var8).getChild(1);
  1603.          ContentBox var10 = new ContentBox(var5, 183, 0);
  1604.          var10.name = "lowlimit";
  1605.          super.converter.processExpression(var9, var10);
  1606.          ((Box)var5).addChild(var10);
  1607.          if (var8.children.size() > 2) {
  1608.             Box var11 = ((Box)var8).getChild(2);
  1609.             ContentBox var12 = new ContentBox(var5, 184, 0);
  1610.             var12.name = "uplimit";
  1611.             super.converter.processExpression(var11, var12);
  1612.             ((Box)var5).addChild(var12);
  1613.          }
  1614.       }
  1615.  
  1616.       super.converter.processExpression(var4, var5);
  1617.    }
  1618.  
  1619.    private void processUnaryPostfixOp(Box var1, ContentBox var2) throws P2CConverterException {
  1620.       ContentBox var3 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  1621.       int var4 = this.getUnaryPostfixOp(var1);
  1622.       ContentBox var5 = new ContentBox(var3, var4, -1);
  1623.       var1.cpeer = var5;
  1624.       var5.ppeer = var1;
  1625.       switch (var4) {
  1626.          case 116:
  1627.             var5.name = "factorial";
  1628.          default:
  1629.             ((Box)var3).addChild(var5);
  1630.             super.converter.processExpression((Box)var1.children.firstElement(), var3);
  1631.       }
  1632.    }
  1633.  
  1634.    private void processLogicConstruct(Box var1, ContentBox var2) throws P2CConverterException {
  1635.       int var3 = this.getFunction(var1);
  1636.       ContentBox var4;
  1637.       if (var3 == 329) {
  1638.          ContentBox var5 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  1639.          ContentBox var6 = new ContentBox(var5, 161, -1);
  1640.          var6.name = "not";
  1641.          ((Box)var5).addChild(var6);
  1642.          var4 = ((P2CRuleSet)this).makeApplyBox(var5, var1);
  1643.       } else {
  1644.          var4 = ((P2CRuleSet)this).makeApplyBox(var2, var1);
  1645.       }
  1646.  
  1647.       ContentBox var9 = new ContentBox(var4, var3, -1);
  1648.       var1.cpeer = var9;
  1649.       var9.ppeer = var1;
  1650.       switch (var3) {
  1651.          case 196:
  1652.             var9.name = "forall";
  1653.             break;
  1654.          case 197:
  1655.          case 329:
  1656.             var9.name = "exists";
  1657.       }
  1658.  
  1659.       ((Box)var4).addChild(var9);
  1660.       Box var7 = var1.getChild(0).getChild(1);
  1661.  
  1662.       for(int var8 = 0; var8 < var7.children.size(); var8 += 2) {
  1663.          this.processBVar(var7.getChild(var8), var4);
  1664.       }
  1665.  
  1666.       super.converter.processExpression((Box)var1.children.lastElement(), var4);
  1667.    }
  1668.  
  1669.    private void processUpLimit(Box var1, ContentBox var2) throws P2CConverterException {
  1670.       ContentBox var3 = new ContentBox(var2, 184, -1);
  1671.       var3.name = "uplimit";
  1672.       var3.empty = false;
  1673.       ((Box)var2).addChild(var3);
  1674.       super.converter.processExpression((Box)var1.children.firstElement(), var3);
  1675.    }
  1676.  
  1677.    private ContentBox wrapInCsymbol(Box var1, Box var2) {
  1678.       ContentBox var3 = new ContentBox(var2, 250, 0);
  1679.       var3.name = "csymbol";
  1680.       var3.empty = false;
  1681.       ((Box)var3).addChild(var1);
  1682.       return var3;
  1683.    }
  1684. }
  1685.