init
This commit is contained in:
commit
f606d5c1ea
169
main.is
Normal file
169
main.is
Normal file
|
@ -0,0 +1,169 @@
|
||||||
|
// run a brainfuck program
|
||||||
|
@runProgram(code, input, mem_size) {
|
||||||
|
var pointer = 0
|
||||||
|
var input_index = 0
|
||||||
|
var memory = []
|
||||||
|
var front_brackets = []
|
||||||
|
var back_brackets = []
|
||||||
|
var code_arr = code.to_arr()
|
||||||
|
var input_arr = input.to_arr()
|
||||||
|
|
||||||
|
// initialize memory
|
||||||
|
for mem_size {
|
||||||
|
memory.push(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// compress the code (remove all plain texts)
|
||||||
|
var compressed = []
|
||||||
|
|
||||||
|
for let i, code.len {
|
||||||
|
if "+-><.,[]".index_of(code_arr[i]) != -1 {
|
||||||
|
compressed.push(code_arr[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
code_arr = compressed
|
||||||
|
|
||||||
|
// find positions of brackets
|
||||||
|
var brackets_stack = []
|
||||||
|
|
||||||
|
for let i, code_arr.len {
|
||||||
|
var command = code_arr[i]
|
||||||
|
|
||||||
|
if command == "[" {
|
||||||
|
brackets_stack.push(i)
|
||||||
|
} elif command == "]" {
|
||||||
|
if brackets_stack.len == 0 {
|
||||||
|
Mk:dialog("Syntex error", "Brackets not matched.")
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
front_brackets.push(brackets_stack[brackets_stack.len - 1])
|
||||||
|
back_brackets.push(i)
|
||||||
|
brackets_stack.pop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if brackets_stack.len != 0 {
|
||||||
|
Mk:dialog("Syntex error", "Brackets not matched.")
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
// run the program
|
||||||
|
var i = 0
|
||||||
|
var output = ""
|
||||||
|
|
||||||
|
loop {
|
||||||
|
// var continue = false
|
||||||
|
var command = code_arr[i]
|
||||||
|
|
||||||
|
if command == "+" {
|
||||||
|
if memory[pointer] == 255 {
|
||||||
|
memory[pointer] = 0
|
||||||
|
} else {
|
||||||
|
memory[pointer] = memory[pointer] + 1
|
||||||
|
}
|
||||||
|
} elif command == "-" {
|
||||||
|
if memory[pointer] == 0 {
|
||||||
|
memory[pointer] = 255
|
||||||
|
} else {
|
||||||
|
memory[pointer] = memory[pointer] - 1
|
||||||
|
}
|
||||||
|
} elif command == ">" {
|
||||||
|
if pointer == mem_size - 1 {
|
||||||
|
pointer = 0
|
||||||
|
} else {
|
||||||
|
pointer = pointer + 1
|
||||||
|
}
|
||||||
|
} elif command == "<" {
|
||||||
|
if pointer == 0 {
|
||||||
|
pointer = mem_size - 1
|
||||||
|
} else {
|
||||||
|
pointer = pointer - 1
|
||||||
|
}
|
||||||
|
} elif command == "." {
|
||||||
|
// print(Str:from_utf8_bytes([memory[pointer]]))
|
||||||
|
output = `{output}{Str:from_utf8_bytes([memory[pointer]])}`
|
||||||
|
} elif command == "," {
|
||||||
|
if input_index < input_arr.len {
|
||||||
|
memory[pointer] = input_arr[input_index].charcode_at(0)
|
||||||
|
input_index = input_index + 1
|
||||||
|
}
|
||||||
|
} elif command == "[" {
|
||||||
|
if memory[pointer] == 0 {
|
||||||
|
var tmp = 0
|
||||||
|
for let j, front_brackets.len {
|
||||||
|
if front_brackets[j] == i {
|
||||||
|
tmp = j
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i = back_brackets[tmp]
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
} elif command == "]" {
|
||||||
|
if memory[pointer] != 0 {
|
||||||
|
var tmp = 0
|
||||||
|
for let j, back_brackets.len {
|
||||||
|
if back_brackets[j] == i {
|
||||||
|
tmp = j
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i = front_brackets[tmp]
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i = i + 1
|
||||||
|
|
||||||
|
if i == code_arr.len {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Mk:dialog("Output", output)
|
||||||
|
}
|
||||||
|
|
||||||
|
var code = "-[------->+<]>.-[->++++<]>.++++.[++++>---<]>.[->++++<]>--.-----.+++++++..-[--->+<]>.-[---->+<]>++.++[--->++<]>.+++.+++++++.+[->+++<]>.--------.[--->+<]>+.+++.-[->++<]>-.+[-->+++<]>++.---.+++++++++++++..+++++++.-[--->++<]>.--[--->++++<]>+.------.++++++++."
|
||||||
|
var input = ""
|
||||||
|
var mem_size = 30000
|
||||||
|
|
||||||
|
@loading() {
|
||||||
|
Ui:render([
|
||||||
|
Ui:C:mfm({ text: "<center>Loading... :bunhd_hop:</center>" })
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
@editor() {
|
||||||
|
Ui:render([
|
||||||
|
Ui:C:textarea({
|
||||||
|
label: "Your BF Code"
|
||||||
|
default: code
|
||||||
|
onInput: @(v) { code = v }
|
||||||
|
})
|
||||||
|
|
||||||
|
Ui:C:textInput({
|
||||||
|
label: "Input"
|
||||||
|
default: input
|
||||||
|
onInput: @(v) { input = v }
|
||||||
|
})
|
||||||
|
|
||||||
|
Ui:C:textInput({
|
||||||
|
label: "Memory Size"
|
||||||
|
default: `{mem_size}`
|
||||||
|
onInput: @(v) { mem_size = v.to_num() }
|
||||||
|
})
|
||||||
|
|
||||||
|
Ui:C:button({
|
||||||
|
text: "Execute"
|
||||||
|
onClick: @() {
|
||||||
|
loading()
|
||||||
|
runProgram(code, input, mem_size)
|
||||||
|
editor()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
editor()
|
Loading…
Reference in a new issue