:: Игры Разума
Интерпретатор BrainFuck на VFP 9
h.i.a.
Автор

Сообщений: 4002
Откуда: Мурманск/Спб/Мск
Дата регистрации: 18.11.2005
Не знаю в какой раздел форума поместить, пусть будет здесь. Забавы ради на коленке набросал реализацию на фоксе интерпретатора эзотерического языка BrainFuck.. До коробочной версии далеко но вполне работающее поделие получилось [sm128]. Как работает: копипастим исходник на BrainFuck во вкладку "Исходный код", далее кликаем кнопку "Run". Весь Output программы отправляется во вкладку Консоль, ошибки рантайма попадают в лог, реализована также защита от ухода программы в бесконечный цикл. Некоторые программы во время работы запрашивают данные (один ASCII символ за раз), тогда появляется соответствующее окно с запросом ввода.

* Интерпретатор Brainfuck для VFP 9.0
public go_BrainFuck
go_BrainFuck=CREATEOBJECT("BF_Form")
WITH go_BrainFuck
.addobject("but_run","BF_Run")
.but_run.top=.height-30
.but_run.left=.width-140
.but_run.anchor=12
.but_run.visible=.t.
.addobject("but_close","BF_Close")
.but_close.top=.height-30
.but_close.left=.width-70
.but_close.anchor=12
.but_close.visible=.t.
.addobject("pf","pageframe")
.pf.top=2
.pf.left=2
.pf.width=.width-4
.pf.height=.height-40
.pf.pagecount=3
.pf.tabstyle=1
.pf.anchor=75
.pf.page1.caption="Исходный код"
.pf.page2.caption="Консоль"
.pf.page3.caption="Лог ошибок"
.pf.visible=.t.
.pf.page1.addobject("code","BF_Edit")
.pf.page1.code.top=2
.pf.page1.code.left=2
.pf.page1.code.width=.pf.width-6
.pf.page1.code.height=630
.pf.page1.code.anchor=75
.pf.page1.code.visible=.t.
.pf.page2.addobject("console","BF_Edit")
.pf.page2.console.top=2
.pf.page2.console.left=2
.pf.page2.console.width=.pf.width-6
.pf.page2.console.height=630
.pf.page2.console.anchor=75
.pf.page2.console.readonly=.t.
.pf.page2.console.value="Ready to Rock!"
.pf.page2.console.disabledbackcolor=RGB(0,0,0)
.pf.page2.console.disabledforecolor=RGB(0,222,0)
.pf.page2.console.forecolor=RGB(0,222,0)
.pf.page2.console.visible=.t.
.pf.page3.addobject("log","BF_Edit")
.pf.page3.log.top=2
.pf.page3.log.left=2
.pf.page3.log.width=.pf.width-6
.pf.page3.log.height=630
.pf.page3.log.anchor=75
.pf.page3.log.readonly=.t.
.pf.page3.log.disabledbackcolor=RGB(0,0,0)
.pf.page3.log.disabledforecolor=RGB(222,0,0)
.pf.page3.log.forecolor=RGB(222,0,0)
.pf.page3.log.value="Ошибок нет."
.pf.page3.log.visible=.t.
ENDWITH
go_BrainFuck.show()
RETURN .t.
DEFINE CLASS BF_Form as Form
caption="Интерпретатор BrainFuck для VFP 9.0 / ver 0.03 / © 2016 h.i.a."
width=1000
height=700
autocenter=.t.
err_count=0
PROCEDURE brainfuck
this.err_count=0
this.pf.activepage=2
this.pf.page2.console.reset()
this.pf.page3.log.reset()
IF EMPTY(this.get_code())
this.err("Нет исходного кода, нечего обрабатывать...",.t.)
RETURN .f.
ENDIF
LOCAL ln_sec,ln_max_error_count,ln_max_cycle,ln_cycle_count,ls_13
m.ls_13=CHR(13)
m.ln_sec=SECONDS()
m.ln_max_error_count=100
m.ln_max_cycle=5000000
m.ln_cycle_count=0
LOCAL ARRAY la_memory[30000]
STORE 0 TO m.la_memory
LOCAL ls_code, ln_len, ln_i, ls_char, ln_addres, ln_while_counter
m.ls_code=ALLTRIM(this.get_code())
m.ln_len=LEN(m.ls_code)-1
m.ln_addres=0
m.ln_while_counter=0
m.ln_err=0
FOR m.ln_i=0 TO m.ln_len
m.ln_cycle_count=m.ln_cycle_count+1
m.ls_char=SUBSTR(m.ls_code,m.ln_i+1,1)
DO case
CASE m.ls_char=='>'
IF m.ln_addres>=30000
this.err("Ошибка: Переполнение команды >")
else
m.ln_addres=m.ln_addres+1
endif
CASE m.ls_char=='<'
IF m.ln_addres<=0
this.err("Ошибка: Переполнение команды <")
else
m.ln_addres=m.ln_addres-1
endif
CASE m.ls_char=='+'
IF m.la_memory[m.ln_addres+1]>=255
this.err("Ошибка: Переполнение команды +")
else
m.la_memory[m.ln_addres+1]=m.la_memory[m.ln_addres+1]+1
endif
CASE m.ls_char=='-'
IF m.la_memory[m.ln_addres+1]<=0
this.err("Ошибка: Переполнение команды - ")
else
m.la_memory[m.ln_addres+1]=m.la_memory[m.ln_addres+1]-1
endif
CASE m.ls_char=='.'
m.ln_cycle_count=0
this.console(CHR(m.la_memory[m.ln_addres+1]))
IF INLIST(m.la_memory[m.ln_addres+1],10,13)
this.pf.page2.console.setfocus()
KEYBOARD '{DNARROW}' plain
DOEVENTS
endif
CASE m.ls_char==','
m.ln_cycle_count=0
m.la_memory[m.ln_addres+1]=ASC(INPUTBOX("Ввведите любой ASCII символ","BrainFuck",""))
CASE m.ls_char=='['
IF m.la_memory[m.ln_addres+1]=0
m.ln_while_counter=1
DO while m.ln_while_counter>0
m.ln_i=m.ln_i+1
IF m.ln_i>30000
this.err("Ошибка: Переполнение цикла [")
exit
endif
DO CASE
CASE SUBSTR(m.ls_code,m.ln_i+1,1)=='['
m.ln_while_counter=m.ln_while_counter+1
CASE SUBSTR(m.ls_code,m.ln_i+1,1)==']'
m.ln_while_counter=m.ln_while_counter-1
endcase
m.ln_cycle_count=m.ln_cycle_count+1
ENDDO
endif
CASE m.ls_char==']'
IF m.la_memory[m.ln_addres+1]<>0
m.ln_while_counter=1
DO while m.ln_while_counter>0
m.ln_i=m.ln_i-1
IF m.ln_i<0
this.err("Ошибка: Переполнение при выходе из цикла ]")
exit
endif
DO CASE
CASE SUBSTR(m.ls_code,m.ln_i+1,1)=='['
m.ln_while_counter=m.ln_while_counter-1
CASE SUBSTR(m.ls_code,m.ln_i+1,1)==']'
m.ln_while_counter=m.ln_while_counter+1
endcase
m.ln_cycle_count=m.ln_cycle_count+1
ENDDO
endif
ENDCASE
IF this.err_count>m.ln_max_error_count
this.console("!Выполнение прервано, превышено максимально допустимое количество ошибок !",.t.)
exit
endif
IF m.ln_cycle_count>m.ln_max_cycle
IF MESSAGEBOX("Программа давно не выполняла операции ввода/вывода."+m.ls_13+"Возможно, она ушла в бесконечный цикл."+m.ls_13+"Остановить выполненение программы?",32+4,"BrainFuck")=6
this.console("!Выполнение прервано пользователем !",.t.)
EXIT
ELSE
m.ln_cycle_count=0
endif
endif
NEXT
this.console(REPLICATE("=",20),.t.)
IF this.err_count>0
this.console("Завершено с ошибками: "+ALLTRIM(STR(this.err_count))+" / Подробности в логе.",.t.)
else
this.console("ОК / "+ALLTRIM(STR(SECONDS()-m.ln_sec,10,2))+" сек.",.t.)
endif
ENDPROC
PROCEDURE err
LPARAMETERS ps_text,pl_page
IF pl_page
this.pf.activepage=3
endif
IF NOT EMPTY(m.ps_text)
this.pf.page3.log.value=this.pf.page3.log.value+m.ps_text+CHR(13)
endif
this.err_count=this.err_count+1
ENDPROC
PROCEDURE console
LPARAMETERS ps_text,pl_new_line
this.pf.page2.console.Value=this.pf.page2.console.Value+IIF(m.pl_new_line,CHR(13),"")+m.ps_text
ENDPROC
PROCEDURE get_code
RETURN this.pf.page1.code.value
endproc
ENDDEFINE
DEFINE CLASS BF_Run as CommandButton
height=24
width=60
caption="RUN"
PROCEDURE click
thisform.brainfuck()
ENDPROC
ENDDEFINE
DEFINE CLASS BF_Close as CommandButton
height=24
width=60
caption="Закрыть"
cancel=.t.
PROCEDURE click
thisform.release
ENDPROC
ENDDEFINE
DEFINE CLASS BF_Edit as EditBox
specialeffect=1
fontbold=.t.
fontname="Lucida Console"
fontsize=10
PROCEDURE reset
this.Value=""
ENDPROC
ENDDEFINE


------------------




Исправлено 1 раз(а). Последнее : h.i.a., 04.04.16 02:13
Ratings: 0 negative/1 positive
Re: Интерпретатор BrainFuck на VFP 9
h.i.a.
Автор

Сообщений: 4002
Откуда: Мурманск/Спб/Мск
Дата регистрации: 18.11.2005
Накидаю несколько готовых к употреблению исходников.
Hello World (Вариант №1)
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
------.--------.>+.>.

Hello World (Вариант №2)
+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++.+++++++++++++++++
++++++++++++.+++++++..+++.-------------------
---------------------------------------------
---------------.+++++++++++++++++++++++++++++
++++++++++++++++++++++++++.++++++++++++++++++
++++++.+++.------.--------.------------------
---------------------------------------------
----.-----------------------.

Welcome
++++++++[>+>++>+++>++++>+++++>++++++>+++++++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++>+++++++++++++>++++++++++++++>+++++++++++++++>++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>>>>>>>>>>>>-.+<<<<<<<<<<<<<<<>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<>>>>>>>>>>>>+++.---<<<<<<<<<<<<>>>>>>>>>>>>>>-.+<<<<<<<<<<<<<<>>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<<>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<>>>>>>--.++<<<<<<>>>>>>>>>>>>>.<<<<<<<<<<<<<>>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<<>>>>>>>>>>>>>>---.+++<<<<<<<<<<<<<<>>>>>>>>>>>>>>----.++++<<<<<<<<<<<<<<.

flag{Bra1n_fUckkkkkkkkk}
>>>++++++++++[>++++++++++[>+<-]<-]>>++.++++++.-----------.++++++.<<++++[>++++[>+<-]<-]>>++++.<<+++++++[>+++++++[>-<-]<-]>>--------.<<++++++[>++++++[>+<-]<-]>>++++++++++++.<<++++[>++++[>-<-]<-]>>-.<<++++++[>++++++[>-<-]<-]>>------------.<<+++++++[>+++++++[>+<-]<-]>>++++++++++++.---------------.+++++++.<<++++[>++++[>-<-]<-]>>-.++++++++++++++.++++++++.........<<++++[>++++[>+<-]<-]>>++.

Фибоначчи (Вариант 1)
+++++++++++
>+>>>>++++++++++++++++++++++++++++++++++++++++++++
>++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+>
+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-
<-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<
-]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]
>[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++
+++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++
++++++++++++++++++++++++++++++++++++++++++++.[-]<<
<<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<
[-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]


Фибоначчи (Вариант 2)
,>,>++++++++[-<------<------>>]
<<[->>>++++++++++<<<]>[->>+<<]
>+>-[-<<<[-]>[-<+>]>[-<+>]
<<[->>+>>+<<<<]>>>>[-<<<<+>>>>]
<<<[->+>>+<<<]>>>[-<<<+>>>]<]
>>++++++[-<+++++++>]<<<[->>.<<]

Факториал
>++++++++++>>>+>+[>>>+[-[<<<<<[+<<<<<]>>[[-]>[<<+>+>-]<[>+<-]<[>+<-[>+<-[>
+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>[-]>>>>+>+<<<<<<-[>+<-]]]]]]]]]]]>[<+>-
]+>>>>>]<<<<<[<<<<<]>>>>>>>[>>>>>]++[-<<<<<]>>>>>>-]+>>>>>]<[>++<-]<<<<[<[
>+<-]<<<<]>>[->[-]++++++[<++++++++>-]>>>>]<<<<<[<[>+>+<<-]>.<<<<<]>.>>>>]

The Game Of Life
Linus Akesson presents:
The Game Of Life implemented in Brainfuck
+>>++++[<++++>-]<[<++++++>-]+[<[>>>>+<<<<-]>>>>[<<<<+>>>>>>+<<-]<+
+++[>++++++++<-]>.[-]<+++[>+++<-]>+[>>.+<<-]>>[-]<<<++[<+++++>-]<.<<[>>>>+
<<<<-]>>>>[<<<<+>>>>>>+<<-]<<[>>>>.+<<<++++++++++[<[>>+<<-]>>[<<+>>>>>++++++++
+++<<<-]<[>+<-]>[<+>>>>+<<<-]>>>[>>>>>>>>>>>>+>+<< <<<<<<<<<<<-]>>>>>>>>>>
>>[-[>>>>+<<<<-]>[>>>>+<<<<-]>>>]> >>[<<<+>> >- ]<<<[>>+>+<<<-]>[->[<<<
<+>>>>-]<[<<< <+> >>>-]<<<< ]< ++++++ ++ +[>+++++<-]>>[<<+>>-]<
<[>---<-]>.[- ] <<<<<<<<< < <<<<<< < -]++++++++++.[-]<-]>>>
>[-]<[-]+++++ +++[>++++ ++++< - ]>--.[-]<,----------[<+
>-]>>>>>>+<<<<< < <[>+>>>>>+>[ -]<<< << <<-]>++++++++++>>>>>[[-]
<<,<<<<<<<->>>> > >>[<<<<+>>>>-]<<<<[>>>>+ >+<<<<<-]>>>>>----------[<<<<
<<<<+<[>>>>+<<< <-]>>>>[<<<<+>>>>>>+<<- ]>[>-<-]>++++++++++[>+++++++++
++<-]<<<<<<[>>> >+<<<<-]>>>>[<<<<+>>>>> >+<<-]>>>>[<<->>-]<<++++++++++
[>+<-]>[>>>>>>> >>>>>+>+<<<< <<<<< <<<<-]>>> >> >>>>>>>[-[>>>
>+<<<<-]>[>>>> +<<<<-]>> > ]>> > [<< < +>>>-]+<<<[>
>>-<<<-]>[->[< <<<+>>>>-] <[ < < < <+>>>>-]<<<
<]<<<<<<<<<<<, [ -]]>]>[-+++ ++ + +++ ++[>+++++++
++++>+++++++++ + +<<-]>[-[>>> +<<<- ]>>>[ < <<+ >>>>>>>+>+<
<<<<-]>>>>[-[> > >>+<<<<-]>[> >>>+< < <<-]> > >]> >>[<<<+>>>-
]<<<[>>+>+<<< - ]>[->[<<<<+> >>>-] < [<<< < +>> >>-]<<<<]<<
<<<<<<[>>>+<< < -]>>>[<<<+>> >>>>> + >+<< < <<-]<<[>>+<<
-]>>[<<+>>>>> >+>+<<<<<-]>> >>[-[ > >>>+ < <<<-]>[>>>>+<
<<<-]>[>>>>+< <<<-]>>]>>>[ - ]<[>+< - ]<[ - [<<<<+>>>>-]<<<
<]<<<<<<<<]<< <<<<<<<<++++ + +++++ [ >+++ + ++++++[<[>>+<<-]>>[<<+
>>>>>++++++++ + ++<<< -] < [>+<- ] >[<+ > >>>+<<<-]>>>[<<<+>>>-]
<<<[>>>+>>>> > +<<<< << <<-]> > >>>> >>>[>>+<<-]>>[<<+<+>>
>-]<<<------ - -----[ >> >+<<< - ]>>> [<<<+> > >>>>>+>+<<<<
<-]>>>>[-[>> > >+<<<< -] > [>>>> + <<<<- ]>>> ] >>>[<<<+>>>-
]<<<[>>+>+<< < -]>>> >> > > [<<<+ >>>-]<<<[>>>
+<<<<<+>>- ]> > >>>>>[< <<+>>>-]<<<[>
>>+<<<<<<< <<+ > >>>>>-]< <<<<<<[->[<<<<+
>>>>-]<[<<<<+>>>>-]<<<<]>[<<<<<< <+>>> >>>>-]<<<< <<<<<+++++++++++[>
>>+<<<-]>>>[<<<+>>>>>>>+>+<<<<<-]>>>>[-[> >>>+<<<<-]>[>>>>+<<<<-]>>>]>>>[<<<
+>>>-]<<<[>>+>+<<<-]>>>>>>>[<<<+>>>-]<<<[ >>>+<<<<<+>>-]>>>>>>>[<<<+>>>-]<<<
[>>>+<<<<<<<<<+>>>>>>-]<<<<<<<[->[< < < <+>>>>-]<[<<<<+>>>>-]<<<<]>[<<<<<<<
+>>>>>>>-]<<<<<<<<<+++++++++++[>>> > >>>+>+<<<<<<<<-]>>>>>>>[-[>>>>+<<<<-
]>[>>>>+<<<<-]>>>]>>>[<<<+>>>-]<<< [ >>+>+<<<-]>>>>>>>[<<<+>>>-]<<<[>>>+<<
<<<+>>-]>>>>>>>[<<<+>>>-]<<<[>>>+< <<<<<<<<+>>>>>>-]<<<<<<<[->[<<<<+>>>>-
]<[<<<<+>>>>-]<<<<]>[<<<<<<<+>>>>> >>-]<<<<<<<----[>>>>>>>+<<<<<<<+[>>>>>
>>-<<<<<<<[-]]<<<<<<<[>>>>>>>>>>>>+>+<<<<<<<<<<<<<-][ ''.phorum_html_encode('lft@df.lth.se').'' ]>>>>>
>>>>>>>[-[>>>>+<<<<-]>[>>>>+<<<<-]>[>>>>+<<<<-]>>]>>>[-]<[>+<-]<[-[<<<<+>>
>>-]<<<<]<<<<<<[-]]<<<<<<<[-]<<<<-]<-]>>>>>>>>>>>[-]<<]<<<<<<<<<<]
Type for instance "fg" to toggle the cell at row f and column g
Hit enter to calculate the next generation
Type q to quit


------------------
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 2 (Гостей: 2)

© 2000-2024 Fox Club 
Яндекс.Метрика