Skip to content

Commit

Permalink
fix bug in or patterns when used outside of a rewrite (#340)
Browse files Browse the repository at this point in the history
* fix bug in or patterns when used outside of a rewrite

* expand macros prior to GuardOrPatterns

* support anonymous variables in or patterns
  • Loading branch information
dwightguth committed Mar 8, 2019
1 parent 1a38233 commit 3e98406
Show file tree
Hide file tree
Showing 14 changed files with 140 additions and 13 deletions.
1 change: 1 addition & 0 deletions k-distribution/tests/regression-new/or-llvm/4.test
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
test(foo)
3 changes: 3 additions & 0 deletions k-distribution/tests/regression-new/or-llvm/4.test.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<k>
2 ~> test ( foo )
</k>
1 change: 1 addition & 0 deletions k-distribution/tests/regression-new/or-llvm/5.test
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
test(bar)
3 changes: 3 additions & 0 deletions k-distribution/tests/regression-new/or-llvm/5.test.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<k>
2 ~> test ( bar )
</k>
1 change: 1 addition & 0 deletions k-distribution/tests/regression-new/or-llvm/6.test
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
test(test2(baz,baz))
3 changes: 3 additions & 0 deletions k-distribution/tests/regression-new/or-llvm/6.test.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<k>
1
</k>
1 change: 1 addition & 0 deletions k-distribution/tests/regression-new/or-llvm/7.test
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
test(test(test2(baz,baz)))
3 changes: 3 additions & 0 deletions k-distribution/tests/regression-new/or-llvm/7.test.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<k>
1
</k>
4 changes: 3 additions & 1 deletion k-distribution/tests/regression-new/or-llvm/test.k
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ module TEST
imports INT
imports BOOL

syntax KItem ::= "foo" | "bar" | "baz"
syntax KItem ::= "foo" | "bar" | "baz" | test(K) | test2(K, K)
rule foo #Or bar #Or baz => 0
rule (.K => 2) ~> test(foo #Or bar)
rule test(test2(baz,_) #Or test(test2(baz,_))) => 1

endmodule
10 changes: 0 additions & 10 deletions k-distribution/tests/regression-new/or-ocaml/test.k

This file was deleted.

1 change: 1 addition & 0 deletions k-distribution/tests/regression-new/or-ocaml/test.k
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.kframework.compile.GeneratedTopFormat;
import org.kframework.compile.GenerateSortPredicateRules;
import org.kframework.compile.GenerateSortPredicateSyntax;
import org.kframework.compile.GuardOrPatterns;
import org.kframework.compile.LabelInfo;
import org.kframework.compile.LabelInfoFromModule;
import org.kframework.compile.MinimizeTermConstruction;
Expand Down Expand Up @@ -112,6 +113,7 @@ public Function<Definition, Definition> steps() {
DefinitionTransformer resolveStrict = DefinitionTransformer.from(new ResolveStrict(kompileOptions)::resolve, "resolving strict and seqstrict attributes");
DefinitionTransformer resolveHeatCoolAttribute = DefinitionTransformer.fromSentenceTransformer(new ResolveHeatCoolAttribute(new HashSet<>(kompileOptions.transition), heatCoolConditions)::resolve, "resolving heat and cool attributes");
DefinitionTransformer resolveAnonVars = DefinitionTransformer.fromSentenceTransformer(new ResolveAnonVar()::resolve, "resolving \"_\" vars");
DefinitionTransformer guardOrs = DefinitionTransformer.fromSentenceTransformer(new GuardOrPatterns()::resolve, "resolving or patterns");
DefinitionTransformer resolveSemanticCasts =
DefinitionTransformer.fromSentenceTransformer(new ResolveSemanticCasts(true)::resolve, "resolving semantic casts");
DefinitionTransformer resolveFun = DefinitionTransformer.from(new ResolveFun()::resolve, "resolving #fun");
Expand All @@ -132,6 +134,7 @@ public Function<Definition, Definition> steps() {
.andThen(resolveHeatCoolAttribute)
.andThen(resolveSemanticCasts)
.andThen(expandMacros)
.andThen(guardOrs)
.andThen(generateSortPredicateSyntax)
.andThen(AddImplicitComputationCell::transformDefinition)
.andThen(resolveFreshConstants)
Expand Down
103 changes: 103 additions & 0 deletions kernel/src/main/java/org/kframework/compile/GuardOrPatterns.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
// Copyright (c) 2019 K Team. All Rights Reserved.
package org.kframework.compile;

import org.kframework.builtin.KLabels;
import org.kframework.definition.Context;
import org.kframework.definition.Production;
import org.kframework.definition.Rule;
import org.kframework.definition.Sentence;
import org.kframework.kore.*;

import java.util.HashSet;
import java.util.Set;

import static org.kframework.kore.KORE.*;

public class GuardOrPatterns {

private Set<KVariable> vars = new HashSet<>();

void resetVars() {
vars.clear();
}

private Rule resolve(Rule rule) {
resetVars();
gatherVars(rule.body());
gatherVars(rule.requires());
gatherVars(rule.ensures());
return new Rule(
transform(rule.body()),
transform(rule.requires()),
transform(rule.ensures()),
rule.att());
}

private Context resolve(Context context) {
resetVars();
gatherVars(context.body());
gatherVars(context.requires());
return new Context(
transform(context.body()),
transform(context.requires()),
context.att());
}

public K resolveK(K k) {
resetVars();;
gatherVars(k);
return transform(k);
}

public synchronized Sentence resolve(Sentence s) {
if (s instanceof Rule) {
return resolve((Rule) s);
} else if (s instanceof Context) {
return resolve((Context) s);
} else {
return s;
}
}

void gatherVars(K term) {
new VisitK() {
@Override
public void apply(KVariable v) {
vars.add(v);
super.apply(v);
}
}.apply(term);
}

K transform(K term) {
return new TransformK() {
@Override
public K apply(KApply k) {
if (k.klabel().equals(KLabels.ML_OR)) {
return KAs(k, newDotVariable());
}
return super.apply(k);
}

@Override
public K apply(KAs k) {
return k;
}

@Override
public K apply(KRewrite k) {
return KRewrite(k.left(), apply(k.right()), k.att());
}
}.apply(term);
}

private int counter = 0;
KVariable newDotVariable() {
KVariable newLabel;
do {
newLabel = KVariable("_" + (counter++), Att().add("anonymous"));
} while (vars.contains(newLabel));
vars.add(newLabel);
return newLabel;
}
}
4 changes: 4 additions & 0 deletions kernel/src/main/java/org/kframework/kompile/Kompile.java
Original file line number Diff line number Diff line change
Expand Up @@ -152,12 +152,14 @@ public static Function<Definition, Definition> defaultSteps(KompileOptions kompi
DefinitionTransformer resolveStrict = DefinitionTransformer.from(new ResolveStrict(kompileOptions)::resolve, "resolving strict and seqstrict attributes");
DefinitionTransformer resolveHeatCoolAttribute = DefinitionTransformer.fromSentenceTransformer(new ResolveHeatCoolAttribute(new HashSet<>(kompileOptions.transition), EnumSet.of(HEAT_RESULT, COOL_RESULT_CONDITION, COOL_RESULT_INJECTION))::resolve, "resolving heat and cool attributes");
DefinitionTransformer resolveAnonVars = DefinitionTransformer.fromSentenceTransformer(new ResolveAnonVar()::resolve, "resolving \"_\" vars");
DefinitionTransformer guardOrs = DefinitionTransformer.fromSentenceTransformer(new GuardOrPatterns()::resolve, "resolving or patterns");
DefinitionTransformer resolveSemanticCasts =
DefinitionTransformer.fromSentenceTransformer(new ResolveSemanticCasts(kompileOptions.backend.equals(Backends.JAVA))::resolve, "resolving semantic casts");
DefinitionTransformer resolveFun = DefinitionTransformer.from(new ResolveFun()::resolve, "resolving #fun");
DefinitionTransformer resolveFunctionWithConfig = DefinitionTransformer.fromSentenceTransformer(new ResolveFunctionWithConfig()::resolve, "resolving functions with config context");
DefinitionTransformer generateSortPredicateSyntax = DefinitionTransformer.from(new GenerateSortPredicateSyntax()::gen, "adding sort predicate productions");
DefinitionTransformer subsortKItem = DefinitionTransformer.from(Kompile::subsortKItem, "subsort all sorts to KItem");
DefinitionTransformer expandMacros = DefinitionTransformer.fromSentenceTransformer((m, s) -> new ExpandMacros(m, files, kompileOptions, false).expand(s), "expand macros");
GenerateCoverage cov = new GenerateCoverage(kompileOptions.coverage, files);
DefinitionTransformer genCoverage = DefinitionTransformer.fromRuleBodyTransformerWithRule(cov::gen, "generate coverage instrumentation");
DefinitionTransformer numberSentences = DefinitionTransformer.fromSentenceTransformer(new NumberSentences()::number, "number sentences uniquely");
Expand All @@ -173,6 +175,8 @@ public static Function<Definition, Definition> defaultSteps(KompileOptions kompi
.andThen(numberSentences)
.andThen(resolveHeatCoolAttribute)
.andThen(resolveSemanticCasts)
.andThen(expandMacros)
.andThen(guardOrs)
.andThen(generateSortPredicateSyntax)
.andThen(Kompile::resolveFreshConstants)
.andThen(AddImplicitComputationCell::transformDefinition)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2700,7 +2700,11 @@ private void applyVarRhs(String varOccurrance, StringBuilder sb, KLabel listVar)
}
}

private void applyVarLhs(KVariable k, StringBuilder sb, VarInfo vars) {
private void applyVarLhs(KVariable k, StringBuilder sb, VarInfo vars, boolean inOr) {
if (inOr && k.att().contains("anonymous")) {
sb.append("_");
return;
}
String varName = encodeStringToVariable(k.name());
vars.vars.put(k, varName);
Sort s = k.att().getOptional(Sort.class).orElse(Sort(""));
Expand Down Expand Up @@ -2737,6 +2741,7 @@ public Visitor(StringBuilder sb, boolean rhs, VarInfo vars, boolean useNativeBoo
private boolean inBooleanExp;
private boolean topAnywherePre;
private boolean topAnywherePost;
private boolean inOr = false;

@Override
public void apply(KApply k) {
Expand All @@ -2757,9 +2762,12 @@ public void apply(KApply k) {
}
if (k.klabel().equals(KLabels.ML_OR)) {
sb.append("((");
boolean wasInOr = inOr;
inOr = true;
apply(k.items().get(0));
sb.append(")|(");
apply(k.items().get(1));
inOr = wasInOr;
sb.append("))");
return;
}
Expand Down Expand Up @@ -3040,7 +3048,7 @@ public void apply(KVariable k) {
if (rhs) {
applyVarRhs(k, sb, vars);
} else {
applyVarLhs(k, sb, vars);
applyVarLhs(k, sb, vars, inOr);
}
if (inBooleanExp) {
sb.append("])");
Expand Down

0 comments on commit 3e98406

Please sign in to comment.