예제 #1
0
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)
예제 #2
0
#!/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)
예제 #3
0
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()