github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/examples/gno.land/p/demo/bf/bf.gno (about) 1 package bf 2 3 import ( 4 "strings" 5 ) 6 7 const maxlen = 30000 8 9 func Execute(code string) string { 10 var ( 11 memory = make([]byte, maxlen) // memory tape 12 pointer = 0 // initial memory pointer 13 buf strings.Builder 14 ) 15 16 // Loop through each character in the code 17 for i := 0; i < len(code); i++ { 18 switch code[i] { 19 case '>': 20 // Increment memory pointer 21 pointer++ 22 if pointer >= maxlen { 23 pointer = 0 24 } 25 case '<': 26 // Decrement memory pointer 27 pointer-- 28 if pointer < 0 { 29 pointer = maxlen - 1 30 } 31 case '+': 32 // Increment the byte at the memory pointer 33 memory[pointer]++ 34 case '-': 35 // Decrement the byte at the memory pointer 36 memory[pointer]-- 37 case '.': 38 // Output the byte at the memory pointer 39 buf.WriteByte(memory[pointer]) 40 case ',': 41 // Input a byte and store it in the memory 42 panic("unsupported") 43 // fmt.Scan(&memory[pointer]) 44 case '[': 45 // Jump forward past the matching ']' if the byte at the memory pointer is zero 46 if memory[pointer] == 0 { 47 braceCount := 1 48 for braceCount > 0 { 49 i++ 50 if code[i] == '[' { 51 braceCount++ 52 } else if code[i] == ']' { 53 braceCount-- 54 } 55 } 56 } 57 case ']': 58 // Jump backward to the matching '[' if the byte at the memory pointer is nonzero 59 if memory[pointer] != 0 { 60 braceCount := 1 61 for braceCount > 0 { 62 i-- 63 if code[i] == ']' { 64 braceCount++ 65 } else if code[i] == '[' { 66 braceCount-- 67 } 68 } 69 i-- // Move back one more to compensate for the upcoming increment in the loop 70 } 71 } 72 } 73 return buf.String() 74 }