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])
永远没有理由迭代 len
的 range
。只需遍历标记:
for token in tokens:
self.parse(token)
您的代码打印 None
是(正如 ForceBru 已经写过的那样)是因为您正在打印 return 什么都没有的方法的 return 值。直接调用 interpret.read(str(code))
,而不用 print
环绕它。
应用所有这些修复后,要使您的代码正常工作,请按照 ForceBru 和 yield self.parse(token)
的说明进行操作,或者出于测试目的,仅 print
在 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
一起工作。
我用 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])
永远没有理由迭代 len
的 range
。只需遍历标记:
for token in tokens:
self.parse(token)
您的代码打印 None
是(正如 ForceBru 已经写过的那样)是因为您正在打印 return 什么都没有的方法的 return 值。直接调用 interpret.read(str(code))
,而不用 print
环绕它。
应用所有这些修复后,要使您的代码正常工作,请按照 ForceBru 和 yield self.parse(token)
的说明进行操作,或者出于测试目的,仅 print
在 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
一起工作。