Jump to content

Execute Brain****: Difference between revisions

updated syntax
(updated syntax)
Line 1,385:
=={{header|Arturo}}==
 
<lang arturo>/*********************************;
*; Brainf*ck compiler
*; In Art:uroArturo
;
*********************************/
 
Tape : #([0)]
DataPointer: :new 0
InstructionPointer: :new 0
 
//; Look for jumps in Code an register them
//; in the Jumps table
 
precomputeJumps: {function [][
vstack: new []
stack : #()
jumphash: :new #{}[]
instrPointer : 0
 
loopwhile [instrPointer<CodeLength] {[
command: [charsget split Code].[ instrPointer]
if? command="[" {-> stack:'vstack stack+instrPointer+ } {instrPointer
else if command="]" {[
if command="]" target: last stack[
deleteBytarget: stacklast [size stack]-1vstack
jumphash.[toStringchop target]: instrPointer'vstack
set jumphash.[toString instrPointer]: target instrPointer
} set jumphash instrPointer target
} ]
}]
instrPointer: instrPointer+1
}]
jumphash
]
}
 
//; Check if current state is valid
 
StateIsValid: function [][
StateIsValid: -> all #(0<=DataPointer DataPointer<[size Tape] 0<=InstructionPointer InstructionPointer<CodeLength)
all? @[
 
0 =< Tape.DataPointer: inp
// Compile the program
DataPointer < size Tape
 
InstructionPointer:0 =< InstructionPointer+1
interpret: {
InstructionPointer < CodeLength
loop [StateIsValid ~] {
}]
command: [chars Code].[InstructionPointer]
]
if command="+" -> Tape.[DataPointer]: Tape.[DataPointer]+1
if command="-" -> Tape.[DataPointer]: Tape.[DataPointer]-1
if command=">" { DataPointer: DataPointer+1, if DataPointer=[size Tape] -> Tape: Tape+0 }
if command="<" -> DataPointer: DataPointer-1
if command="." -> prints [char Tape.[DataPointer]]
if command="," {
inp: toNumber|input ~
if inp=13 { inp: 10 }
if inp=3 { panic "something went wrong!" }
Tape.DataPointer: inp
}
if command="[" {
if Tape.[DataPointer]=0 -> InstructionPointer: Jumps.[toString InstructionPointer]
}
if command="]" {
if Tape.[DataPointer]!=0 -> InstructionPointer: Jumps.[toString InstructionPointer]
}
 
//; Compile the program
InstructionPointer: InstructionPointer+1
}
interpret: function [].export:[DataPointer,InstructionPointer,Tape][
}
loopwhile [StateIsValid ~] {[
command: [charsget split Code].[ InstructionPointer]
ifcase [command="," {]
if command= when? ["+"] -> set Tape.[ DataPointer]: (Tape.[ \ DataPointer])+1
if command= when? ["-"] -> set Tape.[ DataPointer]: (Tape.[ \ DataPointer])-1
Code :when? read[">"] &0[
inc 'DataPointer
if command=">" { DataPointer: DataPointer+1, if DataPointer =[ size Tape] -> Tape: Tape ++0 }0
} ]
if command= when? ["<"] -> DataPointer:dec 'DataPointer-1
if command= when? ["."] -> prints [to :string to :char Tape.[ \ DataPointer]]
when? [","][
inp: toNumber|to :integer input ~""
if inp=13 {-> inp: 10 }
if inp=3 {-> panic "something went wrong!" }
set Tape DataPointer inp
} ]
if command= when? ["["] {->
if 0 = get Tape.[ DataPointer]=0 ->[ InstructionPointer: new get Jumps.[toString InstructionPointer ]
 
if command= when? ["]"] {->
if [size &]<1 -> panic "Not enough arguments - Usage: bfc <script>"
if 0 <> get Tape DataPointer [
if Tape.[DataPointer]!=0 -> InstructionPointer: new get Jumps.[toString InstructionPointer]
stack : #()]
inc 'InstructionPointer
]
]
Code: ""
if? 1>size arg -> Code: "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>."
else -> Code: read arg\0
 
CodeLength : size Code
Code : read &0
Jumps : precomputeJumps ~
CodeLength : size Code
Jumps : precomputeJumps ~
 
interpret ~</lang>
</lang>
 
{{in}}
1,532

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.