2016-05-30 5 views
3

私が作成したプログラミング言語のためにPythonで簡単なインタプリタを書いた。私は少し問題があります。ファイルを読み込もうとするとコードが解釈されるので、PythonはNoneと言っています。Python:ファイルを解析した後にインタプリタが「なし」と答えた

ここでインタプリタ・コードがあります:

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ですが、正しく動作しません。私はインタプリタコードの最後の2行と関係があると思いますが、完全にはわかりません。

答えて

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

これまで、lenrangeを反復処理する理由はありません。ただ、トークンを反復:それあなたのコードが印刷さNone

for token in tokens: 
    self.parse(token) 

を伴うあなたは何も返さないメソッドの戻り値を印刷しているという事実のために(ForceBruが既に書かれているように)です。 interpret.read(str(code))に直接printをラップせずに電話するだけです。すべてのこれらの修正プログラムを適用した後


、あなたのコードの作業は、テストの目的のために、ちょうどprintparseの内部を何ForceBruが言うとyield self.parse(token)を行い、どちらかにする:

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

を次に、あなたのコードは、のために働きます私はprint(Hi)\ntest.tlファイルです。

+0

助けてくれてありがとう、そして余分なヒントもありがとう:) – m654

3

あなただけself.parseは何も出力し、read何も返さない(None)、あなたは結果としてNoneを取得しているしないことを考えると、self.parseを呼び出し、その戻り値を使用していないとしています。

あなたはこのようにそれを発電機を作り、各反復であなたのreadyield self.parse(tokens[i])にしたいことがあり、その後、このような何か:

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

助けてくれてありがとう。 – m654

関連する問題