01: package fri.patterns.interpreter.parsergenerator.examples;
02:
03: import java.io.*;
04: import fri.util.TimeStopper;
05: import fri.patterns.interpreter.parsergenerator.*;
06: import fri.patterns.interpreter.parsergenerator.builder.*;
07: import fri.patterns.interpreter.parsergenerator.semantics.PrintSemantic;
08:
09: //import fri.patterns.interpreter.parsergenerator.syntax.builder.*;
10: //import fri.patterns.interpreter.parsergenerator.parsertables.*;
11:
12: /**
13: Example Java parser.
14:
15: @author Fritz Ritzberger, 2000
16: */
17:
18: public class JavaParser {
19: public static void main(String[] args) throws Exception {
20: if (args.length <= 0) {
21: System.err.println("SYNTAX: java "
22: + JavaParser.class.getName()
23: + " file.java [file.java ...]");
24: System.err.println(" Example Java Parser");
25: } else {
26: TimeStopper timer = new TimeStopper();
27:
28: // read the syntax from EBNF file
29: Reader syntaxInput = new InputStreamReader(JavaParser.class
30: .getResourceAsStream("Java.syntax"));
31:
32: /* building from scratch, takes 4200 millis
33: SyntaxBuilder builder = new SyntaxBuilder(syntaxInput);
34: Lexer lexer = builder.getLexer();
35: lexer.setDebug(true);
36: ParserTables tables = new LALRParserTables(builder.getParserSyntax());
37: Parser parser = new Parser(tables);
38: parser.setLexer(lexer);
39: */
40:
41: /* building with precompiled tables, takes 1600 millis
42: SyntaxBuilder builder = new SyntaxBuilder(syntaxInput);
43: Lexer lexer = builder.getLexer();
44: ParserTables tables = new CompiledTables().get(builder.getParserSyntax(), "Java");
45: Parser parser = new Parser(tables);
46: parser.setLexer(lexer);
47: */
48:
49: /* building serialized parser, takes 740 millis */
50: Parser parser = new SerializedParser().get(null,
51: syntaxInput, "Java");
52: System.err.println("time to build Java file parser was "
53: + timer.getInterval());
54:
55: //parser.getParserTables().dumpSyntaxNodes(System.out);
56: //parser.getParserTables().dump(System.err);
57:
58: // we want to receive Java comments and spaces/newlines
59: parser.getLexer().addTokenListener(
60: new Lexer.TokenListener() {
61: public void tokenReceived(Token token,
62: boolean ignored) {
63: if (ignored) {
64: System.err
65: .println("------------- Ignored Token Received -------------------");
66: System.err.println(token.text);
67: System.err
68: .println("--------------------------------------------------------");
69: }
70: }
71: });
72:
73: for (int i = 0; i < args.length; i++) {
74: String fileToParse = args[i];
75: FileReader parseInput = new FileReader(fileToParse);
76: System.err
77: .println("========================================================");
78: System.err.println("Parsing: " + fileToParse);
79:
80: parser.setInput(parseInput); // set file input to lexer
81: boolean ok = parser.parse(new PrintSemantic()); // parse input
82:
83: System.err
84: .println("========================================================");
85: System.err.println("Parsing result from " + fileToParse
86: + " is: " + ok + ", parsing took "
87: + timer.getInterval() + " millis");
88: }
89: }
90: }
91:
92: }
|