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());
}
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());
}
}
}
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");
}
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;
}
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;
}
Aggregations