2017-01-13 10 views
5

나는 필자의 기술을 강화하기 위해 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입니다 사전이 어디 있는지 알아 내라. 큰 괄호입니다. for 루프가 C/C++ 대응 다릅니다

i += posOfEnd+1 

i = posOfBegin 

그러나 파이썬 :

+2

파이썬이'range (0, len (chars)) '를 반복하는 것처럼 보입니다. 루프에서 'i'를 수정해도 아무 효과가 없습니다. – melpomene

답변

5

나는 문제가 당신이 루프 동안 수정 루프 변수 i 가정하자. 파이썬에서 변수 i은 사용자가 제공하는 반복 가능 요소의 각 요소 (이 경우 range)로 설정됩니다. range(n)0부터 최대 n-1까지의 모든 숫자를 포함하는 목록으로 평가됩니다. 반복 중에 루프 변수를 수정하면이 수정은 해당 반복에만 유지되지만 다음 반복에서는 반복 변수의 다음 요소가 루프 변수에 할당됩니다 (수정 내용은 유지되지 않음).

대신 while 루프를 사용할 수 있습니다.