2017-01-13 8 views
5

私はPythonの相対的な初心者です。私のスキルを強化するために、私はBrainfu**言語用のコンパイラを作成しようとしています。ブラケット[]ループを除き、すべてが良好です。Python Brainf *** - whileループのバグ

0 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0 > 
1 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1 + 
2 [0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2 + 
3 [0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2 [ 
4 [0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0 > 
5 [0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1 + 
6 [0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2 + 
7 [0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2 < 
8 [0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1 - 
3 [0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1 [ 
10 [0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2 > 
11 [0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 3 + 
[0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

(行が反復でフォーマットされ、そのリスト:私は自分のコードをテストするために使用していたプログラムは、私はこれを実行すると、それはこのない、しかし、5にセル2を設定すべき、>++[>++<-]>+ですその時点で、その値は、それがに焦点を当てていますし、それを実行している文字。)

私の現在のコードは

def generateArray(code): 
    array = [] 
    for i in range(0,20): 
     array.append(0); 
    return array 

def run(code): 
    print code 
    data = generateArray(code) 
    chars = list(code) 
    pointer = 0 

    for i in range(0, len(chars)): 
     current = chars[i] 
     if(current == "+"): 
      data[pointer] += 1 

     if(current == ">"): 
      pointer += 1 

     if(current == "-"): 
      data[pointer] -= 1 

     if(current == "<"): 
      pointer -= 1 

     if(current == "."): 
      print str(chr(data[pointer])) 

     if(current == ","): 
      given = raw_input() 
      data[pointer] = ord(given) 

     if(current == "["): 
      posOfEnd = chars[i:len(chars)].index("]") 
      if(data[pointer] == 0): 
       i += posOfEnd+1 

     if(current == "]"): 
      posOfBegin = len(chars) - 1 - chars[::-1].index('[') 
      i = posOfBegin 



     print i, data, data[pointer], chars[i] 

    return data 

print run(">++[>++<-]>+") 

posOfEndで次のブラケットがどこにあるかを見つけるためにしようとしている、とposOfBeginをしようとしています前の場所を見つける大量のブラケットがあります。

+2

あなたが言ったように、pythonのように 'range(0、len(chars))'を繰り返します。ループの 'i'を変更しても効果はありません。 – melpomene

答えて

5

私は問題はあなたがループ中に修正するあなたのループ変数iであると仮定します

i += posOfEnd+1 

i = posOfBegin 

しかしパイソンforループは自分のC/C++対応は異なっています。 Pythonでは、変数iは、それを提供するiterableの各要素(この場合はrange)に設定されます。 range(n)は、0からn-1までのすべての数字を含むリストに評価されます。反復中にループ変数を変更した場合、この変更はその反復のみに残りますが、次の反復では、ループ変数に反復可能な次の要素が割り当てられます(変更内容は保持されません)。

代わりにwhileループを使用します。