73 lines
1.7 KiB
Plaintext
73 lines
1.7 KiB
Plaintext
// nanoquery has no function to get just a character
|
|
// so we have to implement our own
|
|
def get_char()
|
|
c = ""
|
|
while len(c)=0
|
|
c = input()
|
|
end
|
|
return c[0]
|
|
end
|
|
|
|
// a function to handle fatal errors
|
|
def fatal_error(errtext)
|
|
println "%" + errtext
|
|
println "usage: " + args[1] + " [filename.bf]"
|
|
exit
|
|
end
|
|
|
|
// get a filename from the command line and read the file in
|
|
fname = null
|
|
source = null
|
|
try
|
|
fname = args[2]
|
|
source = new(Nanoquery.IO.File, fname).readAll()
|
|
catch
|
|
fatal_error("error while trying to read from specified file")
|
|
end
|
|
|
|
// start with one hundred cells and the pointer at 0
|
|
cells = {0} * 100
|
|
ptr = 0
|
|
|
|
// loop through the instructions
|
|
loc = 0
|
|
while loc < len(source)
|
|
instr = source[loc]
|
|
|
|
if instr = ">"
|
|
ptr += 1
|
|
if ptr = len(cells)
|
|
cells.append(0)
|
|
end
|
|
else if instr = "<"
|
|
ptr -= 1
|
|
if ptr < 0
|
|
ptr = 0
|
|
end
|
|
else if instr = "+"
|
|
cells[ptr] += 1
|
|
else if instr = "-"
|
|
cells[ptr] -= 1
|
|
else if instr = "."
|
|
print chr(cells[ptr])
|
|
else if instr = ","
|
|
cells[ptr] = ord(get_char())
|
|
else if instr = "["
|
|
if cells[ptr] = 0
|
|
while source[loc] != "]"
|
|
loc += 1
|
|
end
|
|
end
|
|
else if instr = "]"
|
|
if cells[ptr] != 0
|
|
while source[loc] != "["
|
|
loc -= 1
|
|
end
|
|
end
|
|
else
|
|
// do nothing
|
|
end
|
|
|
|
loc += 1
|
|
end
|