Skip to content

Commit 4ba67b8

Browse files
author
dwightguth
committed
Merge branch 'master' into nailgun-passwd
2 parents 2c524aa + b6d2eb4 commit 4ba67b8

65 files changed

Lines changed: 1870 additions & 2835 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

java-backend/src/main/java/org/kframework/backend/java/compile/KOREtoBackendKIL.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ public KApply KApply(KLabel klabel, org.kframework.kore.KList klist, Att att) {
9999
* TODO: rename the method to KApply when the backend fully implements KORE
100100
*/
101101
public Term KApply1(org.kframework.kore.KLabel klabel, org.kframework.kore.KList klist, Att att) {
102+
if (!(klabel instanceof KVariable))
103+
klabel = org.kframework.kore.KORE.KLabel(klabel.name());
102104
if (klabel.name().equals(KLabels.KREWRITE)) {
103105
return convertKRewrite(klabel, klist);
104106
}

java-backend/src/main/java/org/kframework/backend/java/symbolic/JavaBackend.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,20 @@
33

44
import com.google.inject.Inject;
55
import org.kframework.AddConfigurationRecoveryFlags;
6+
import org.kframework.Collections;
67
import org.kframework.attributes.Att;
78
import org.kframework.backend.java.kore.compile.ExpandMacrosDefinitionTransformer;
89
import org.kframework.compile.AddBottomSortForListsWithIdenticalLabels;
910
import org.kframework.compile.NormalizeKSeq;
1011
import org.kframework.compile.ConfigurationInfoFromModule;
1112
import org.kframework.definition.Constructors;
13+
import org.kframework.definition.Constructors$;
1214
import org.kframework.definition.Definition;
1315
import org.kframework.definition.DefinitionTransformer;
1416
import org.kframework.definition.Module;
17+
import org.kframework.definition.ModuleComment;
18+
import org.kframework.definition.ModuleTransformer;
19+
import org.kframework.definition.Production;
1520
import org.kframework.definition.Rule;
1621
import org.kframework.definition.Sentence;
1722
import org.kframework.kompile.CompiledDefinition;
@@ -42,9 +47,10 @@
4247

4348
import java.util.HashMap;
4449
import java.util.Map;
50+
import java.util.stream.Stream;
4551
import java.util.function.Function;
4652

47-
import static org.kframework.definition.Constructors.Att;
53+
import static org.kframework.definition.Constructors.*;
4854

4955
public class JavaBackend implements Backend {
5056

@@ -65,6 +71,22 @@ public JavaBackend(KExceptionManager kem, FileUtil files, GlobalOptions globalOp
6571
this.kompileOptions = kompileOptions;
6672
}
6773

74+
private Module transformListItemProduction(Module m) {
75+
//GIANT UGLY HACK because Andrei implemented lists really weirdly.
76+
if (!m.name().equals("LIST")) {
77+
return m;
78+
}
79+
return Module(m.name(), m.imports(), org.kframework.Collections.stream(m.localSentences()).flatMap(s -> {
80+
if (s instanceof Production) {
81+
Production p = (Production) s;
82+
if (p.att().<String>getOptional("hook").orElse("").equals("LIST.element")) {
83+
return Stream.of(new ModuleComment("dummy", Att()), Production(p.sort(), p.items(), p.att().remove("hook").remove("function")));
84+
}
85+
}
86+
return Stream.of(s);
87+
}).collect(Collections.toSet()), m.att());
88+
}
89+
6890
/**
6991
* @param the generic {@link Kompile}
7092
* @return the special steps for the Java backend
@@ -80,7 +102,8 @@ public Function<Definition, Definition> steps(Kompile kompile) {
80102
.andThen(convertDataStructureToLookup::apply);
81103
}
82104

83-
return d -> (func((Definition dd) -> kompile.defaultSteps().apply(dd)))
105+
return d -> DefinitionTransformer.from(m -> transformListItemProduction(m), "fix weirdness with ListItem")
106+
.andThen(func((Definition dd) -> kompile.defaultSteps().apply(dd)))
84107
.andThen(DefinitionTransformer.fromRuleBodyTranformer(RewriteToTop::bubbleRewriteToTopInsideCells, "bubble out rewrites below cells"))
85108
.andThen(DefinitionTransformer.from(new NormalizeAssoc(KORE.c()), "convert assoc/comm to assoc"))
86109
.andThen(DefinitionTransformer.from(AddBottomSortForListsWithIdenticalLabels.singleton(), "AddBottomSortForListsWithIdenticalLabels"))

java-backend/src/main/java/org/kframework/backend/java/symbolic/ProofExecutionMode.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
package org.kframework.backend.java.symbolic;
33

44
import com.google.inject.Inject;
5-
import org.kframework.rewriter.Rewriter;
65
import org.kframework.RewriterResult;
76
import org.kframework.compile.ConfigurationInfo;
87
import org.kframework.compile.ConfigurationInfoFromModule;
@@ -21,9 +20,11 @@
2120
import org.kframework.kore.KToken;
2221
import org.kframework.kore.KVariable;
2322
import org.kframework.kore.TransformK;
23+
import org.kframework.krun.KRun;
2424
import org.kframework.krun.KRunOptions;
2525
import org.kframework.krun.modes.ExecutionMode;
2626
import org.kframework.main.GlobalOptions;
27+
import org.kframework.rewriter.Rewriter;
2728
import org.kframework.utils.Stopwatch;
2829
import org.kframework.utils.errorsystem.KExceptionManager;
2930
import org.kframework.utils.file.FileUtil;
@@ -60,11 +61,11 @@ public ProofExecutionMode(KExceptionManager kem, KRunOptions options, Stopwatch
6061
}
6162

6263
@Override
63-
public List<K> execute(K k, Rewriter rewriter, CompiledDefinition compiledDefinition) {
64+
public List<K> execute(KRun.InitialConfiguration k, Rewriter rewriter, CompiledDefinition compiledDefinition) {
6465
String proofFile = options.experimental.prove;
6566
Kompile kompile = new Kompile(compiledDefinition.kompileOptions, globalOptions, files, kem, sw, false);
6667
Module mod = kompile.parseModule(compiledDefinition, files.resolveWorkingDirectory(proofFile).getAbsoluteFile());
67-
RewriterResult executionResult = rewriter.execute(k, Optional.<Integer>empty());
68+
RewriterResult executionResult = rewriter.execute(k.theConfig, Optional.<Integer>empty());
6869

6970
ConfigurationInfo configurationInfo = new ConfigurationInfoFromModule(compiledDefinition.executionModule());
7071
AbstractKTransformer<Map<String, K>> cellPlaceholderSubstitutionCollector = new AbstractKTransformer<Map<String, K>>() {

k-distribution/include/builtin/domains.k

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ module LIST
171171
syntax List ::= ".List" [function, hook(LIST.unit), smtlib(smt_seq_nil), latex(\dotCt{List})]
172172
//| "."
173173
/*@ Construct a singleton List (a list with only one element) */
174-
syntax List ::= ListItem(K) [smtlib(smt_seq_elem)]
174+
syntax List ::= ListItem(K) [function, hook(LIST.element), smtlib(smt_seq_elem)]
175175

176176
/*@ Get an element form the List by index. Positive indices mean from the
177177
beginning (0 is the first element), and negative indices mean from the end
@@ -448,6 +448,8 @@ module STRING
448448
syntax String ::= categoryChar(String) [function, hook(STRING.category)]
449449
| directionalityChar(String) [function, hook(STRING.directionality)]
450450

451+
syntax String ::= "newUUID" [function, hook(STRING.uuid), impure]
452+
451453
rule S1:String <=String S2:String => notBool (S2 <String S1)
452454
rule S1:String >String S2:String => S2 <String S1
453455
rule S1:String >=String S2:String => notBool (S1 <String S2)

k-distribution/include/ocaml/lexer.mll

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,27 @@ rule token = parse
2323
| eof { EOF }
2424

2525
{
26+
27+
module Dynarray = struct
28+
type 'a t = { mutable size: int;
29+
mutable arr: 'a array;
30+
default: 'a }
31+
let empty default = { size=0; arr=Array.make 10 default; default=default }
32+
let length arr = arr.size
33+
let get arr idx = Array.get arr.arr idx
34+
let add arr str =
35+
let idx = arr.size in
36+
arr.size <- idx + 1;
37+
(if idx = Array.length arr.arr then
38+
let new_arr = Array.make (idx * 2) arr.default in
39+
Array.blit arr.arr 0 new_arr 0 idx;
40+
arr.arr <- new_arr
41+
else ());
42+
Array.set arr.arr idx str
43+
end
44+
45+
type 'a dynarray = 'a Dynarray.t
46+
2647
let parse_k (str: string) =
2748
let lexbuf = Lexing.from_string str in Parser.top token lexbuf
2849

@@ -41,7 +62,7 @@ let parse_k_binary_int (s: char Stream.t) : int =
4162
let four = Char.code (Stream.next s) in
4263
(((((one * 256) + two) * 256) + three) * 256) + four
4364

44-
let parse_k_binary_string (s: char Stream.t) (interns: string list ref) : string =
65+
let parse_k_binary_string (s: char Stream.t) (interns: string dynarray) : string =
4566
let idx_in_interns = parse_k_binary_int s in
4667
if idx_in_interns = 0 then
4768
let len = parse_k_binary_int s in
@@ -51,30 +72,33 @@ let parse_k_binary_string (s: char Stream.t) (interns: string list ref) : string
5172
Bytes.set bytes i (Stream.next s)
5273
done;
5374
let str = Bytes.to_string bytes in
54-
interns := !interns @ [str];
75+
Dynarray.add interns str;
5576
str
5677
else
57-
List.nth !interns ((List.length !interns) - idx_in_interns)
78+
Dynarray.get interns ((Dynarray.length interns) - idx_in_interns)
5879

59-
let rec parse_k_binary_term (s: char Stream.t) (stack: k Stack.t) (interns: string list ref) : k =
80+
let rec parse_k_binary_term (s: char Stream.t) (stack: k Stack.t) (interns: string dynarray) (k_interns: k dynarray) : k =
6081
match Char.code (Stream.next s) with
6182
| 1 -> (* ktoken *)
6283
let str = parse_k_binary_string s interns in
6384
let sort = parse_k_binary_string s interns in
6485
Stack.push [ktoken(parse_sort sort)(str)] stack;
65-
parse_k_binary_term s stack interns
86+
Dynarray.add k_interns (Stack.top stack);
87+
parse_k_binary_term s stack interns k_interns
6688
| 2 -> (* kapply *)
6789
let lbl = parse_k_binary_string s interns in
6890
ignore(Stream.next s);
6991
let arity = parse_k_binary_int s in
7092
let items = parse_k_binary_stack stack arity [] in
7193
Stack.push (Def.eval (KApply((parse_klabel lbl), items)) []) stack;
72-
parse_k_binary_term s stack interns
94+
Dynarray.add k_interns (Stack.top stack);
95+
parse_k_binary_term s stack interns k_interns
7396
| 3 -> (* ksequence *)
7497
let arity = parse_k_binary_int s in
7598
let items = parse_k_binary_stack stack arity [] in
7699
Stack.push (List.flatten items) stack;
77-
parse_k_binary_term s stack interns
100+
Dynarray.add k_interns (Stack.top stack);
101+
parse_k_binary_term s stack interns k_interns
78102
| 4 -> (* kvariable *)
79103
failwith "Unsupported: Variables in subject"
80104
| 5 -> (* krewrite *)
@@ -83,17 +107,23 @@ let rec parse_k_binary_term (s: char Stream.t) (stack: k Stack.t) (interns: stri
83107
let lbl = parse_k_binary_string s interns in
84108
ignore(Stream.next s);
85109
Stack.push [InjectedKLabel (parse_klabel lbl)] stack;
86-
parse_k_binary_term s stack interns
110+
Dynarray.add k_interns (Stack.top stack);
111+
parse_k_binary_term s stack interns k_interns
87112
| 7 -> (* end *)
88113
Stack.pop stack
114+
| 8 -> (* back reference *)
115+
let idx = parse_k_binary_int s in
116+
Stack.push (Dynarray.get k_interns ((Dynarray.length k_interns) - idx)) stack;
117+
Dynarray.add k_interns (Stack.top stack);
118+
parse_k_binary_term s stack interns k_interns
89119
| _ -> failwith "Unexpected term code in binary KAST"
90120

91121
let parse_k_binary (s: char Stream.t) : k =
92122
if Stream.npeek 5 s <> ['\x7f'; 'K'; 'A'; 'S'; 'T'] then failwith "Invalid binary KAST" else
93123
for i = 1 to 5 do Stream.junk s done;
94-
if Stream.npeek 3 s <> ['\x04'; '\x00'; '\x00'] then failwith "Unsupported KAST version" else
124+
if Stream.npeek 3 s <> ['\x04'; '\x00'; '\x01'] && Stream.npeek 3 s <> ['\x04'; '\x00'; '\x00'] then failwith "Unsupported KAST version" else
95125
for i = 1 to 3 do Stream.junk s done;
96-
parse_k_binary_term s (Stack.create ()) (ref [])
126+
parse_k_binary_term s (Stack.create ()) (Dynarray.empty "") (Dynarray.empty [Bottom])
97127

98128
let parse_k_binary_string (s: string) : k =
99129
parse_k_binary (Stream.of_string s)

0 commit comments

Comments
 (0)