2016-05-30 12 views
3

Ich habe einen einfachen Interpreter mit Python für eine Programmiersprache, die ich erstellt habe geschrieben. Ich habe jedoch ein kleines Problem: Wenn ich versuche, eine Datei zu lesen, damit der Code interpretiert werden kann, sagt Python None.Python: Interpreter sagt "None" nach Parsing-Datei

Hier ist der Interpreter-Code:

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

Hier ist der Code in der Datei, die ich lesen will: print(Hi)\n (Ja, es gibt ein Newline ist, nicht die Zeichen \n)

, also hier, was passiert ist in CMD:

> python interpreter.py test.tl 

None 

sollte es Ausgang Hi, aber es nicht richtig funktioniert. Ich denke, es hat etwas mit den letzten zwei Zeilen des Interpreter-Codes zu tun, aber ich bin mir nicht ganz sicher.

Antwort

1

Eines Ihrer Probleme ist diese Zeile:

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

open gibt ein Dateiobjekt zurück, nicht den Inhalt der Datei. Stattdessen tun:

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

Auf zur nächsten Frage:

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

Es gibt keinen Grund über die range ein len iterieren, je. iterieren nur über die Token:

for token in tokens: 
    self.parse(token) 

, dass Ihr Code druckt None (wie ForceBru schon geschrieben hat) aufgrund der Tatsache, dass Sie den Rückgabewert einer Methode sind Druck, die nichts zurückgibt. Rufen Sie einfach interpret.read(str(code)) direkt an, ohne print darum herum zu wickeln.


Nachdem all diese Korrekturen Anwendung Code Arbeit zu machen entweder tun, was ForceBru sagt und yield self.parse(token), oder zu Testzwecken nur print innerhalb von parse:

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

Dann Ihr Code funktioniert für Ich mit print(Hi)\n in der test.tl Datei.

+0

Danke für die Hilfe und auch für die zusätzlichen Tipps :) – m654

3

Sie sind nur Aufrufself.parse und nicht den Rückgabewert verwenden und, da self.parse nichts ausgibt und read kehrt nichts (None), sind Sie None als Ergebnis zu bekommen.

Sie möchten Ihre read-yield self.parse(tokens[i]) bei jeder Iteration, damit es einen Generator zu machen, und dann so etwas tun:

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

Danke für die Hilfe :) – m654

Verwandte Themen