static void runParser(String inPath, String outPath) {
		String cs;
		try {
			// open a star file, read it in 
			cs = readFile(inPath);
		} catch (IOException e) {
			print("sorry, unable to read file.  aborting");
			System.exit(2);
			return; // what?  why do I need a return here?  why isn't System.exit enough?
		}

		// run input through the scanner
		ParseResult<Character, List<Token>> tokenization = Tokenizer.SCANNER.parse(new CharStream(cs));
		
		if(!tokenization.isSuccess()) {
			print("sorry, unable to tokenize star file");
			System.exit(3);
		}

		// have to remove whitespace, newlines, comments
		List<Token> tokens = new ArrayList<Token>();
		for(Token t : tokenization.getValue()) {
			if(t.type == TokenType.WHITESPACE || t.type == TokenType.COMMENT || t.type == TokenType.NEWLINES) {
				// ditch the token
			} else {
				tokens.add(t);
			}
		}
		
		ParseResult<Token, DataBlock> parseTree = ASTParser.dataBlock.parse(new LListList<Token>(tokens));
		
		if(!parseTree.isSuccess()) {
			print("sorry, unable to assemble star file tokens into parse tree");
			System.exit(4);
		}
		
		try {
			Gson gson = new Gson();
			String json = gson.toJson(parseTree.getValue());
//			String json = toJsonOrSomething(parseTree);
			writeFile(outPath, json);
		} catch (IOException e) {
			print("sorry, unable to write output to file");
			System.exit(5);
		}
	}