def reg(str, pat): cnt = 0 alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" numbers = "0123456789" alphanum = numbers + alpha for symbol in pat: if cnt == len(str) - 1: return 1 #check for string if symbol == "*": while(1): if not str[cnt] in alpha: break if cnt == len(str) - 1: return 1 cnt += 1 #check for character if symbol == "?": if not str[cnt] in alpha: return 0 cnt += 1 #check for numbers if symbol == "#": if not str[cnt] in numbers: return 0 cnt += 1 #check for string of numbers if symbol == "%": while(1): if not str[cnt] in numbers: break if cnt == len(str) - 1: return 1 cnt += 1 #check for alphanumeric if symbol == "^": if not str[cnt] in alphanum: return 0 cnt += 1 #check for alphanum string if symbol == "&": while(1): if not str[cnt] in alphanum: break if cnt == len(str) - 1: return 1 cnt += 1 class inter: def __init__(self): self.mem = [] self.stack = [] self.ip = 0 self.halt = 0 def get_instr(self, op): op = op.split(" ") if op[0][0] == '#': return None return int(op[0]) def get_arg1(self, op): op = op.split(" ") return self.numeric(op[1]) def get_arg2(self, op): op = op.split(" ") return self.numeric(op[2]) def numeric(self, expr): if expr.find('.') == -1: return int(expr) return float(expr) def decode_op(self, op): opc = self.get_instr(op) if not opc: return if opc == 1000: a = self.stack.pop() b = self.stack.pop() self.stack.append(a + b) return elif opc == 1001: a = self.stack.pop() b = self.stack.pop() self.stack.append(b - a) return elif opc == 1002: a = self.stack.pop() b = self.stack.pop() self.stack.append(a * b) return elif opc == 1003: a = self.stack.pop() b = self.stack.pop() self.stack.append(float(b) / a) return elif opc == 1004: a = self.stack.pop() b = self.stack.pop() if a == b: self.stack.append(1) return self.stack.append(0) return elif opc == 1005: a = self.stack.pop() b = self.stack.pop() if b > a: self.stack.append(1) return self.stack.append(0) return elif opc == 1006: a = self.stack.pop() b = self.stack.pop() if a > b: self.stack.append(1) return self.stack.append(0) return elif opc == 1007: a = self.stack.pop() b = self.stack.pop() if b >= a: self.stack.append(1) return self.stack.append(0) return elif opc == 1008: a = self.stack.pop() b = self.stack.pop() if a >= b: self.stack.append(1) return self.stack.append(0) return elif opc == 1009: a = self.stack.pop() a -= 1 self.stack.append(a) return elif opc == 1010: a = self.get_arg1(op) self.stack.append(a) return elif opc == 1011: a = self.get_arg1(op) b = self.get_arg2(op) self.mem[a] = b return elif opc == 1012: a = self.get_arg1(op) self.stack.append(self.mem[a]) return elif opc == 1013: a = self.get_arg1(op) self.mem[a] = self.stack.pop() return elif opc == 1014: a = self.get_arg1(op) self.ip = a - 2 return elif opc == 1015: a = self.stack.pop() if a: self.ip = self.get_arg1(op) - 2 return return elif opc == 1016: a = self.stack.pop() if not a: self.ip = self.get_arg1(op) - 2 return return elif opc == 1017: return elif opc == 1018: self.halt == 1 elif opc == 1019: print self.stack return elif opc == 1020: a = self.stack.pop() print a return elif opc == 1021: a = self.stack.pop() self.stack.append(a) self.stack.append(a) def run_script(self, script): self.ip = 0 script_len = len(script) while(1): if self.halt: return if self.ip == script_len: return self.decode_op(script[self.ip]) self.ip += 1 vm = inter() f = file('d:/vm1.bpl') script = [] while(1): a = f.readline() if not a: break script.append(a) vm.run_script(script) import types class stack: def __init__(self): self.stack = [] def push(self, val): self.stack.append(val) def pop(self): if len(self.stack) <> 0: return self.stack.pop() raise Warning, 'Pop from empty stack, returning 1' return 1 def get_slen(self): return len(self.stack) sp = property(get_slen) tos = property(pop, push) class emulator: def __init__(self): self.mem = {} self.stack = stack() self.registers = ['ax', 'bx', 'cx', 'dx'] self.symbols = {} self.alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" self.legal_symbols = "_|<>0123456789" self.ident = self.alpha + self.legal_symbols def is_numeric(self, expr): for char in expr: if not char in '0123456789.': return 0 return 1 def is_ident(self, expr): if len(expr) == 1 and expr in self.ident: return 1 if not expr[0] in self.alpha: return 0 for char in expr[1:]: if not char in self.ident: return 0 return 1 def is_symbol(self, expr): if expr in self.symbols.keys(): return 1 return 0 def numeric(self, expr): if expr.find(".") == -1: return int(expr) return float(expr) def code(self, op): x = 0 letter = op[0] oplen = len(op) while letter <> " " and letter <> "\t": x += 1 if x == oplen: return op letter = op[x] opcode = op[:x] args = op[x + 1:] args = args.split(',') for x in range(len(args)): args[x] = args[x].replace(" ", "") args[x] = args[x].replace("\t", "") args[x] = args[x].replace("\n", "") return [opcode, args] def error(self, expr): print "%s on line %s" % (expr, self.ip) self.halt = 1 def decode(self, op): coded = self.code(op) if type(coded) is types.ListType: opcode = coded[0] args = coded[1] else: opcode = coded args = [] if opcode == "var": for arg in args: expr = arg.split("=") argnum = len(expr) if argnum == 1: if self.ident(expr): self.symbols[expr] == 0 else: self.error('SyntaxError: expected identifier') return elif argnum == 2: if expr[1] <> "": self.symbols[expr[0]] = self.numeric(expr[1]) else: self.error('SyntaxError: expected integer or float constant') return else: self.error('SyntaxError') return elif opcode == "sym_table_dump": print self.symbols def run(self, script): for op in script: self.decode(op) f = file('d:/source.bpl', 'r') script = [] while(1): a = f.readline() #print a if not a: break script.append(a) emu = emulator() emu.run(script)