package de.fuberlin.projecta; import de.fuberlin.commons.lexer.ILexer; import de.fuberlin.projecta.lexer.Lexer; import de.fuberlin.projecta.lexer.io.FileCharStream; import de.fuberlin.projecta.lexer.io.ICharStream; import de.fuberlin.projecta.parser.ParseException; import de.fuberlin.projecta.parser.Parser; import de.fuberlin.projecta.utils.StringUtils; /** * Runnable class for executing lexer+parser * * Output is a syntax tree */ public class ParserMain { static Parser parse(ICharStream stream, boolean verbose) { ILexer lexer = new Lexer(stream); Parser parser = new Parser(); try { parser.parse(lexer, ""); } catch (ParseException e) { System.out.println(e.getMessage() + " (error at line: " + e.getLineNumber() + ", column: " + e.getOffset() + ", token: \"" + e.getText() + "\")" ); System.out.println("Details:"); System.out.println(e.getDetails()); if (verbose) { System.out.println("Trace:"); e.printStackTrace(); } if (verbose) { if (parser.getParseTree() != null) parser.getParseTree().printTree(); throw e; } return null; } if (verbose) { parser.getParseTree().printTree(); } return parser; } private static void run(ICharStream stream) { Parser parser = parse(stream, true); if (parser == null) return; parser.getParseTree().printTree(); } public static void main(String[] args) { if (args.length == 0) { System.out.println("Reading from stdin. Exit with new line and Ctrl+D."); ICharStream stream = StringUtils.readFromStdin(); run(stream); } else if (args.length == 1) { final String path = args[0]; FileCharStream stream = StringUtils.readFromFile(path); run(stream); } else { System.out.println("Wrong number of parameters."); } } }