def Main(rfile, wfile, filename): line = Parser.advance(rfile) flag = Parser.hasMoreCommands(line) while flag: while line == '\n' or line.startswith('//'): line = rfile.readline() if '//' in line: line = line[:line.find('//')] ctype = Parser.commandType(line) if ctype == 'C_ARITHMATIC': attribute1 = Parser.arg1(line).strip() CodeWriter.writeArithmatic(wfile, attribute1) elif ctype in ('C_PUSH', 'C_POP'): attribute1 = Parser.arg1(line).strip() attribute2 = Parser.arg2(line).strip() CodeWriter.WritePushPop(wfile, ctype, attribute1, attribute2, filename) elif ctype == 'C_LABEL': attribute1 = Parser.arg1(line).strip() CodeWriter.writeLable(wfile, attribute1) elif ctype == 'C_GOTO': attribute1 = Parser.arg1(line).strip() CodeWriter.writeGoto(wfile, attribute1) elif ctype == 'C_IF': attribute1 = Parser.arg1(line).strip() CodeWriter.writeIf(wfile, attribute1) elif ctype == 'C_FUNCTION': attribute1 = Parser.arg1(line).strip() attribute2 = Parser.arg2(line).strip() CodeWriter.writeFunction(wfile, attribute1, attribute2) elif ctype == 'C_RETURN': CodeWriter.writeReturn(wfile) elif ctype == 'C_CALL': attribute1 = Parser.arg1(line).strip() attribute2 = Parser.arg2(line) CodeWriter.writeCall(wfile, attribute1, attribute2) line = Parser.advance(rfile) flag = Parser.hasMoreCommands(line)
#!/usr/bin/python import sys, os import Parser import CodeWriter filename = sys.argv[1] rfile = open(filename, 'r') wfile = CodeWriter.setFileName(filename) wfile.write('@256\nD=A\n@SP\nM=D\n') line = Parser.advance(rfile) flag = Parser.hasMoreCommands(line) while flag: while line == '\n' or line.startswith('//'): line = rfile.readline() ctype = Parser.commandType(line) if ctype == 'C_ARITHMATIC': attribute1 = Parser.arg1(line).strip() CodeWriter.writeArithmatic(wfile, attribute1) elif ctype in ('C_PUSH', 'C_POP'): attribute1 = Parser.arg1(line).strip() attribute2 = Parser.arg2(line).strip() CodeWriter.WritePushPop(wfile, ctype, attribute1, attribute2, filename) line = Parser.advance(rfile) flag = Parser.hasMoreCommands(line) rfile.close() CodeWriter.Close(wfile)
import Parser import CodeWriter Parser.init("Prog.vm") CodeWriter.init("Prog.asm") while Parser.hasMoreCommands(): Parser.advance() cmd = Parser.commandType() if cmd is "C_ARITHMETIC": CodeWriter.writeArithmetic(Parser.lines[Parser.current]) elif cmd is "C_LABEL": CodeWriter.writeLabel(Parser.arg1()) elif cmd is "C_GOTO": CodeWriter.writeGoto(Parser.arg1()) elif cmd is "C_IF": CodeWriter.writeIf(Parser.arg1()) elif cmd is "C_FUNCTION": CodeWriter.writeFunction(Parser.arg1(), Parser.arg2()) elif cmd is "C_RETURN": CodeWriter.writeReturn() elif cmd is "C_CALL": CodeWriter.writeCall(Paser.arg1(), Parser.arg2()) else: CodeWriter.WritePushPop(cmd, Parser.arg1(), Parser.arg2()) CodeWriter.close()