-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathToJson.java
125 lines (98 loc) · 3.78 KB
/
ToJson.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// Copyright (c) 2015-2018 K Team. All Rights Reserved.
package org.kframework.unparser;
import org.kframework.kore.InjectedKLabel;
import org.kframework.kore.K;
import org.kframework.kore.KApply;
import org.kframework.kore.KRewrite;
import org.kframework.kore.KSequence;
import org.kframework.kore.KToken;
import org.kframework.kore.KVariable;
import org.kframework.parser.json.JsonParser;
import org.kframework.utils.errorsystem.KEMException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.DataOutputStream;
import java.io.ByteArrayOutputStream;
import java.util.Map;
import java.util.HashMap;
import javax.json.Json;
import javax.json.stream.JsonGenerator;
import javax.json.JsonWriterFactory;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonWriter;
import javax.json.JsonStructure;
/**
* Writes a KAST term to the KAST Json format.
*/
public class ToJson {
public static void apply(OutputStream out, K k) {
try {
DataOutputStream data = new DataOutputStream(out);
JsonWriter jsonWriter = Json.createWriter(data);
JsonObjectBuilder kterm = Json.createObjectBuilder();
kterm.add("format", "KAST");
kterm.add("version", 1);
kterm.add("term", toJson(k));
jsonWriter.write(kterm.build());
jsonWriter.close();
data.close();
} catch (IOException e) {
throw KEMException.criticalError("Could not write K term to Json", e, k);
}
}
public static byte[] apply(K k) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
apply(out, k);
return out.toByteArray();
}
private DataOutputStream data;
private ToJson(DataOutputStream data) {
this.data = data;
}
private static JsonStructure toJson(K k) {
JsonObjectBuilder knode = Json.createObjectBuilder();
if (k instanceof KToken) {
KToken tok = (KToken) k;
knode.add("node", JsonParser.KTOKEN);
knode.add("sort", tok.sort().toString());
knode.add("token", tok.s());
} else if (k instanceof KApply) {
KApply app = (KApply) k;
knode.add("node", JsonParser.KAPPLY);
knode.add("label", app.klabel().name());
knode.add("variable", app.klabel() instanceof KVariable);
JsonArrayBuilder args = Json.createArrayBuilder();
for (K item : app.klist().asIterable()) {
args.add(toJson(item));
}
knode.add("arity", app.klist().size());
knode.add("args", args.build());
} else if (k instanceof KSequence) {
KSequence seq = (KSequence) k;
knode.add("node", JsonParser.KSEQUENCE);
JsonArrayBuilder items = Json.createArrayBuilder();
for (K item : seq.asIterable()) {
items.add(toJson(item));
}
knode.add("arity", seq.size());
knode.add("items", items.build());
} else if (k instanceof KVariable) {
KVariable var = (KVariable) k;
knode.add("node", JsonParser.KVARIABLE);
knode.add("name", var.toString());
} else if (k instanceof KRewrite) {
KRewrite rew = (KRewrite) k;
knode.add("node", JsonParser.KREWRITE);
knode.add("lhs", toJson(rew.left()));
knode.add("rhs", toJson(rew.right()));
knode.add("att", rew.att().toString());
} else if (k instanceof InjectedKLabel) {
InjectedKLabel inj = (InjectedKLabel) k;
knode.add("node", JsonParser.INJECTEDKLABEL);
knode.add("name", inj.klabel().name());
}
return knode.build();
}
}