Python:解释器说;无”;解析文件后
我用Python为自己创建的编程语言编写了一个简单的解释器。不过我有一个小问题:当我试图读取一个文件,以便可以解释代码时,Python会说Python:解释器说;无”;解析文件后,python,command-line-arguments,interpreter,Python,Command Line Arguments,Interpreter,我用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])
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
,没有使用它的返回值,并且假设self.parse
不输出任何内容,而read
不返回任何内容(None
),因此,您将获得无
您可能希望您的read
在每次迭代中yield self.parse(tokens[i])
,从而使其成为生成器,然后执行以下操作:
for data in interpret.read(str(code)):
print(data)
您的问题之一是这一行:
code = open(sys.argv[1], 'r')
open
返回文件对象,而不是文件内容。相反,要:
with open(sys.argv[1], 'r') as f:
code = f.read()
关于下一期:
for i in range(0, len(tokens)):
self.parse(tokens[i])
没有理由在len
的范围内进行迭代。只需迭代标记:
for token in tokens:
self.parse(token)
您的代码打印None
(正如ForceBru已经编写的那样)是因为您打印的是一个不返回任何内容的方法的返回值。直接调用explorate.read(str(code))
即可,无需将print
包装在其周围
应用所有这些修复程序后,要使代码正常工作,请执行ForceBru所说的操作并生成self.parse(token)
,或者出于测试目的,只需在parse
内部打印:
def parse(self, cmd):
if cmd.startswith("print(") and cmd.endswith(")"):
cmd = cmd[6:]
cmd = cmd[:-1]
print(cmd)
然后,您的代码在test.tl
文件中的print(Hi)\n
对我有效。谢谢您的帮助:)谢谢您的帮助,也谢谢您提供的额外提示:)