]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - 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
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/parser/generator/table/ParseTable.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/parser/generator/table/ParseTable.java
new file mode 100644 (file)
index 0000000..d79e968
--- /dev/null
@@ -0,0 +1,86 @@
+package org.simantics.scl.compiler.parser.generator.table;
+
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.simantics.scl.compiler.parser.generator.compression.CompressedParseTable;
+import org.simantics.scl.compiler.parser.generator.compression.ErrorTable;
+import org.simantics.scl.compiler.parser.generator.compression.GCCompress;
+
+public class ParseTable {
+    public final int stateCount;
+    public final int[][] actionTable;
+    public final int[][] gotoTable;
+    public final int[] productionInfo;
+    public final int[] initialStates;
+    public final String[] stateDescriptions;
+    
+    public ParseTable(
+            int stateCount,
+            int[][] actionTable,
+            int[][] gotoTable,
+            int[] productionInfo,
+            int[] initialStates,
+            String[] stateDescriptions) {
+        this.stateCount = stateCount;
+        this.actionTable = actionTable;
+        this.gotoTable = gotoTable;
+        this.productionInfo = productionInfo;
+        this.initialStates = initialStates;
+        this.stateDescriptions = stateDescriptions;
+    }
+    
+    @Override
+    public String toString() {
+        StringBuilder b = new StringBuilder();
+        b.append("productionInfo = ").append(Arrays.toString(productionInfo)).append('\n');
+        b.append("actions:\n");
+        for(int[] actions : actionTable) {
+            b.append("    {");
+            for(int i=0;i<actions.length;++i) {
+                if(i > 0)
+                    b.append(", ");
+                b.append(actions[i]);
+            }
+            b.append("},\n");
+        }
+        b.append("gotos:\n");
+        for(int[] gotos : gotoTable) {
+            b.append("    {");
+            for(int i=0;i<gotos.length;++i) {
+                if(i > 0)
+                    b.append(", ");
+                b.append(gotos[i]);
+            }
+            b.append("},\n");
+        }
+        return b.toString();
+    }
+    
+    public CompressedParseTable compress() {
+        return new CompressedParseTable(
+                GCCompress.compress(actionTable), 
+                ErrorTable.createErrorTable(actionTable),
+                GCCompress.compress(gotoTable),
+                productionInfo,
+                initialStates,
+                stateDescriptions);
+    }
+    
+    public void writeTo(File file) throws IOException {
+        FileOutputStream stream = new FileOutputStream(file);
+        DataOutputStream output = new DataOutputStream(stream);
+        for(int[] row : actionTable)
+            for(int val : row)
+                output.writeInt(val);
+        for(int[] row : gotoTable)
+            for(int val : row)
+                output.writeInt(val);
+        for(int val : productionInfo)
+            output.writeInt(val);
+        output.close();
+    }
+}