为了执行操作码,而这个操作码并非实际意义上的操作码,它只是一种动态类型,所以我们建立一个dispatch 函数,在这之前,我们创建一个解释器的循环。
def run(self): # 代码运行的条件
while self.instruction_pointer < len(self.code):
opcode = self.code[self.instruction_pointer]
self.instruction_pointer += 1
self.dispatch(opcode)
它的原理很简单: 获取下一个指令,指令指针自增1 然后基于操作码执行dispatch 函数,下面就是dispatch函数的定义。而对解释器的扩展增强基本在这个函数中实现。
def dispatch(self, op):
dispatch_map = {
"%": self.mod,
"*": self.mul,
"+": self.plus,
"-": self.minus,
"/": self.div,
"==": self.eq,
"cast_int": self.cast_int,
"cast_str": self.cast_str,
"drop": self.drop,
"dup": self.dup,
"if": self.if_stmt,
"jmp": self.jmp,
"over": self.over,
"print": self.print_,
"println": self.println,
"read": self.read,
"stack": self.dump_stack,
"swap": self.swap,
}
if op in dispatch_map:
dispatch_map[op]()
elif isinstance(op, int): # 如果指令是整形数据,就将数据存放到数据栈中
self.push(op)
elif isinstance(op, str) and op[0]==op[-1]=='"':
# 如果是字符串类型,就将字符串内容存放到数据栈中
self.push(op[1:-1])
else:
raise RuntimeError( "Unknown opcode: '%s'" % op)
上边的指令的意思是,当输入一段指令后,该函数就会根据这段指令在字典中找到对应的方法。比如符号*对应的是self.mul 。而这个self.mul 也是我们定义的函数:
def mul(self):
self.push(self.pop() * self.pop())
其他的函数定义也如此。
搭建好环境之后,下面继续进行。一个语言解释器包括两个部分:
解析:解析部分接受一个由字符序列表示的输入指令,然后将输入字符分解成一系列的词法单元
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-34020-3.html
加油
这样才真正划清12海里
不同的人标准就不同