예제 #1
0
    public TypeInfo typeCheck(TypeEnv tenv) throws TypeException {
      String op = operator();
      if ("=".equals(op)) return typeCheckForAssign(tenv);
      else {
        leftType = ((ASTreeTypeEx) left()).typeCheck(tenv);
        rightType = ((ASTreeTypeEx) right()).typeCheck(tenv);

        if ("+".equals(op)) return leftType.plus(rightType, tenv);
        else if ("==".equals(op)) return TypeInfo.INT;
        else {
          leftType.assertSubtypeOf(TypeInfo.INT, tenv, this);
          rightType.assertSubtypeOf(TypeInfo.INT, tenv, this);
          return TypeInfo.INT;
        }
      }
    }
예제 #2
0
 public TypeInfo typeCheck(TypeEnv tenv) throws TypeException {
   if (tenv.get(0, index) != null)
     throw new TypeException("duplicate variable: " + name(), this);
   varType = TypeInfo.get(type());
   tenv.put(0, index, varType);
   valueType = ((ASTreeTypeEx) initializer()).typeCheck(tenv);
   valueType.assertSubtypeOf(varType, tenv, this);
   return varType;
 }
예제 #3
0
 public TypeInfo typeCheck(TypeEnv tenv) throws TypeException {
   TypeInfo condType = ((ASTreeTypeEx) condition()).typeCheck(tenv);
   condType.assertSubtypeOf(TypeInfo.INT, tenv, this);
   TypeInfo thenType = ((ASTreeTypeEx) thenBlock()).typeCheck(tenv);
   TypeInfo elseType;
   ASTree elseBk = elseBlock();
   if (elseBk == null) elseType = TypeInfo.INT;
   else elseType = ((ASTreeTypeEx) elseBk).typeCheck(tenv);
   return thenType.union(elseType, tenv);
 }
예제 #4
0
 public TypeInfo typeCheckForAssign(TypeEnv tenv, TypeInfo valueType) throws TypeException {
   type = tenv.get(nest, index);
   if (type == null) {
     type = valueType;
     tenv.put(0, index, valueType);
     return valueType;
   } else {
     valueType.assertSubtypeOf(type, tenv, this);
     return type;
   }
 }
예제 #5
0
 public TypeInfo typeCheck(TypeEnv tenv) throws TypeException {
   TypeInfo[] params = ((ParamListEx2) parameters()).types();
   TypeInfo retType = TypeInfo.get(type());
   funcType = TypeInfo.function(retType, params);
   TypeInfo oldType = tenv.put(0, index, funcType);
   if (oldType != null) throw new TypeException("function redefinition: " + name(), this);
   bodyEnv = new TypeEnv(size, tenv);
   for (int i = 0; i < params.length; i++) bodyEnv.put(0, i, params[i]);
   TypeInfo bodyType = ((ASTreeTypeEx) revise(body())).typeCheck(bodyEnv);
   bodyType.assertSubtypeOf(retType, tenv, this);
   return funcType;
 }
예제 #6
0
    public TypeInfo typeCheck(TypeEnv tenv, TypeInfo target) throws TypeException {
      if (!(target instanceof TypeInfo.FunctionType)) throw new TypeException("bad function", this);
      funcType = (TypeInfo.FunctionType) target;
      TypeInfo[] params = funcType.parameterTypes;

      if (size() != params.length) throw new TypeException("bad number of arguments", this);
      argTypes = new TypeInfo[params.length];
      int num = 0;
      for (ASTree a : this) {
        TypeInfo t = argTypes[num] = ((ASTreeTypeEx) a).typeCheck(tenv);
        t.assertSubtypeOf(params[num++], tenv, this);
      }
      return funcType.returnType;
    }
예제 #7
0
 public TypeInfo typeCheck(TypeEnv tenv) throws TypeException {
   TypeInfo t = ((ASTreeTypeEx) operand()).typeCheck(tenv);
   t.assertSubtypeOf(TypeInfo.INT, tenv, this);
   return TypeInfo.INT;
 }
예제 #8
0
 public TypeInfo typeInfo(TypeEnv tenv) throws TypeException {
   TypeInfo condType = ((ASTreeTypeEx) condition()).typeCheck(tenv);
   condType.assertSubtypeOf(TypeInfo.INT, tenv, this);
   TypeInfo bodyType = ((ASTreeTypeEx) body()).typeCheck(tenv);
   return bodyType.union(TypeInfo.INT, tenv);
 }