]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.scl.compiler.parser.generator;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.IOException;
6
7 import org.simantics.scl.compiler.parser.generator.compression.CompressedParseTable;
8 import org.simantics.scl.compiler.parser.generator.grammar.AnaGrammar;
9 import org.simantics.scl.compiler.parser.generator.java.GenerateEnum;
10 import org.simantics.scl.compiler.parser.generator.java.GenerateParser;
11 import org.simantics.scl.compiler.parser.generator.table.ParseTable;
12 import org.simantics.scl.compiler.parser.generator.table.ParseTableBuilder;
13 import org.simantics.scl.compiler.parser.grammar.Grammar;
14 import org.simantics.scl.compiler.parser.grammar.input.GrammarParserImpl;
15
16 public class ParserGenerator {
17     
18     public static void createParser(String packageName, String exceptionName, File grammarFile) throws IOException {
19         // Read grammar and check it
20         FileInputStream inputStream = new FileInputStream(grammarFile);
21         Grammar grammar = GrammarParserImpl.read(inputStream);
22         inputStream.close();
23         grammar.check();
24         
25         AnaGrammar anaGrammar = new AnaGrammar(grammar);
26         ParseTable table = ParseTableBuilder.build(anaGrammar);
27
28         File directory = grammarFile.getParentFile();
29         String name = grammarFile.getName();
30         {
31             int p = name.lastIndexOf('.');
32             if(p > 0)
33                 name = name.substring(0, p);
34         }
35
36         // Write parse table
37         CompressedParseTable compressedTable = table.compress();
38         compressedTable.writeTo(new File(directory, name + "Parser.dat"));
39
40         // Write classes
41         {
42             String className = name + "Terminals"; 
43             GenerateEnum.generate(new File(directory, className + ".java"), 
44                     packageName, className,
45                     anaGrammar.terminalNames);
46         }
47         {
48             String className = name + "Parser";
49             new GenerateParser(packageName, className, anaGrammar, exceptionName, compressedTable)
50             .generate(new File(directory, className + ".java"));
51         }
52     }
53
54 }