2016-05-30 1 views
3

J'ai écrit un interpréteur simple avec Python pour un langage de programmation que j'ai créé. J'ai un petit problème cependant: quand j'essaie de lire un fichier, donc le code peut être interprété, Python dit None.Python: l'interpréteur dit "None" après l'analyse du fichier

Voici le code interprète:

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

Voici le code dans le fichier que je veux lire: print(Hi)\n (Oui, il y a une nouvelle ligne là-bas, pas les caractères \n)

Alors, voici ce qui est arrivé CMD:

> python interpreter.py test.tl 

None 

il doit générer Hi, mais il ne fonctionne pas correctement. Je pense que cela a quelque chose à voir avec les deux dernières lignes du code de l'interprète, mais je ne suis pas tout à fait sûr.

Répondre

1

L'un de vos problèmes est cette ligne:

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

open renvoie un objet fichier, pas le contenu du fichier. Au lieu de cela, faire:

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

Sur la question suivante:

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

Il n'y a aucune raison de itérer sur la range d'un len, jamais. Il suffit de parcourir les jetons:

for token in tokens: 
    self.parse(token) 

Que vos impressions de code None est (comme ForceBru a déjà écrit) en raison du fait que vous imprimez la valeur de retour d'une méthode qui ne retourne rien. Il suffit d'appeler le interpret.read(str(code)) directement, sans l'entourer de print.


Après avoir appliqué tous ces correctifs, pour rendre votre code de travail soit faire ce que ForceBru dit et yield self.parse(token), ou, à des fins de test juste print intérieur de parse:

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

Ensuite, votre code fonctionne pour moi avec print(Hi)\n dans le fichier test.tl.

+0

Merci pour l'aide, et aussi pour les conseils supplémentaires :) – m654

3

Vous êtes juste appelerself.parse et ne pas utiliser la valeur de retour et, étant donné que self.parse le fait, vous ne affiche rien et read rendement rien (None) se None en conséquence.

Vous pouvez votre read-yield self.parse(tokens[i]) à chaque itération, ce qui en fait un générateur, puis faire quelque chose comme ceci:

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

Merci pour l'aide :) – m654