2017-01-13 3 views
5

मैं पाइथन के लिए एक सापेक्ष शुरुआत करने वाला हूं, और अपने कौशल को मजबूत करने के लिए, मैं Brainfu** भाषा के लिए एक कंपाइलर लिखने का प्रयास कर रहा हूं। ब्रैकेट [] लूप को छोड़कर सभी अच्छा है। कार्यक्रम मैं अपने कोड का परीक्षण करने का उपयोग कर रहा >++[>++<-]>+ है, जब मैं इस चलाने जो 5. करने के लिए सेल 2 स्थापित करना चाहिए, हालांकि, यह इस करता है:पायथन ब्रेनफ *** - लूप्स पर बग

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] 

(लाइनों चरण में स्वरूपित हैं, तो सूची उस बिंदु पर, तो यह है कि वह पर ध्यान केंद्रित है और फिर चरित्र यह चल रहा है।)

मेरे वर्तमान कोड

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

जैसा कि आपने इसे बताया था, 'रेंज (0, लेन (वर्ण)) पर पाइथन फिर से शुरू होता है। लूप में 'i' को संशोधित करने का कोई प्रभाव नहीं पड़ता है। – melpomene

उत्तर

5

मुझे लगता है समस्या अपने पाश चर i जो आप पाश के दौरान संशोधित है:

i += posOfEnd+1 

और

i = posOfBegin 

हालांकि अजगर for छोरों उनके C/C++ समकक्षों से अलग कर रहे हैं। पायथन में परिवर्तनीय i इसे प्रदान करने योग्य प्रत्येक तत्व के लिए सेट किया जाएगा, इस मामले में rangerange(n)0 से n-1 तक सभी संख्याओं वाली एक सूची का मूल्यांकन करता है। यदि आप पुनरावृत्ति के दौरान अपने लूप चर को संशोधित करते हैं तो यह संशोधन केवल उस पुनरावृत्ति के लिए बनी हुई है, लेकिन अगले पुनरावृत्ति के लिए लूप चर को पुनरावर्तनीय के अगले तत्व (आपके संशोधनों को संरक्षित नहीं) असाइन किया जाएगा।

आप इसके बजाय while लूप का उपयोग करना चाह सकते हैं।

संबंधित मुद्दे