Package edu.mit.csail.sdg.alloy4compiler.ast

Examples of edu.mit.csail.sdg.alloy4compiler.ast.Expr


    /* Evaluates an ExprQt node. */
    /*===========================*/

    /** Adds a "one of" in front of X if X is unary and does not have a declared multiplicity. */
    private static Expr addOne(Expr x) {
        Expr save = x;
        while(x instanceof ExprUnary) {
            switch(((ExprUnary)x).op) {
               case EXACTLYOF: case SETOF: case ONEOF: case LONEOF: case SOMEOF: return save;
               case NOOP: x = ((ExprUnary)x).sub;  continue;
               default: break;
View Full Code Here


         return visit_qt(ExprQt.Op.ALL, xvars, sub.not());
      }
      if (op == ExprQt.Op.ONE || op == ExprQt.Op.LONE) {
         boolean ok = true;
         for(int i=0; i<xvars.size(); i++) {
            Expr v = addOne(xvars.get(i).expr).deNOP();
            if (v.type().arity()!=1 || v.mult()!=ExprUnary.Op.ONEOF) { ok=false; break; }
         }
         if (op==ExprQt.Op.ONE && ok) return ((Expression) visit_qt(ExprQt.Op.COMPREHENSION, xvars, sub)).one();
         if (op==ExprQt.Op.LONE && ok) return ((Expression) visit_qt(ExprQt.Op.COMPREHENSION, xvars, sub)).lone();
      }
      if (op == ExprQt.Op.ONE) {
         Formula f1 = (Formula) visit_qt(ExprQt.Op.LONE, xvars, sub);
         Formula f2 = (Formula) visit_qt(ExprQt.Op.SOME, xvars, sub);
         return f1.and(f2);
      }
      if (op == ExprQt.Op.LONE) {
         QuantifiedFormula p1 = (QuantifiedFormula) visit_qt(ExprQt.Op.ALL, xvars, sub);
         QuantifiedFormula p2 = (QuantifiedFormula) visit_qt(ExprQt.Op.ALL, xvars, sub);
         Decls s1 = p1.decls(), s2 = p2.decls(), decls = null;
         Formula f1 = p1.formula(), f2 = p2.formula();
         Formula[] conjuncts = new Formula[s1.size()];
         for(int i=0; i<conjuncts.length; i++) {
            kodkod.ast.Decl d1 = s1.get(i), d2 = s2.get(i);
            conjuncts[i] = d1.variable().eq(d2.variable());
            if (decls==null) decls = d1.and(d2); else decls = decls.and(d1).and(d2);
         }
         return f1.and(f2).implies(Formula.and(conjuncts)).forAll(decls);
      }
      Decls dd = null;
      List<Formula> guards = new ArrayList<Formula>();
      for(Decl dep: xvars) {
        final Expr dexexpr = addOne(dep.expr);
        final Expression dv = cset(dexexpr);
        for(ExprHasName dex: dep.names) {
           final Variable v = Variable.nary(skolem(dex.label), dex.type().arity());
           final kodkod.ast.Decl newd;
           env.put((ExprVar)dex, v);
           if (dex.type().arity()!=1) {
              guards.add(isIn(v, dexexpr));
              newd = v.setOf(dv);
           } else switch(dexexpr.mult()) {
              case SETOF: newd = v.setOf(dv); break;
              case SOMEOF: newd = v.someOf(dv); break;
              case LONEOF: newd = v.loneOf(dv); break;
              default: newd = v.oneOf(dv);
           }
View Full Code Here

      }
   }

    /** {@inheritDoc} */
    @Override public Object visit(ExprQt x) throws Err {
        Expr xx = x.desugar();
        if (xx instanceof ExprQt) x = (ExprQt)xx; else return visitThis(xx);
        Object ans = visit_qt(x.op, x.decls, x.sub);
        if (ans instanceof Formula) k2pos((Formula)ans, x);
        return ans;
    }
View Full Code Here

        // Bound the fields
        again:
        for(Sig s:sigs) {
           while (s.isOne!=null && s.getFieldDecls().size()==2 && s.getFields().size()==2 && s.getFacts().size()==1) {
              // Let's check whether this is a total ordering on an enum...
              Expr fact = s.getFacts().get(0).deNOP(), b1 = s.getFieldDecls().get(0).expr.deNOP(), b2 = s.getFieldDecls().get(1).expr.deNOP(), b3;
              if (!(fact instanceof ExprList) || !(b1 instanceof ExprUnary) || !(b2 instanceof ExprBinary)) break;
              ExprList list = (ExprList)fact;
              if (list.op!=ExprList.Op.TOTALORDER || list.args.size()!=3) break;
              if (((ExprUnary)b1).op!=ExprUnary.Op.SETOF) break; else b1 = ((ExprUnary)b1).sub.deNOP();
              if (((ExprBinary)b2).op!=ExprBinary.Op.ARROW) break; else { b3 = ((ExprBinary)b2).right.deNOP(); b2 = ((ExprBinary)b2).left.deNOP(); }
View Full Code Here

   public Expr parseOneExpressionFromString(String input) throws Err, FileNotFoundException, IOException {
      Map<String,String> fc = new LinkedHashMap<String,String>();
      fc.put("", "run {\n"+input+"}"); // We prepend the line "run{"
      CompModule m = CompParser.alloy_parseStream(new ArrayList<Object>(), null, fc, null, -1, "", "", 1);
      if (m.funcs.size()==0) throw new ErrorSyntax("The input does not correspond to an Alloy expression.");
      Expr body = m.funcs.values().iterator().next().get(0).getBody();
      Context cx = new Context(this, null);
      body = cx.check(body);
      body = body.resolve(body.type(), null);
      if (body.errors.size()>0) throw body.errors.pick(); else return body;
   }
View Full Code Here

            Func y = (Func)x;
            msg.append(y.isPred?"pred ":"fun ")
            .append(y.label).append("\n"+"at ").append(y.pos.toShortString());
         }
         else if (x instanceof Expr) {
            Expr y = (Expr)x;
            msg.append("assertion at ").append(y.pos.toShortString());
         }
      }
      throw new ErrorSyntax(pos, msg.toString());
   }
View Full Code Here

   private List<Object> getRawNQS (CompModule start, final int r, String name) {
      // (r&1)!=0 => Sig,   (r&2) != 0 => assertion,   (r&4)!=0 => Func
      List<Object> ans=new ArrayList<Object>();
      for(CompModule m:getAllNameableModules()) {
         if ((r&1)!=0) { Sig x=m.sigs.get(name); if (x!=null) if (m==start || x.isPrivate==null) ans.add(x); }
         if ((r&2)!=0) { Expr x=m.asserts.get(name); if (x!=null) ans.add(x); }
         if ((r&4)!=0) { ArrayList<Func> x=m.funcs.get(name); if (x!=null) for(Func y:x) if (m==start || y.isPrivate==null) ans.add(y); }
      }
      return ans;
   }
View Full Code Here

      if (name.startsWith("this/")) name=name.substring(5);
      for(int level=0; ;level++) {
         int i=name.indexOf('/');
         if (i<0) {
            if ((r&1)!=0) { Sig x=u.sigs.get(name); if (x!=null) if (level==0 || x.isPrivate==null) ans.add(x); }
            if ((r&2)!=0) { Expr x=u.asserts.get(name); if (x!=null) ans.add(x); }
            if ((r&4)!=0) { ArrayList<Func> x=u.funcs.get(name); if (x!=null) for(Func y:x) if (level==0 || y.isPrivate==null) ans.add(y); }
            if (ans.size()==0) return u.getRawNQS(this,r,name); // If nothing at this module, then do a non-qualified search from this module
            return ans;
         }
         String alias=name.substring(0,i);
View Full Code Here

            cx.rootfunparam = true;
            TempList<Decl> tmpdecls = new TempList<Decl>();
            boolean err = false;
            for(Decl d: f.decls) {
               TempList<ExprVar> tmpvars = new TempList<ExprVar>();
               Expr val = cx.check(d.expr).resolve_as_set(warns);
               if (!val.errors.isEmpty()) { err = true; errors = errors.make(val.errors); }
               for(ExprHasName n: d.names) {
                  ExprVar v = ExprVar.make(n.span(), n.label, val.type());
                  cx.put(n.label, v);
                  tmpvars.add(v);
                  rep.typecheck((f.isPred?"pred ":"fun ")+fullname+", Param "+n.label+": "+v.type()+"\n");
               }
               tmpdecls.add(new Decl(d.isPrivate, d.disjoint, d.disjoint2, tmpvars.makeConst(), val));
            }
            Expr ret = null;
            if (!f.isPred) {
               ret = cx.check(f.returnDecl).resolve_as_set(warns);
               if (!ret.errors.isEmpty()) { err = true; errors = errors.make(ret.errors); }
            }
            if (err) continue;
View Full Code Here

   private JoinableList<Err> resolveFuncBody(A4Reporter rep, JoinableList<Err> errors, List<ErrorWarning> warns) throws Err {
      for(ArrayList<Func> entry: funcs.values()) for(Func ff: entry) {
         Context cx = new Context(this, warns);
         cx.rootfunbody = ff;
         for(Decl d: ff.decls) for(ExprHasName n: d.names) cx.put(n.label, n);
         Expr newBody = cx.check(ff.getBody());
         if (ff.isPred) newBody = newBody.resolve_as_formula(warns); else newBody = newBody.resolve_as_set(warns);
         errors = errors.make(newBody.errors);
         if (!newBody.errors.isEmpty()) continue;
         try { ff.setBody(newBody); } catch(Err er) {errors = errors.make(er); continue;}
         if (warns!=null && ff.returnDecl.type().hasTuple() && newBody.type().hasTuple() && !newBody.type().intersects(ff.returnDecl.type()))
            warns.add(new ErrorWarning(newBody.span(),
                  "Function return value is disjoint from its return type.\n"
                  +"Function body has type "+newBody.type() + "\n" + "but the return type is "+ff.returnDecl.type()));
         //else if (warns!=null && Version.experimental && !newBody.type.isSubtypeOf(ff.returnDecl.type))
         //  warns.add(new ErrorWarning(newBody.span(),
         //      "Function may return a tuple not in its declared return type.\n"
         //      +"The Alloy Analyzer's analysis may be unsound\n"
         //      +"if it returns a tuple outside its declared return type.\n"
         //      +"Function body has type "+newBody.type+"\nbut the return type is "+ff.returnDecl.type));
         rep.typecheck(ff.toString()+", BODY:"+newBody.type()+"\n");
      }
      return errors;
   }
View Full Code Here

TOP

Related Classes of edu.mit.csail.sdg.alloy4compiler.ast.Expr

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.