01: package fri.patterns.interpreter.parsergenerator.examples;
02:
03: import java.io.*;
04: import fri.util.TimeStopper;
05: import fri.patterns.interpreter.parsergenerator.builder.SerializedLexer;
06: import fri.patterns.interpreter.parsergenerator.lexer.*;
07: import fri.patterns.interpreter.parsergenerator.syntax.*;
08: import fri.patterns.interpreter.parsergenerator.syntax.builder.*;
09:
10: /**
11: Example DTD parser. Shows how to import unresolved nonterminals from another syntax (XML).
12:
13: @author Fritz Ritzberger, 2003
14: */
15:
16: public class DtdLexer {
17: public static void main(String[] args) throws Exception {
18: if (args.length <= 0) {
19: System.err.println("SYNTAX: java "
20: + DtdLexer.class.getName()
21: + " file.dtd [file.dtd ...]");
22: System.err.println(" Example DTD Parser");
23: System.exit(1);
24: }
25:
26: TimeStopper timer = new TimeStopper();
27:
28: SerializedLexer builder = new SerializedLexer();
29: LexerImpl lexer;
30:
31: if ((lexer = (LexerImpl) builder.readLexer(null, "Dtd")) == null) { // try to get serialized lexer
32: // read the DTD syntax (fragment) from EBNF file
33: Syntax dtdSyntax = new SyntaxBuilder(new InputStreamReader(
34: DtdLexer.class.getResourceAsStream("Dtd.syntax")))
35: .getSyntax();
36: // read the XML syntax from EBNF file
37: Syntax xmlSyntax = new SyntaxBuilder(new InputStreamReader(
38: DtdLexer.class.getResourceAsStream("Xml.syntax")))
39: .getSyntax();
40:
41: // resolve DTD syntax from XML syntax (which contains most of DTD rules for processing embedded DTDs)
42: dtdSyntax.resolveFrom(xmlSyntax);
43: //System.err.println("DTD Syntax is:\n"+dtdSyntax);
44:
45: // put the lexer to file cache for next call
46: SyntaxSeparation separation = new SyntaxSeparation(
47: dtdSyntax);
48: lexer = (LexerImpl) builder.buildAndStoreLexer( // store the lexer for next call
49: separation.getLexerSyntax(), "Dtd", separation
50: .getTokenSymbols(), separation
51: .getIgnoredSymbols());
52: }
53:
54: System.err.println("time to build DTD file parser was "
55: + timer.getInterval());
56:
57: for (int i = 0; i < args.length; i++) {
58: String parseFile = args[i];
59: FileReader parseInput = new FileReader(parseFile);
60: lexer.setInput(parseInput);
61:
62: System.err.println("======================== Parsing: "
63: + parseFile + " ========================");
64: boolean ok = lexer
65: .lex(new XmlLexer.PrintXmlLexerSemantic());
66: System.err
67: .println("========================================================");
68:
69: System.err.println("Lexing took " + timer.getInterval()
70: + " millis.");
71: System.err.println("Result was: " + ok);
72: }
73: }
74:
75: }
|