/node-brainfuck

a tiny BrainFuck implement written in CoffeeScript

Primary LanguageCoffeeScript

node-brainfuck

a tiny BrainFuck implement written in CoffeeScript

exports.run = (source) ->
  throw new Error 'invalid source' unless typeof(source) is 'string'
  throw new Error "invalid char '#{m[0]}'" if (m=/[^+-.<>[\]]/.exec source)?
  [i,buf,jmp] = [0,[],[]]
  for ch,p in source when ch is '[' or ch is ']'
    switch ch
      when '[' then buf[i++]=p
      when ']'
        if buf[i-1]?
          jmp[buf[--i]]=p
          jmp[p]=buf[i]
          delete buf[i]
        else
          throw new Error "unexpect ']' at pos #{p}"
  unless i is 0
    throw new Error "expect ']' to match '[' at pos #{buf[i-1]}"
  [p,len]=[-1,source.length]
  while ++p<len
    ch = source[p]
    switch ch
      when '+' then buf[i]=(buf[i] ? 0)+1
      when '-' then buf[i]=(buf[i] ? 0)-1
      when '>' then ++i
      when '<' then --i
      when '.' then process.stdout.write String.fromCharCode buf[i] ? 0x30
      when '[' then p=jmp[p] if not buf[i]? or buf[i] is 0
      when ']' then p=jmp[p] if buf[i]? and buf[i] isnt 0

exports.run "++++++++++[>++++++++++<-]>++++.+."  # print "hi"