Skip to content

Instantly share code, notes, and snippets.

@harlanhaskins
Last active January 3, 2017 21:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save harlanhaskins/3465875af79e496949e4809f36700b38 to your computer and use it in GitHub Desktop.
Save harlanhaskins/3465875af79e496949e4809f36700b38 to your computer and use it in GitHub Desktop.
BF interpreter for the Trill iOS App
foreign type String {
foreign init(_: *Int8) -> String
foreign var length: Int
foreign func charCodeAt(_: Int) -> Int8
foreign static func fromCharCode(_: Int8) -> String
}
type Op {
let opcode: Int8
var operand: Int
}
foreign type Array {
foreign init(_: Int) -> Array
foreign subscript(_: Int) -> Any
foreign func fill(_: Any)
foreign func push(_: Any)
foreign func pop() -> Any
foreign var length: Int
}
func toBF(_ prog: *Int8) -> Array {
var str = String(prog)
var ops = Array(0)
var pcStack = Array(0)
for var i = 0; i < str.length; i += 1 {
let opcode = str.charCodeAt(i)
var op = Op(opcode: opcode,
operand: 0)
if opcode == '[' {
pcStack.push(i)
} else if opcode == ']' {
op.operand = pcStack.pop() as Int
var old = ops[op.operand] as Op
old.operand = i
ops[op.operand] = old
}
ops.push(op)
}
return ops
}
func runBF(_ ops: Array) {
var memory = Array(30000)
memory.fill(0)
var opcodeStack = Array(0)
var p = 0
var pc = 0
while pc < ops.length {
let op = ops[pc] as Op
switch op.opcode {
case '+':
memory[p] += 1
case '-':
memory[p] -= 1
case '<':
p -= 1
case '>':
p += 1
case '.':
let s = String.fromCharCode(memory[p] as Int8)
print(s)
case '[':
if memory[p] == 0 {
pc = op.operand
continue
}
case ']':
if memory[p] != 0 {
pc = op.operand
continue
}
}
pc += 1
}
}
func main() {
runBF(toBF("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>."))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment