2016-05-30 3 views
3

Я написал простой интерпретатор с Python для языка программирования, который я создал. У меня есть небольшая проблема: когда я пытаюсь прочитать файл, поэтому код можно интерпретировать, Python говорит None.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, но он не работает должным образом. Я думаю, что это имеет какое-то отношение к двум последним строкам кода интерпретатора, но я не совсем уверен.

ответ

1

Одна из ваших проблем эта линия:

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]) 

Там нет причин, чтобы перебрать range из более len, когда-либо. Просто перебирать лексем:

for token in tokens: 
    self.parse(token) 

, что ваш код печатает None (как ForceBru написал уже) в связи с тем, что вы печатаете возвращаемое значение метода, который не возвращает ничего. Просто позвоните 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) 

Тогда ваш код работает меня с print(Hi)\n в файле test.tl.

+0

Спасибо за помощь, а также за дополнительные советы :) – m654

3

Вы просто вызоваself.parse и не использует возвращаемое значение и, учитывая, что self.parse не выводит ничего и read возвращает ничего (None), вы получаете None в результате.

Вы можете ваш read к yield self.parse(tokens[i]) на каждой итерации, что делает его генератор, а затем сделать что-то вроде этого:

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

Спасибо за помощь :) – m654

Смежные вопросы