2012-04-09 14 views
0

非常に単純な言語文法のためにPythonでインタープリタを作成しています。私はいくつかの子クラスを持つStatementと呼ばれるスーパークラスを持っています。私は、キーワードを評価するCreateStatementと呼ばれるスーパークラスのメソッドを持っており、見つかったキーワードに基づいて子クラスオブジェクトのインスタンスを作成します。子クラスの中には、このメソッドを呼び出す必要があるものがあります。オブジェクトを作成し、Pythonのキーワードに基づいてメソッドを呼び出す

AttributeError: 'Statement' object has no attribute 'Assignment' 

ヘルプ:

私の問題は、私はこのエラーを取得していますということです!

import re 
from TokenHandler import TokenHandler 
from ParserException import ParserException 

class Statement(object): 

    tokens = [] 
    executedTokens = [] 

    def __init__(self, tokenlist): 
     self.tokens = tokenlist 

    def getCurrentToken(self): 
     print self.tokens[0] 
     return self.tokens[0] 

    def createStatement(self): 
     currenttoken = self.getCurrentToken() 

     t = TokenHandler() 

     if currenttoken == "print": 
      p = Print(self.tokens) 
      return p 

     elif t.isVariable(currenttoken): 
      a = Assignment(self.tokens) 
      return a 

     elif currenttoken == "if": 
      i = IF(self.tokens) 
      return i 

     elif currenttoken == "while": 
      w = While(self.tokens) 
      return w 

     elif currenttoken == "begin": 
      s = self.CompoundStatement(self.tokens) 
      return s 

     else: 
      raise ParserException('Reserved word \'end\' expected') 

    #...other methods... 

from Statement import Statement 
from TokenHandler import TokenHandler 
import VariableException 

class Assignment(Statement): 

    def __init__(self, tokens = []): 
     super(Assignment, self).__init__(tokens) 

    #...other methods... 
+0

ので、あなたがStatement' '内に存在する割り当てと呼ばれる属性を定義したが、あなたはどのようにクラスを示していないことを期待していた:あなたはこの行はおそらく同様に間違っている

a = Assignment(self.tokens) 

をもしかして内部にどのメソッドとデータフィールドがあるかを含む 'Statement'が定義されています。 –

+0

あなたはこの種のもののために作られたPLYを見たいかもしれません (http://www.dabeaz.com/ply/) –

+0

将来的にもっとコードを入れてください。このエラーは、 'Statement'の属性を参照しようとする行で発生しますが、' Statement'(またはその完全定義)の属性のリストは提供しません。あなたはまた、この「割り当て」があなたが参照しようとしていることを私たちに示さない。 – agf

答えて

2
a = self.Assignment(self.tokens) 

Assignmentはモジュールレベルで定義されたサブクラスはなくStatementクラスの属性またはselfインスタンスである場合に間違っています。

s = self.CompoundStatement(self.tokens) 
+0

はい、 'Assignment'は' Statement'インスタンスですが、 'self'を削除すると未定義の変数エラーが発生します。 –

+0

@deuteros 'Assignment'とは何ですか?あなたは私たちにラインが何であるかを知るための十分なコードを与えておらず、まさにそうであるべきものではありません。 – agf

+0

@deuteros 'self'は' Statement'インスタンスです。あなたは 'Assignment'が' Statement'サブクラスであることを意味しますか?それらは同じものではありません。 – agf

関連する問題