KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > fri > patterns > interpreter > parsergenerator > builder > SerializedTables


1 package fri.patterns.interpreter.parsergenerator.builder;
2
3 import java.io.File JavaDoc;
4 import fri.patterns.interpreter.parsergenerator.ParserTables;
5 import fri.patterns.interpreter.parsergenerator.parsertables.*;
6 import fri.patterns.interpreter.parsergenerator.syntax.Syntax;
7
8 /**
9     Buffering ParserTables. SerializedParserTables will build the ParserTables from scratch
10     only the first time. Every following call will load the serialized ParserTables
11     from filesystem.
12     <p>
13     The time to build parser tables from scratch is less or equal to deserializing it
14     for little syntaxes. Use it only for big tables (e.g. for Java syntax).
15     <p>
16     Mind that this factory accepts a parser syntax, NOT a syntax where parser and lexer rules were mixed!
17     <p>
18     Example (with syntax input from a file):
19     <pre>
20         File syntaxInput = ...;
21         ParserTables tables = new SerializedTables().get(syntaxInput);
22     </pre>
23     or (syntax input from a Reader):
24     <pre>
25         Reader syntaxInput = ...;
26         ParserTables tables = new SerializedTables().get(syntaxInput, "MyTables.ser");
27     </pre>
28
29     @author (c) 2000, Fritz Ritzberger
30 */

31
32 public class SerializedTables extends SerializedObject
33 {
34     private boolean PRODUCTION; // setting this to false in constructor will prevent the ParserTables from being serialized
35

36     /** Create a ParserTables factory that buffers created parser tables. */
37     public SerializedTables() {
38         this(true);
39     }
40     
41     /** Create a ParserTables factory that buffers tables once created. @param production when false the tables will not be buffered. */
42     public SerializedTables(boolean production) {
43         this.PRODUCTION = production;
44     }
45
46     /**
47         Creates parser tables for passed syntax input from scratch or loads serialized tables from filesystem.
48         LALRParserTables.class wil be the type of created parser tables.
49         @param syntaxInput the Parser syntax as File, InputStream, List of Lists, String [][] or Syntax.
50         @return deserialized ParserTables, or one built from scratch that gets written to filesystem.
51     */

52     public AbstractParserTables get(Object JavaDoc syntaxInput)
53         throws Exception JavaDoc
54     {
55         return get(syntaxInput, null);
56     }
57
58     /**
59         Creates parser tables for passed syntax input from scratch or loads serialized tables from filesystem.
60         LALRParserTables.class will be the type of created parser tables.
61         @param syntaxInput the Parser syntax as File, InputStream, List of Lists, String [][] or Syntax.
62         @param baseName name of serialization file, can be null when syntaxInput is a File
63         @return deserialized ParserTables, or one built from scratch that gets written to filesystem.
64     */

65     public AbstractParserTables get(Object JavaDoc syntaxInput, String JavaDoc baseName)
66         throws Exception JavaDoc
67     {
68         return get(null, syntaxInput, baseName);
69     }
70
71     /**
72         Creates parser tables for passed syntax input from scratch or loads serialized tables from filesystem.
73         @param parserType the ParserTables class, e.g. SLRParserTables.class.
74         @param syntaxInput the Parser syntax as File, InputStream, List of Lists, String [][] or Syntax.
75         @param baseName name of serialization file, can be null when syntaxInput is a File
76         @return deserialized ParserTables, or one built from scratch that gets written to filesystem.
77     */

78     public AbstractParserTables get(Class JavaDoc parserType, Object JavaDoc syntaxInput, String JavaDoc baseName)
79         throws Exception JavaDoc
80     {
81         AbstractParserTables parserTables = readParserTables(syntaxInput, baseName);
82         if (parserTables == null)
83             parserTables = buildAndStoreParserTables(parserType, null, syntaxInput, baseName);
84         return parserTables;
85     }
86     
87     private String JavaDoc ensureFileName(Object JavaDoc syntaxInput, String JavaDoc baseName) {
88         if (baseName == null)
89             baseName = baseNameFromSyntax(syntaxInput);
90         return baseName+"ParserTables.ser";
91     }
92     
93     public AbstractParserTables readParserTables(Object JavaDoc syntaxInput, String JavaDoc baseName) {
94         if (PRODUCTION)
95             return (AbstractParserTables) read(ensureFileName(syntaxInput, baseName));
96         return null;
97     }
98
99     public AbstractParserTables buildAndStoreParserTables(Class JavaDoc parserType, Syntax parserSyntax, Object JavaDoc syntaxInput, String JavaDoc baseName)
100         throws Exception JavaDoc
101     {
102         if (parserType == null)
103             parserType = LALRParserTables.class;
104
105         Syntax syntax = parserSyntax == null ? toSyntax(syntaxInput) : parserSyntax;
106
107         fri.util.TimeStopper ts = new fri.util.TimeStopper();
108         AbstractParserTables parserTables = AbstractParserTables.construct(parserType, syntax);
109         System.err.println("ParserTables scratch construction took "+ts.getTimeMillis()+" millis");
110
111         if (PRODUCTION)
112             write(ensureFileName(syntaxInput, baseName), parserTables);
113         
114         return parserTables;
115     }
116
117
118
119     /** Test main. Building serialized ParserTables takes 170, building from scratch takes 59 millis !!! */
120     public static void main(String JavaDoc [] args) {
121         try {
122             File JavaDoc syntaxFile = new File JavaDoc("fri/patterns/interpreter/parsergenerator/syntax/builder/examples/SyntaxBuilder.syntax");
123             Syntax syntax = new fri.patterns.interpreter.parsergenerator.syntax.builder.SyntaxBuilder(syntaxFile).getParserSyntax();
124             fri.util.TimeStopper ts = new fri.util.TimeStopper();
125             ParserTables parserTables = new SerializedTables().get(syntax, "SyntaxBuilder");
126             System.err.println("ParserTables were built in "+ts.getTimeMillis()+" millis");
127         }
128         catch (Exception JavaDoc e) {
129             e.printStackTrace();
130         }
131     }
132
133 }
134
Popular Tags