forked from runtimeverification/k
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathConcretizeCells.java
More file actions
79 lines (69 loc) · 3.17 KB
/
ConcretizeCells.java
File metadata and controls
79 lines (69 loc) · 3.17 KB
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
// Copyright (c) 2015-2019 K Team. All Rights Reserved.
package org.kframework.compile;
import org.kframework.compile.ConfigurationInfo;
import org.kframework.compile.ConfigurationInfoFromModule;
import org.kframework.compile.LabelInfo;
import org.kframework.compile.LabelInfoFromModule;
import org.kframework.definition.*;
import org.kframework.definition.Module;
/**
* Apply the configuration concretization process.
* The implicit {@code <k>} cell is added by another stage, AddImplicitComputationCell.
* <p>
* The input may freely use various configuration abstractions
* and Full K flexibilites. See {@link IncompleteCellUtils} for a
* description of the expected term structure.
* The output will represent cells in
* strict accordance with their declared fixed-arity productions.
* <p>
* This is a simple composition of the
* {@link AddTopCellToRules}, {@link AddParentCells},
* {@link CloseCells}, and {@link SortCells} passes,
* see their documentation for details on the transformations.
*/
public class ConcretizeCells {
final ConfigurationInfo configurationInfo;
final LabelInfo labelInfo;
final SortInfo sortInfo;
final Module module;
final AddParentCells addParentCells;
final CloseCells closeCells;
final SortCells sortCells;
private final AddTopCellToRules addRootCell;
public static Definition transformDefinition(Definition input) {
ConfigurationInfoFromModule configInfo = new ConfigurationInfoFromModule(input.mainModule());
LabelInfo labelInfo = new LabelInfoFromModule(input.mainModule());
SortInfo sortInfo = SortInfo.fromModule(input.mainModule());
return DefinitionTransformer.fromSentenceTransformer(
new ConcretizeCells(configInfo, labelInfo, sortInfo, input.mainModule())::concretize,
"concretizing configuration"
).apply(input);
}
public static Module transformModule(Module mod) {
ConfigurationInfoFromModule configInfo = new ConfigurationInfoFromModule(mod);
LabelInfo labelInfo = new LabelInfoFromModule(mod);
SortInfo sortInfo = SortInfo.fromModule(mod);
return ModuleTransformer.fromSentenceTransformer(
new ConcretizeCells(configInfo, labelInfo, sortInfo, mod)::concretize,
"concretizing configuration").apply(mod);
}
public ConcretizeCells(ConfigurationInfo configurationInfo, LabelInfo labelInfo, SortInfo sortInfo, Module module) {
this.configurationInfo = configurationInfo;
this.labelInfo = labelInfo;
this.sortInfo = sortInfo;
this.module = module;
addRootCell = new AddTopCellToRules(configurationInfo, labelInfo);
addParentCells = new AddParentCells(configurationInfo, labelInfo);
closeCells = new CloseCells(configurationInfo, sortInfo, labelInfo);
sortCells = new SortCells(configurationInfo, labelInfo, module);
}
public Sentence concretize(Sentence s) {
s = addRootCell.addImplicitCells(s);
s = addParentCells.concretize(s);
s = closeCells.close(s);
s = sortCells.preprocess(s);
s = sortCells.sortCells(s);
s = sortCells.postprocess(s);
return s;
}
}