import java.io.*; import java.util.ArrayList; import cs132.util.ProblemException; import cs132.vapor.parser.VaporParser; import cs132.vapor.ast.VaporProgram; import cs132.vapor.ast.VBuiltIn.Op; import cs132.vapor.ast.VDataSegment; import cs132.vapor.ast.VFunction; import cs132.vapor.ast.VInstr; import java.util.Arrays; import condense.*; import misc.*; public class VM2M { public static void main(String[] args) { try { byte[] bytes = readAllBytes(System.in); InputStream is1 = new ByteArrayInputStream(bytes); InputStream is2 = new ByteArrayInputStream(bytes); InputStream systemInCopy = createCopyOfSystemIn(); ArrayList strProg = SplitProgramInputStream.split(is1); VaporProgram prog = parseVapor(is2, System.out); CondenseVisitor cv = new CondenseVisitor(prog); System.out.println(String.join("\n", cv.getMIPS())); } catch (IOException e) { System.out.println(e.toString()); System.exit(1); } } public static VaporProgram parseVapor(InputStream in, PrintStream err) throws IOException { Op[] ops = { Op.Add, Op.Sub, Op.MulS, Op.Eq, Op.Lt, Op.LtS, Op.PrintIntS, Op.HeapAllocZ, Op.Error, }; boolean allowLocals = false; String[] registers = { "v0", "v1", "a0", "a1", "a2", "a3", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "t8", }; boolean allowStack = true; VaporProgram program; try { program = VaporParser.run(new InputStreamReader(in), 1, 1, java.util.Arrays.asList(ops), allowLocals, registers, allowStack); } catch (ProblemException ex) { err.println(ex.getMessage()); return null; } return program; } public static byte[] readAllBytes(InputStream inputStream) throws IOException { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); int nRead; byte[] data = new byte[1024]; while ((nRead = inputStream.read(data, 0, data.length)) != -1) { buffer.write(data, 0, nRead); } buffer.flush(); return buffer.toByteArray(); } private static InputStream createCopyOfSystemIn() { byte[] buffer = new byte[1024]; int bytesRead; ByteArrayInputStream bais = new ByteArrayInputStream(buffer); try { bytesRead = System.in.read(buffer); bais = new ByteArrayInputStream(buffer, 0, bytesRead); } catch (IOException e) { e.printStackTrace(); } return bais; } }