]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/parser/generator/table/ParseTable.java
Moved SCL parser generator to platform repository.
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / parser / generator / table / ParseTable.java
1 package org.simantics.scl.compiler.parser.generator.table;
2
3 import java.io.DataOutputStream;
4 import java.io.File;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.util.Arrays;
8
9 import org.simantics.scl.compiler.parser.generator.compression.CompressedParseTable;
10 import org.simantics.scl.compiler.parser.generator.compression.ErrorTable;
11 import org.simantics.scl.compiler.parser.generator.compression.GCCompress;
12
13 public class ParseTable {
14     public final int stateCount;
15     public final int[][] actionTable;
16     public final int[][] gotoTable;
17     public final int[] productionInfo;
18     public final int[] initialStates;
19     public final String[] stateDescriptions;
20     
21     public ParseTable(
22             int stateCount,
23             int[][] actionTable,
24             int[][] gotoTable,
25             int[] productionInfo,
26             int[] initialStates,
27             String[] stateDescriptions) {
28         this.stateCount = stateCount;
29         this.actionTable = actionTable;
30         this.gotoTable = gotoTable;
31         this.productionInfo = productionInfo;
32         this.initialStates = initialStates;
33         this.stateDescriptions = stateDescriptions;
34     }
35     
36     @Override
37     public String toString() {
38         StringBuilder b = new StringBuilder();
39         b.append("productionInfo = ").append(Arrays.toString(productionInfo)).append('\n');
40         b.append("actions:\n");
41         for(int[] actions : actionTable) {
42             b.append("    {");
43             for(int i=0;i<actions.length;++i) {
44                 if(i > 0)
45                     b.append(", ");
46                 b.append(actions[i]);
47             }
48             b.append("},\n");
49         }
50         b.append("gotos:\n");
51         for(int[] gotos : gotoTable) {
52             b.append("    {");
53             for(int i=0;i<gotos.length;++i) {
54                 if(i > 0)
55                     b.append(", ");
56                 b.append(gotos[i]);
57             }
58             b.append("},\n");
59         }
60         return b.toString();
61     }
62     
63     public CompressedParseTable compress() {
64         return new CompressedParseTable(
65                 GCCompress.compress(actionTable), 
66                 ErrorTable.createErrorTable(actionTable),
67                 GCCompress.compress(gotoTable),
68                 productionInfo,
69                 initialStates,
70                 stateDescriptions);
71     }
72     
73     public void writeTo(File file) throws IOException {
74         FileOutputStream stream = new FileOutputStream(file);
75         DataOutputStream output = new DataOutputStream(stream);
76         for(int[] row : actionTable)
77             for(int val : row)
78                 output.writeInt(val);
79         for(int[] row : gotoTable)
80             for(int val : row)
81                 output.writeInt(val);
82         for(int val : productionInfo)
83             output.writeInt(val);
84         output.close();
85     }
86 }