package freeboogie.ast.gen; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.logging.FileHandler; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; import freeboogie.util.Err; /** * The entry point of the AST generator. The usage is: * <pre>java freeboogie.ast.gen.Main [-b defaultBase] grammar templates</pre>. * * @author rgrig * @author reviewed by TODO */ public class Main { private static final Logger log = Logger.getLogger("freeboogie.ast.gen"); private static String defaultBase = "Ast"; /** * Reads in a grammar file and uses that information to expand the macros in a * template file. * * @param args <code>args[0]</code> is the grammar file and * <code>args[1..]</code> are template files */ public static void main(String[] args) { if (args.length == 0) { Err.fatal("Syntax: java freeboogie.ast.gen.Main" + " [-b defaultBaseName] grammar templates", 1); } // Setup logging. try { Handler logh = new FileHandler("ast_gen.log"); logh.setFormatter(new SimpleFormatter()); log.addHandler(logh); log.setUseParentHandlers(false); log.setLevel(Level.WARNING); // for release //log.setLevel(Level.ALL); // for debug } catch (IOException e) { System.err.println("I can't create a log file. Nevermind."); } int arg_idx = 0; Grammar grammar = null; if (args[arg_idx].equals("-b")) { if (++arg_idx == args.length) Err.fatal("You must give a default base name after '-b'"); defaultBase = args[arg_idx++]; } // read the grammar try { AgParser agParser = new AgParser(); agParser.setInputStream(new FileInputStream(args[arg_idx++])); agParser.parseAg(); grammar = agParser.getGrammar(); grammar.makeConsistent(defaultBase); } catch (IOException e) { Err.fatal("I can't read the abstract grammar.", 2); } for (; arg_idx < args.length; ++arg_idx) { // process a template try { TemplateParser template = new TemplateParser(args[arg_idx]); template.process(grammar); } catch (FileNotFoundException e) { Err.error("I can't find " + args[arg_idx] + ". I'll skip this template."); } catch (IOException e) { Err.error("I couldn't process (completely) template " + args[arg_idx]); } } } }