for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Игры Разума
   :: Помощь сайту :: 

Интерпретатор BrainFuck на VFP 9
h.i.a.
Автор

Сообщений: 3905
Откуда: Мурманск
Дата: 04.04.16 02:06:19ОтветитьЦитировать
Не знаю в какой раздел форума поместить, пусть будет здесь. Забавы ради на коленке набросал реализацию на фоксе интерпретатора эзотерического языка 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


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




Исправлено: h.i.a., 04.04.16 02:13
Ratings: 0 negative/1 positive

Re: Интерпретатор BrainFuck на VFP 9
h.i.a.
Автор

Сообщений: 3905
Откуда: Мурманск
Дата: 04.04.16 02:11:59ОтветитьЦитировать
Накидаю несколько готовых к употреблению исходников.
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  
    
         +>>++++[<++++>-]<[<++++++>-]+[<[>>>>+<<<<-]>>>>[<<<<+>>>>>>+<<-]<+  
     +++[>++++++++<-]>.[-]<+++[>+++<-]>+[>>.+<<-]>>[-]<<<++[<+++++>-]<.<<[>>>>+  
   <<<<-]>>>>[<<<<+>>>>>>+<<-]<<[>>>>.+<<<++++++++++[<[>>+<<-]>>[<<+>>>>>++++++++  
   +++<<<-]<[>+<-]>[<+>>>>+<<<-]>>>[>>>>>>>>>>>>+>+<<     <<<<<<<<<<<-]>>>>>>>>>>  
  >>[-[>>>>+<<<<-]>[>>>>+<<<<-]>>>]>      >>[<<<+>>  >-    ]<<<[>>+>+<<<-]>[->[<<<  
  <+>>>>-]<[<<<  <+>      >>>-]<<<< ]<     ++++++  ++       +[>+++++<-]>>[<<+>>-]<  
  <[>---<-]>.[- ]         <<<<<<<<< <      <<<<<< <         -]++++++++++.[-]<-]>>>  
  >[-]<[-]+++++           +++[>++++        ++++<     -     ]>--.[-]<,----------[<+  
  >-]>>>>>>+<<<<< <     <[>+>>>>>+>[      -]<<<      <<   <<-]>++++++++++>>>>>[[-]  
  <<,<<<<<<<->>>> >    >>[<<<<+>>>>-]<<<<[>>>>+      >+<<<<<-]>>>>>----------[<<<<  
  <<<<+<[>>>>+<<<      <-]>>>>[<<<<+>>>>>>+<<-      ]>[>-<-]>++++++++++[>+++++++++  
  ++<-]<<<<<<[>>>      >+<<<<-]>>>>[<<<<+>>>>>      >+<<-]>>>>[<<->>-]<<++++++++++  
  [>+<-]>[>>>>>>>      >>>>>+>+<<<<      <<<<<      <<<<-]>>> >>     >>>>>>>[-[>>>  
  >+<<<<-]>[>>>>       +<<<<-]>> >       ]>> >           [<< <        +>>>-]+<<<[>  
  >>-<<<-]>[->[<      <<<+>>>>-]         <[ <            < <           <+>>>>-]<<<  
  <]<<<<<<<<<<<, [    -]]>]>[-+++        ++               +    +++     ++[>+++++++  
  ++++>+++++++++ +    +<<-]>[-[>>>      +<<<-      ]>>>[ <    <<+      >>>>>>>+>+<  
  <<<<-]>>>>[-[> >    >>+<<<<-]>[>      >>>+< <    <<-]> >    >]>      >>[<<<+>>>-  
  ]<<<[>>+>+<<< -     ]>[->[<<<<+>      >>>-] <    [<<< <    +>>       >>-]<<<<]<<  
  <<<<<<[>>>+<< <     -]>>>[<<<+>>      >>>>> +    >+<< <             <<-]<<[>>+<<  
  -]>>[<<+>>>>>      >+>+<<<<<-]>>      >>[-[ >    >>>+ <            <<<-]>[>>>>+<  
  <<<-]>[>>>>+<      <<<-]>>]>>>[ -    ]<[>+< -    ]<[ -           [<<<<+>>>>-]<<<  
  <]<<<<<<<<]<<      <<<<<<<<++++ +    +++++  [   >+++ +    ++++++[<[>>+<<-]>>[<<+  
  >>>>>++++++++ +    ++<<<     -] <    [>+<- ]    >[<+ >    >>>+<<<-]>>>[<<<+>>>-]  
  <<<[>>>+>>>>  >    +<<<<     <<      <<-]> >    >>>>       >>>[>>+<<-]>>[<<+<+>>  
  >-]<<<------ -    -----[     >>      >+<<< -    ]>>>       [<<<+> > >>>>>+>+<<<<  
  <-]>>>>[-[>> >    >+<<<<    -] >     [>>>> +    <<<<-       ]>>> ]  >>>[<<<+>>>-  
  ]<<<[>>+>+<< <    -]>>>     >>           > >    [<<<+               >>>-]<<<[>>>  
  +<<<<<+>>-                  ]>           >     >>>>>[<             <<+>>>-]<<<[>  
  >>+<<<<<<<                  <<+         >      >>>>>-]<          <<<<<<[->[<<<<+  
  >>>>-]<[<<<<+>>>>-]<<<<]>[<<<<<<    <+>>>      >>>>-]<<<<     <<<<<+++++++++++[>  
  >>+<<<-]>>>[<<<+>>>>>>>+>+<<<<<-]>>>>[-[>     >>>+<<<<-]>[>>>>+<<<<-]>>>]>>>[<<<  
  +>>>-]<<<[>>+>+<<<-]>>>>>>>[<<<+>>>-]<<<[     >>>+<<<<<+>>-]>>>>>>>[<<<+>>>-]<<<  
  [>>>+<<<<<<<<<+>>>>>>-]<<<<<<<[->[< <  <     <+>>>>-]<[<<<<+>>>>-]<<<<]>[<<<<<<<  
  +>>>>>>>-]<<<<<<<<<+++++++++++[>>> >        >>>+>+<<<<<<<<-]>>>>>>>[-[>>>>+<<<<-  
  ]>[>>>>+<<<<-]>>>]>>>[<<<+>>>-]<<< [       >>+>+<<<-]>>>>>>>[<<<+>>>-]<<<[>>>+<<  
  <<<+>>-]>>>>>>>[<<<+>>>-]<<<[>>>+<        <<<<<<<<+>>>>>>-]<<<<<<<[->[<<<<+>>>>-  
   ]<[<<<<+>>>>-]<<<<]>[<<<<<<<+>>>>>      >>-]<<<<<<<----[>>>>>>>+<<<<<<<+[>>>>>  
   >>-<<<<<<<[-]]<<<<<<<[>>>>>>>>>>>>+>+<<<<<<<<<<<<<-][   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: 41 Alekon Гулин Федор param  and Guests: 38


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