7 public class NaiveGenerator {
10 java.io.PrintWriter output = null;
12 public NaiveGenerator(State state) {
16 public void generate(java.io.OutputStream output) {
17 this.output = new java.io.PrintWriter(output, true);
19 generate_hashtables();
21 generate_implicit_checks();
26 private void generate_hashtables() {
28 CodeWriter cr = new CodeWriter() {
31 public void indent() { indent++; }
32 public void unindent() { indent--; assert indent >= 0; }
33 private void doindent() {
34 for (int i = 0; i < indent; i++) {
38 public void outputline(String s) {
42 public void output(String s) { throw new IRException(); }
43 public SymbolTable getSymbolTable() { throw new IRException(); }
46 cr.outputline("// creating hashtables ");
48 /* build all the hashtables */
49 Hashtable hashtables = new Hashtable();
52 Iterator sets = state.stSets.descriptors();
54 /* first pass create all the hash tables */
55 while (sets.hasNext()) {
56 SetDescriptor set = (SetDescriptor) sets.next();
57 cr.outputline("SimpleHash* " + set.getSafeSymbol() + "_hash = new SimpleHash();");
60 /* second pass build relationships between hashtables */
61 sets = state.stSets.descriptors();
63 while (sets.hasNext()) {
64 SetDescriptor set = (SetDescriptor) sets.next();
65 Iterator subsets = set.subsets();
67 while (subsets.hasNext()) {
68 SetDescriptor subset = (SetDescriptor) subsets.next();
69 cr.outputline(subset.getSafeSymbol() + "_hash->addParent(" + set.getSafeSymbol() + "_hash);");
74 Iterator relations = state.stRelations.descriptors();
76 /* first pass create all the hash tables */
77 while (relations.hasNext()) {
78 RelationDescriptor relation = (RelationDescriptor) relations.next();
79 cr.outputline("SimpleHash* " + relation.getSafeSymbol() + "_hash = new SimpleHash();");
87 private void generate_rules() {
89 /* first we must sort the rules */
90 GraphNode.DFS.depthFirstSearch(state.rulenodes.values());
92 TreeSet topologicalsort = new TreeSet(new Comparator() {
93 public boolean equals(Object obj) { return false; }
94 public int compare(Object o1, Object o2) {
95 GraphNode g1 = (GraphNode) o1;
96 GraphNode g2 = (GraphNode) o2;
97 return g2.getFinishingTime() - g1.getFinishingTime();
101 topologicalsort.addAll(state.rulenodes.values());
103 /* build all the rules */
104 Iterator rules = topologicalsort.iterator();
106 while (rules.hasNext()) {
108 GraphNode rulenode = (GraphNode) rules.next();
109 Rule rule = (Rule) rulenode.getOwner();
113 final SymbolTable st = rule.getSymbolTable();
115 CodeWriter cr = new CodeWriter() {
116 boolean linestarted = false;
118 public void indent() { indent++; }
119 public void unindent() { indent--; assert indent >= 0; }
120 private void doindent() {
121 for (int i = 0; i < indent; i++) {
126 public void outputline(String s) {
133 public void output(String s) {
140 public SymbolTable getSymbolTable() { return st; }
143 cr.outputline("// build " + rule.getLabel());
147 ListIterator quantifiers = rule.quantifiers();
149 while (quantifiers.hasNext()) {
150 Quantifier quantifier = (Quantifier) quantifiers.next();
151 quantifier.generate_open(cr);
156 rule.getGuardExpr().prettyPrint(cr);
159 /* now we have to generate the guard test */
161 VarDescriptor guardval = VarDescriptor.makeNew();
162 rule.getGuardExpr().generate(cr, guardval);
164 cr.outputline("if (" + guardval.getSafeSymbol() + ") {");
168 /* now we have to generate the inclusion code */
169 rule.getInclusion().generate(cr);
175 while (quantifiers.hasPrevious()) {
176 Quantifier quantifier = (Quantifier) quantifiers.previous();
190 private void generate_implicit_checks() {
193 //output.println("check to make sure all relations are well typed");
194 //output.println("check multiplicity");
198 private void generate_checks() {
200 /* do constraint checks */
201 Vector constraints = state.vConstraints;
203 for (int i = 0; i < constraints.size(); i++) {
204 //output.println("check constraint " + (i + 1));
207 //output.println("report problems");