Skip to content

Instantly share code, notes, and snippets.

@mrecachinas
Created June 6, 2014 04:46
Show Gist options
  • Save mrecachinas/7e2d49b23898b8409e3b to your computer and use it in GitHub Desktop.
Save mrecachinas/7e2d49b23898b8409e3b to your computer and use it in GitHub Desktop.
// First Brainf*** Interpreter in Swift
import Cocoa
func input() -> String {
var keyboard = NSFileHandle.fileHandleWithStandardInput()
var inputData = keyboard.availableData
return NSString(data: inputData, encoding:NSUTF8StringEncoding)
}
func interpret(program_str: String) {
var program = String[]()
for char in program_str {
program.append(String(char))
}
print(program)
var loop = Dictionary<Int, Int>(),
stack = Int[](),
ptr = 0,
pc = 0,
env = Dictionary<Int, Int>()
for (i, token) in enumerate(program) {
if token == "[" {
stack += i
}
if token == "]" {
if stack.isEmpty {
println("ERROR: Parser: Unmatched bracket at character \(i).")
exit(-1)
}
var end = stack.removeLast()
loop[end] = i
loop[i] = end
}
}
if !stack.isEmpty {
println("ERROR: Parser: \(stack.count) unterminated loop(s).")
exit(-1)
}
while pc < countElements(program) {
var token = program[pc]
if token == ">" {
ptr++
} else if token == "<" {
ptr--
} else if token == "+" {
env[ptr] = env[ptr]! + 1
} else if token == "-" {
env[ptr] = env[ptr]! - 1
} else if token == "." {
var c = String(env[ptr]!)
print(c)
} else if token == "," {
var in_str = input()
env[ptr] = in_str.toInt()
} else if (token == "[" && env[ptr] == 0) || (token == "]" && env[ptr] != 0) {
pc = loop[pc]!
}
pc++
}
}
interpret("++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment