Search in sources :

Example 1 with On

use of ast.ExpCore.Block.On in project L42 by ElvisResearchGroup.

the class RenameVars method visit.

public ExpCore visit(Block s) {
    List<On> k = Map.of(this::liftO, s.getOns());
    List<On> newK = new ArrayList<>();
    for (On on : k) {
        String altK = toRename.get(on.getX());
        if (altK != null) {
            newK.add(on.withX(altK));
        } else {
            newK.add(on);
        }
    }
    List<Block.Dec> decs = new ArrayList<>();
    for (Block.Dec dec : s.getDecs()) {
        String altxi = toRename.get(dec.getX());
        if (altxi == null) {
            decs.add(dec);
        } else {
            decs.add(dec.withX(altxi));
        }
    }
    return new Block(s.getDoc(), Map.of(this::liftDec, decs), lift(s.getInner()), newK, s.getP());
}
Also used : ArrayList(java.util.ArrayList) Block(ast.ExpCore.Block) On(ast.ExpCore.Block.On)

Example 2 with On

use of ast.ExpCore.Block.On in project L42 by ElvisResearchGroup.

the class HB method visit.

@Override
public ExpCore visit(Block s) {
    ExpCore result = null;
    for (Block.Dec di : s.getDecs()) {
        result = acc(result, di.getInner().accept(this));
    }
    result = acc(result, s.getInner().accept(this));
    if (result == null && onlyAroundHole) {
        return null;
    }
    assert !onlyAroundHole || result instanceof WalkBy : onlyAroundHole + " " + result;
    for (Block.Dec dec : s.getDecs()) {
        if (xs.contains(dec.getX())) {
            throw new ErrorMessage.VariableDeclaredMultipleTimes(dec.getX(), s.getP());
        }
        this.xs.add(dec.getX());
        this.xsRes.add(dec.getX());
    }
    try {
        if (!onlyAroundHole && !s.getOns().isEmpty()) {
            for (On on : s.getOns()) {
                if (xs.contains(on.getX())) {
                    throw new ErrorMessage.VariableDeclaredMultipleTimes(on.getX(), s.getP());
                }
                xs.add(on.getX());
                xsRes.add(on.getX());
                on.getInner().accept(this);
                xs.remove(on.getX());
            }
        }
        return result;
    } finally {
        for (Block.Dec dec : s.getDecs()) {
            this.xs.remove(dec.getX());
        }
    }
}
Also used : ExpCore(ast.ExpCore) Block(ast.ExpCore.Block) WalkBy(ast.ExpCore.WalkBy) On(ast.ExpCore.Block.On)

Example 3 with On

use of ast.ExpCore.Block.On in project L42 by ElvisResearchGroup.

the class TranslateExpression method getCatches.

private void getCatches(List<On> c, String asReturn, String kLab) {
    assert !c.isEmpty();
    SignalKind kind = c.get(0).getKind();
    boolean allEq = true;
    for (On on : c) {
        if (on.getKind() != kind) {
            allEq = false;
        }
    }
    //TODO: for now ok, then we will capture a more general exception on need.
    assert allEq;
    String kVar = Functions.freshName("K", TranslateExpression.labels);
    res.append("catch(platformSpecific.javaTranslation.Resources." + kind.name() + " " + kVar);
    res.append("){\n");
    for (On on : c) {
        getCatch(kVar, on, asReturn, kLab);
    }
    res.append("{}/*ensure termination*/throw " + kVar);
    res.append(";\n}\n");
}
Also used : SignalKind(ast.Ast.SignalKind) On(ast.ExpCore.Block.On)

Example 4 with On

use of ast.ExpCore.Block.On in project L42 by ElvisResearchGroup.

the class TsBlock method tsBlockBase.

default default TOut tsBlockBase(TIn in, Block s) {
    //Phase| p| G |- (ds  ks  e0  [_]) ~>(ds' ks' e'0 [T]) 
    //     : T <= T' | Tr'.capture(p,ks') U Tr U Tr0
    List<Block.Dec> ds = s.getDecs();
    List<Block.On> ks = s.getOns();
    //G'=G/dom(ds)
    TIn in1 = in.removeGDs(ds);
    //G'[ks]
    TIn in2 = in1.gKs(ks);
    //Phase| p| G'[ks] |- ds ~> ds' |Tr' | G0
    TOutDs _dsOut = dsType(in2, ds);
    if (!_dsOut.isOk()) {
        TErr err = _dsOut.toError();
        if (!err.kind.needContext) {
            return err;
        }
        //was locked by error safety[cite the line number of the catch]
        return err;
    }
    TOkDs dsOk = _dsOut.toOkDs();
    //Phase| p| G'| Tr' |- ks~> ks' : Ts <= T' | Tr
    TOutKs _ksOut = ksType(in1, dsOk.trAcc, ks);
    if (!_ksOut.isOk()) {
        return _ksOut.toError();
    }
    TOkKs ksOk = _ksOut.toOkKs();
    //now resolved
    ks = ksOk.ks;
    //Phase| p| G'[G0\dom(G')] |- e0~>e'0:T0 <=T' | Tr0
    G G0LessG1 = dsOk.g.removeGXs(in1.g.keySet());
    TOut _e0Out = type(in1.addGG(G0LessG1).withE(s.getE(), in.expected));
    if (!_e0Out.isOk()) {
        return _e0Out.toError();
    }
    TOk e0Ok = _e0Out.toOk();
    //T= mostGeneralMdf({T0.mdf,Ts.mdfs}) T'.P //set of Mdfs admits no single most general mdf
    Set<Mdf> mdfs = new HashSet<>();
    for (Type nt : ksOk.ts) {
        mdfs.add(nt.getMdf());
    }
    mdfs.add(e0Ok.computed.getMdf());
    Mdf tMdf = TypeManipulation._mostGeneralMdf(mdfs);
    if (tMdf == null) {
        return new TErr(in, "", e0Ok.computed, ErrorKind.NoMostGeneralMdf);
    }
    Type t = new Type(tMdf, in.expected.getPath(), Doc.empty());
    assert null == TypeSystem.subtype(in.p, t, in.expected);
    Block annotated = new Block(s.getDoc(), dsOk.ds, e0Ok.annotated, ksOk.ks, s.getP());
    TOk res = new TOk(in, annotated, t);
    // result Tr: Tr'.capture(p,ks') U Tr U Tr0
    Tr trCaptured = dsOk.trAcc;
    for (On k : ks) {
        trCaptured = trCaptured.trCapture(in.p, k);
    }
    Tr trUnion = trCaptured.trUnion(ksOk.trAcc).trUnion(e0Ok);
    res = res.trUnion(trUnion);
    return res;
}
Also used : Dec(ast.ExpCore.Block.Dec) Mdf(ast.Ast.Mdf) Type(ast.Ast.Type) Block(ast.ExpCore.Block) On(ast.ExpCore.Block.On) HashSet(java.util.HashSet)

Example 5 with On

use of ast.ExpCore.Block.On in project L42 by ElvisResearchGroup.

the class TsBlock method ksType.

default default TOutKs ksType(TIn in, Tr trAcc, List<On> ks) {
    //     forall i in 1..n D| Tr.capture(D.p,k1..ki-1)|-ki ~> k'i:Ti <= T |Tri
    assert trAcc != null;
    Tr tr = trAcc;
    Tr newTrAcc = Tr.instance;
    List<On> ks1 = new ArrayList<>();
    List<Type> ts = new ArrayList<>();
    for (On k : ks) {
        TOutK out = kType(in, tr, k);
        if (!out.isOk()) {
            return out.toError();
        }
        TOkK ok = out.toOkK();
        ks1.add(ok.k);
        ts.add(ok.t);
        newTrAcc = newTrAcc.trUnion(ok.tr);
    }
    TOkKs res = new TOkKs(newTrAcc, ks1, ts);
    return res;
}
Also used : Type(ast.Ast.Type) ArrayList(java.util.ArrayList) On(ast.ExpCore.Block.On)

Aggregations

On (ast.ExpCore.Block.On)9 Block (ast.ExpCore.Block)5 Type (ast.Ast.Type)4 ArrayList (java.util.ArrayList)4 Dec (ast.ExpCore.Block.Dec)3 ExpCore (ast.ExpCore)2 MethodWithType (ast.ExpCore.ClassB.MethodWithType)2 Mdf (ast.Ast.Mdf)1 MethodType (ast.Ast.MethodType)1 SignalKind (ast.Ast.SignalKind)1 MCall (ast.ExpCore.MCall)1 Signal (ast.ExpCore.Signal)1 Using (ast.ExpCore.Using)1 WalkBy (ast.ExpCore.WalkBy)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1