package ppg; import java.io.*; import ppg.cmds.*; import ppg.lex.*; import ppg.parse.*; import ppg.spec.*; import ppg.util.*; public class PPG { public static final String HEADER = "ppg: "; public static final String DEBUG_HEADER = "ppg [debug]: "; public static boolean debug = false; public static String SYMBOL_CLASS_NAME = "sym"; public static String OUTPUT_FILE = null; public static void DEBUG (String s) { if (debug) System.out.println (DEBUG_HEADER + s); } public static void main (String args[]) { FileInputStream fileInput; String filename = null; try { for (int i = 0; i < args.length; i++) { // assume all switches begin with a dash '-' if (args[i].charAt (0) == '-') { if (args[i].equals ("-symbols")) { if (args.length > i) SYMBOL_CLASS_NAME = args[++i]; else throw new Exception ("No filename specified after -symbols"); } else if (args[i].equals ("-o")) { if (args.length > i) OUTPUT_FILE = args[++i]; else throw new Exception ("No filename specified after -o"); } else // invalid switch throw new Exception ("Invalid switch: " + args[i]); } else { // not a switch: this must be a filename // but only do the 1st filename on the command line if (filename == null) filename = args[i]; else throw new Exception ("Error: multiple source files specified."); } } } catch (Exception e) { System.err.println (HEADER + e.getMessage ()); usage (); } if (filename == null) { System.err.println ("Error: no filename specified."); usage (); } try { fileInput = new FileInputStream (filename); } catch (FileNotFoundException e) { System.out.println ("Error: " + filename + " is not found."); return; } catch (ArrayIndexOutOfBoundsException e) { System.out.println (HEADER + "Error: No file name given."); return; } Lexer lex = new Lexer (fileInput, filename); Parser parser = new Parser (filename, lex); try { parser.parse (); } catch (Exception e) { System.out.println (HEADER + "Exception: " + e.getMessage ()); return; } Spec spec = (Spec) parser.getProgramNode (); File file = new File(filename); String parent = file.getParent (); spec.parseChain (parent == null ? "" : parent); PrintStream out = System.out; /* now we have a linked list of inheritance, namely * PPG_1, PPG_2, ..., PPG_n, CUP * We combine two at a time, starting from the end with the CUP spec */ try { if (OUTPUT_FILE != null) { out = new PrintStream(new FileOutputStream(OUTPUT_FILE)); } CUPSpec combined = spec.coalesce (); CodeWriter cw = new CodeWriter (out, 72); combined.unparse (cw); cw.flush (); } catch (PPGError e) { System.out.println (e.getMessage ()); System.exit (1); } catch (IOException e) { System.out.println (HEADER + "exception: " + e.getMessage ()); System.exit (1); } } public static void usage () { System.err. println ("Usage: ppg [-symbols ConstClass] <input file>\nwhere:\n" + "\t-c <Class>\tclass prepended to token names to pass to <func>\n" + "\t<input>\ta PPG or CUP source file\n"); System.exit (1); } }