KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > ro > infoiasi > donald > compiler > parser > AbstractParser


1 package ro.infoiasi.donald.compiler.parser;
2
3 import ro.infoiasi.donald.compiler.cfg.*;
4 import java.io.*;
5 import java.util.*;
6 import java.lang.reflect.Constructor JavaDoc;
7 import java.lang.reflect.InvocationTargetException JavaDoc;
8
9 public abstract class AbstractParser implements Parser {
10     protected ParserSpec spec;
11     protected CFG g;
12     protected NonTerminals v;
13     protected Terminals t;
14     protected NonTerminal s;
15     protected Productions p;
16     protected Production sp;
17
18     protected Lexer lexer;
19     
20     protected boolean DEBUG = false;
21
22     public AbstractParser(ParserSpec spec, boolean addStartProduction) {
23         this.spec = spec;
24         g = spec.getGrammar();
25         if (addStartProduction) {
26             sp = g.addStartProduction();
27         }
28         v = g.getNonTerminals();
29         t = g.getTerminals();
30         s = g.getStartSymbol();
31         p = g.getProductions();
32     }
33
34     public AbstractParser(ParserSpec spec) {
35         this(spec, false);
36     }
37
38     public AbstractParser(String JavaDoc parserSpecPath, boolean addStartProduction)
39             throws IOException, SpecParseException {
40         this(ParserSpec.load(parserSpecPath), addStartProduction);
41     }
42
43     public AbstractParser(String JavaDoc parserSpecPath)
44             throws IOException, SpecParseException {
45         this(ParserSpec.load(parserSpecPath), false);
46     }
47
48     public CFG getGrammar() {
49         return g;
50     }
51
52     public Lexer getLexer() {
53         return lexer;
54     }
55
56     public void setLexer(String JavaDoc className, String JavaDoc fileName)
57             throws ClassNotFoundException JavaDoc,
58             FileNotFoundException,
59             ClassCastException JavaDoc,
60             NoSuchMethodException JavaDoc,
61             InstantiationException JavaDoc,
62             IllegalAccessException JavaDoc {
63         setLexer(Class.forName(className), fileName);
64     }
65
66     public void setLexer(Class JavaDoc lexerClass, String JavaDoc fileName)
67             throws ClassNotFoundException JavaDoc,
68             FileNotFoundException,
69             ClassCastException JavaDoc,
70             NoSuchMethodException JavaDoc,
71             InstantiationException JavaDoc,
72             IllegalAccessException JavaDoc {
73         FileReader fileReader = new FileReader(fileName);
74         if (lexerClass.isInterface()) {
75             throw new ClassCastException JavaDoc(lexerClass+" is an interface");
76         }
77         if (!Lexer.class.isAssignableFrom(lexerClass)) {
78             throw new ClassCastException JavaDoc(lexerClass+" does not implement the Lexer interface");
79         }
80         try {
81             Constructor JavaDoc ctor = lexerClass.getConstructor(new Class JavaDoc[] {Reader.class});
82             lexer = (Lexer)ctor.newInstance(new Object JavaDoc[] {fileReader});
83         } catch (InvocationTargetException JavaDoc e) {
84             // the constructor has thrown an exception, tha was wraped as a Invoc...
85
throw new RuntimeException JavaDoc(e.getCause());
86         }
87         lexer.setTerminals(t);
88     }
89
90     abstract public void precompute();
91     abstract public List parse() throws IOException, SyntaxError;
92 }
93
Popular Tags