]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/parser/generator/ParserGenerator.java
Moved SCL parser generator to platform repository.
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / parser / generator / ParserGenerator.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/parser/generator/ParserGenerator.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/parser/generator/ParserGenerator.java
new file mode 100644 (file)
index 0000000..886ce72
--- /dev/null
@@ -0,0 +1,54 @@
+package org.simantics.scl.compiler.parser.generator;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import org.simantics.scl.compiler.parser.generator.compression.CompressedParseTable;
+import org.simantics.scl.compiler.parser.generator.grammar.AnaGrammar;
+import org.simantics.scl.compiler.parser.generator.java.GenerateEnum;
+import org.simantics.scl.compiler.parser.generator.java.GenerateParser;
+import org.simantics.scl.compiler.parser.generator.table.ParseTable;
+import org.simantics.scl.compiler.parser.generator.table.ParseTableBuilder;
+import org.simantics.scl.compiler.parser.grammar.Grammar;
+import org.simantics.scl.compiler.parser.grammar.input.GrammarParserImpl;
+
+public class ParserGenerator {
+    
+    public static void createParser(String packageName, String exceptionName, File grammarFile) throws IOException {
+        // Read grammar and check it
+        FileInputStream inputStream = new FileInputStream(grammarFile);
+        Grammar grammar = GrammarParserImpl.read(inputStream);
+        inputStream.close();
+        grammar.check();
+        
+        AnaGrammar anaGrammar = new AnaGrammar(grammar);
+        ParseTable table = ParseTableBuilder.build(anaGrammar);
+
+        File directory = grammarFile.getParentFile();
+        String name = grammarFile.getName();
+        {
+            int p = name.lastIndexOf('.');
+            if(p > 0)
+                name = name.substring(0, p);
+        }
+
+        // Write parse table
+        CompressedParseTable compressedTable = table.compress();
+        compressedTable.writeTo(new File(directory, name + "Parser.dat"));
+
+        // Write classes
+        {
+            String className = name + "Terminals"; 
+            GenerateEnum.generate(new File(directory, className + ".java"), 
+                    packageName, className,
+                    anaGrammar.terminalNames);
+        }
+        {
+            String className = name + "Parser";
+            new GenerateParser(packageName, className, anaGrammar, exceptionName, compressedTable)
+            .generate(new File(directory, className + ".java"));
+        }
+    }
+
+}