Python:解释器在解析文件后说 "None"

Python: interpreter says "None" after parsing file

我用 Python 为我创建的编程语言编写了一个简单的解释器。不过我有一个小问题:当我尝试读取文件时,可以解释代码,Python 说 None

这是解释器代码:

import sys

class Interpret:
    def read(self, cmd):
        tokens = cmd.split("\n")
        for i in range(0, len(tokens)):
            self.parse(tokens[i])

    def parse(self, cmd):
        if cmd.startswith("print(") and cmd.endswith(")"):
            cmd = cmd[6:]
            cmd = cmd[:-1]
            return(cmd)

interpret = Interpret()

code = open(sys.argv[1], 'r')
print(interpret.read(str(code)))

这是我要读取的文件中的代码:print(Hi)\n(是的,那里有一个换行符,而不是字符 \n

所以,这是在 CMD 中发生的事情:

> python interpreter.py test.tl

None

它应该输出Hi,但它不能正常工作。我认为这与解释器代码的最后两行有关,但我不确定。

你只是 调用 self.parse 而没有使用它的 return 值,并且假设 self.parse 没有输出任何东西并且read return 什么都没有 (None),结果是 None

您可能希望在每次迭代时将 read 变为 yield self.parse(tokens[i]),从而使其成为生成器,然后执行如下操作:

for data in interpret.read(str(code)):
    print(data)

你的问题之一是这一行:

code = open(sys.argv[1], 'r')

open return是一个文件对象,不是文件的内容。相反,做:

with open(sys.argv[1], 'r') as f:
    code = f.read()

下一期:

for i in range(0, len(tokens)):
    self.parse(tokens[i])

永远没有理由迭代 lenrange。只需遍历标记:

for token in tokens:
    self.parse(token)

您的代码打印 None 是(正如 ForceBru 已经写过的那样)是因为您正在打印 return 什么都没有的方法的 return 值。直接调用 interpret.read(str(code)),而不用 print 环绕它。


应用所有这些修复后,要使您的代码正常工作,请按照 ForceBru 和 yield self.parse(token) 的说明进行操作,或者出于测试目的,仅 printparse:

def parse(self, cmd):
    if cmd.startswith("print(") and cmd.endswith(")"):
        cmd = cmd[6:]
        cmd = cmd[:-1]
        print(cmd)

然后,你的代码在 test.tl 文件中与 print(Hi)\n 一起工作。