示例#1
0
  public void translate(ClassGenerator classGen, MethodGenerator methodGen) {
    final InstructionList il = methodGen.getInstructionList();

    _left.translate(classGen, methodGen);
    _right.translate(classGen, methodGen);

    switch (_op) {
      case PLUS:
        il.append(_type.ADD());
        break;
      case MINUS:
        il.append(_type.SUB());
        break;
      case TIMES:
        il.append(_type.MUL());
        break;
      case DIV:
        il.append(_type.DIV());
        break;
      case MOD:
        il.append(_type.REM());
        break;
      default:
        ErrorMsg msg = new ErrorMsg(ErrorMsg.ILLEGAL_BINARY_OP_ERR, this);
        getParser().reportError(Constants.ERROR, msg);
    }
  }
示例#2
0
 public Type typeCheck(SymbolTable stable) throws TypeCheckError {
   final Type tleft = _left.typeCheck(stable);
   final Type tright = _right.typeCheck(stable);
   final MethodType ptype =
       lookupPrimop(stable, Ops[_op], new MethodType(Type.Void, tleft, tright));
   if (ptype != null) {
     final Type arg1 = (Type) ptype.argsType().elementAt(0);
     if (!arg1.identicalTo(tleft)) {
       _left = new CastExpr(_left, arg1);
     }
     final Type arg2 = (Type) ptype.argsType().elementAt(1);
     if (!arg2.identicalTo(tright)) {
       _right = new CastExpr(_right, arg1);
     }
     return _type = ptype.resultType();
   }
   throw new TypeCheckError(this);
 }
示例#3
0
 public void setParser(Parser parser) {
   super.setParser(parser);
   _left.setParser(parser);
   _right.setParser(parser);
 }
示例#4
0
 /**
  * Returns true if this expressions contains a call to position(). This is needed for context
  * changes in node steps containing multiple predicates.
  */
 public boolean hasPositionCall() {
   if (_left.hasPositionCall()) return true;
   if (_right.hasPositionCall()) return true;
   return false;
 }