Skip to content
Snippets Groups Projects
LabComm.java 8.69 KiB
Newer Older
  • Learn to ignore specific revisions
  • Anders Nilsson's avatar
    Anders Nilsson committed
    import AST.*;
    import java.io.*;
    import java.util.*;
    
    public class LabComm {
    
      private static void println(String s) {
        System.out.println(s);
      }
    
      private static void print_help() {
        println("\n Usage: java -jar labcom.jar [options*] FILE");
        println("");
        println(" --help                  Shows this help text");
        println(" -v                      Be verbose");
        println("[ C options ]");
        println(" -C                      Generates C/H code in FILE.[ch]");
        println(" --cprefix=PREFIX        Prefixes C types with PREFIX");
        println(" --cinclude=FILE         Include FILE in generated .c");
        println(" --c=CFILE               Generates C code in CFILE");
        println(" --h=HFILE               Generates H code in HFILE");
        println("[ C# options]");
        println(" --cs                    Generates C# code in FILE.cs");
        println(" --cs=CSFILE             Generates C# code in CSFILE");
        println(" --csnamespace=NAMESPACE Place C# classes in NAMESPACE");
        println("[ Java options ]");
        println(" --java=JDIR             Generates Java files in JDIR");
        println(" --javapackage=PACKAGE   Place Java classes in PACKAGE");
        println("[ Python options ]");
        println(" -P                      Generates Python code in FILE.py");
        println(" --python=PFILE          Generates Python code in PFILE");
        println("[ Misc options ]");
        println(" --pretty                Pretty prints on standard output");
        println(" --typeinfo=TIFILE       Generates typeinfo in TIFILE");
      }
        
      private static String getCoreName(String s) {
        int i = s.lastIndexOf('.');
        return s.substring(0, i > 0 ? i : s.length());
      }
    
      private static String getFileName(String s) {
        return s.substring(s.lastIndexOf('/') + 1, s.length());
      }
    
      private static String getBaseName(String s) {
        s = getFileName(s);
        int i = s.lastIndexOf('.');
        return s.substring(0, i > 0 ? i : s.length());
      }
    
      private static String getPrefix(String s) {
        return s.substring(s.lastIndexOf('/') + 1, s.length());
      }
    
      public static void main(String[] args) {
        String fileName = null;
        // Scan for first non-option
        for (int i = 0 ; i < args.length ; i++) {
          if (! args[i].startsWith("-")) {
    	fileName = args[i];
    	break;
          }
        }
        String coreName = null;
        String prefix = null;
        if (fileName != null) {
          coreName = getBaseName(fileName);
          prefix = getPrefix(coreName);
        }
        boolean verbose = false;
        String cFile = null;
        String hFile = null;
        Vector cIncludes = new Vector();
        String cPrefix = prefix;
        String csFile = null;
        String csNamespace = null;
        String javaDir = null;
        String javaPackage = "";
        String pythonFile = null;
        String prettyFile = null;
        String typeinfoFile = null;
    
        for (int i = 0 ; i < args.length ; i++) {
          if (fileName == null ||
    	  args[i].equals("-help") || 
    	  args[i].equals("-h") || 
    	  args[i].equals("--help")) {
    	print_help();
    	System.exit(0);
          } else if (args[i].equals("-v")) {
    	verbose=true;
          } else if (args[i].equals("-C")) {
    	cFile = coreName + ".c";
    	hFile = coreName + ".h";
          } else if (args[i].startsWith("--cinclude=")) {
    	cIncludes.add(args[i].substring(11));
          } else if (args[i].startsWith("--cprefix=")) {
    	cPrefix = args[i].substring(10);
          } else if (args[i].startsWith("--c=")) {
    	cFile = args[i].substring(4);
          } else if (args[i].startsWith("--h=")) {
    	hFile = args[i].substring(4);
          } else if (args[i].equals("--cs")) {
    	csFile = coreName + ".cs";
          } else if (args[i].startsWith("--cs=")) {
    	csFile = args[i].substring(5);
          } else if (args[i].startsWith("--csnamespace=")) {
    	csNamespace = args[i].substring(14);
          } else if (args[i].startsWith("--java=")) {
    	javaDir = args[i].substring(7);
          } else if (args[i].startsWith("--javapackage=")) {
    	javaPackage = args[i].substring(14);
          } else if (args[i].equals("-P")) {
    	pythonFile = coreName + ".py";
          } else if (args[i].startsWith("--python=")) {
    	pythonFile = args[i].substring(9);
          } else if (args[i].startsWith("--pretty=")) {
    	prettyFile = args[i].substring(9);
          } else if (args[i].startsWith("--typeinfo=")) {
    	typeinfoFile = args[i].substring(11);
          } else if (i == args.length - 1) {
    	fileName = args[i];
          } else {
    	System.err.println(" Unknown argument " + args[i]);
    	print_help();
    	System.exit(2);
          }
        }
        if (fileName == null) {
          print_help();
          System.exit(1);
        } else {
    
          Program ast = null;
    
          try {
    	// Check for errors
    	LabCommScanner scanner = new LabCommScanner(new FileReader(fileName));
    	LabCommParser parser = new LabCommParser();
    	Program p = (Program)parser.parse(scanner);
    	Collection errors = new LinkedList();
    	p.errorCheck(errors);
    	  
    	if (errors.isEmpty()) {
    	  ast = p;
    	} else {
    	  for (Iterator iter = errors.iterator(); iter.hasNext(); ) {
    	    String s = (String)iter.next();
    	    System.out.println(s);
    	  }
    	}
          } catch (FileNotFoundException e) {
    	System.err.println("Could not find file: " + fileName);
          } catch (IOException e) {
    	System.err.println("IOException: " + fileName + " " + e);
          } catch (beaver.Parser.Exception e) {
    	System.err.println(e.getMessage());
          }
          if (ast != null) {
    	
    	Vector hIncludes = new Vector(cIncludes);
    	if (hFile != null) {
    	  cIncludes.add(hFile);
    	}
    	  
    	boolean prettyOnStdout = true;
    	if (cFile != null) {
    	  if (verbose) { System.err.println("Generating C: " + cFile); }
    	  genC(ast, cFile, cIncludes, coreName, cPrefix);
    	  prettyOnStdout = false;
    	}
    	if (hFile != null) {
    	  if (verbose) { System.err.println("Generating H: " + hFile); }
    	  genH(ast, hFile, hIncludes, coreName, cPrefix);
    	  prettyOnStdout = false;
    	}
    	if (csFile != null) {
    	  if (verbose) { System.err.println("Generating C#: " + csFile); }
    	  genCS(ast, csFile, csNamespace);
    	  prettyOnStdout = false;
    	}
    	if (javaDir != null) {
    	  if (verbose) { System.err.println("Generating Java: " + javaDir); }
    	  genJava(ast, javaDir, javaPackage);
    	  prettyOnStdout = false;
    	}
    	if (pythonFile != null) {
    	  if (verbose) { 
    	    System.err.println("Generating Python: " + pythonFile); 
    	  }
    	  genPython(ast, pythonFile, prefix);
    	  prettyOnStdout = false;
    	}
    	if (prettyFile != null) {
    	  if (verbose) { 
    	    System.err.println("Generating Pretty: " + prettyFile); 
    	  }
    	  try {
    	    FileOutputStream f = new FileOutputStream(prettyFile);
    	    PrintStream out = new PrintStream(f);
    	    ast.pp(out);
    	    out.close();
    	    prettyOnStdout = false;
    	  } catch (IOException e) {
    	    System.err.println("IOException: " + prettyFile + " " + e);
    	  } 
    	}
    	if (typeinfoFile != null) {
    	  if (verbose) { 
    	    System.err.println("Generating TypeInfo: " + typeinfoFile); 
    	  }
    	  try {
    	    FileOutputStream f = new FileOutputStream(typeinfoFile);
    	    PrintStream out = new PrintStream(f);
    	    ast.C_info(out, cPrefix);
    	    ast.Java_info(out);
    	    ast.CS_info(out, csNamespace);
    	    prettyOnStdout = false;
    	  } catch (IOException e) {
    	    System.err.println("IOException: " + typeinfoFile + " " + e);
    	  }
    	}
    	if (prettyOnStdout) {
    	  ast.pp(System.out);
    	}
          }
        }
      } 
    
      private static void genH(Program p, String hName, 
    			   Vector cIncludes, String coreName, String prefix) {
        try {
          FileOutputStream f;
          PrintStream out;
          
          f = new FileOutputStream(hName);
          out = new PrintStream(f);
          p.C_genH(out, cIncludes, coreName, prefix);
          out.close();
        } catch (IOException e) {
          System.err.println("IOException: " + hName + " " + e);
        }
      }
    
      private static void genC(Program p, String cName, 
    			   Vector cIncludes, String coreName, String prefix) {
        try {
          FileOutputStream f;
          PrintStream out;
    
          f = new FileOutputStream(cName);
          out = new PrintStream(f);
          p.C_genC(out, cIncludes, coreName, prefix);
          out.close();
        } catch (IOException e) {
          System.err.println("IOException: " + cName + " " + e);
        }
      }
    
      private static void genCS(Program p, String csName, String csNamespace) {
        try {
          p.CS_gen(csName, csNamespace);
        } catch (IOException e) {
          System.err.println("IOException: " + csName + " " + 
    			 csNamespace + " " + e);
        }
      }
    
      private static void genJava(Program p,  String dirName, String packageName) {
        try {
          p.J_gen(dirName, packageName);
        } catch (IOException e) {
          System.err.println("IOException: " + dirName + " " + 
    			 packageName + " " + e);
        }
      }
    
      private static void genPython(Program p, String filename, String prefix) {
        try {
          FileOutputStream f;
          PrintStream out;
    
          f = new FileOutputStream(filename);
          out = new PrintStream(f);
          p.Python_gen(out, prefix);
          out.close();
        } catch (IOException e) {
          System.err.println("IOException: " + filename + " " + e);
        }
      }
    
    
    
    }