bbs

Здравствуйте Гость ( Вход | Регистрация )

 
ОтветитьСоздать новую темуСоздать новое голосование

Каскадный · [ Стандартный ] · Линейный

> Интерпритатор интерпритатора, Вот наваял: C++ -> LoGA -> BrainFuck

 azrev
post 6.01.2008 - 18:12
Отправлено #1



Сообщений: 2
Рег.: 12.01.07
ID No.: 13 394
Было небольшое задание в инсте - написать собственный простенький интерпритатор используя генетические алгоритмы. Так появился Language of Genetic Algorythms... генетические алгоритмы были сбоку прикручены, а вот основная часть языка получилось забавной. Для демонстрации того что язык Тьюринг полный написал интерпритатор БрейнФака на своём языке, вот код:

Код

#BrainFuck Parser. V1.0

<< "BrainFuck parser..." 10

Pause TRUE
Cls

#Globals
Var `g_size
Var $g_data

#Calling functions

   ##Get file
Call "GFL"

? `g_size > 0
   ##Parse data
Call "PRS"
!
<< "Data not found!" 10
.


Exit

Label "GFL"
<
Var &cells
Var $e_char

<< "Filename: "
>> $e_char

SetFieldSize &cells 999999
ReadFromFile $e_char &cells 999999 `g_size
GetField &cells 0 $g_data `g_size

<< "Program: " 10 $g_data 10 10

Free &cells $e_char

>

Label "PRS"
<
Var `l_return
Var $e_char `e_pos

Var `N `realN
Var `Hsize
Var &cells
Var `t
Var `lvl `clvl

Var ~b

Optimize `I_LastGoToLineNumber `e_pos `lvl `clvl `realN `t `N $e_char

:= `I_LastGoToLineNumber `l_return

<*> "[`g_size] * 2 * 4" `Hsize
SetFieldSize &cells `Hsize
:= 0 `N
:= 0 ~b
{
 SetField &cells `N ~b 1
 ++ `N
} `N < `Hsize

:= `g_size `Hsize
:= 0 `N
:= 0 `e_pos
:= 0 `clvl
{
 Call "GCH"
 ++ `e_pos

 ? $e_char = "]"
  Call "}  "
  Continue
 .

 <*> "[`Hsize] + [`N] * 4" `realN

 ? $e_char = ">"
  ++ `N
  Continue
 .
 ? $e_char = "<"
  -- `N
  Continue
 .
 ? $e_char = "+"
  Call "CPP"
  Continue
 .
 ? $e_char = "-"
  Call "CMM"
  Continue
 .
 ? $e_char = "."
  Call "PRT"
  Continue
 .
 ? $e_char = ","
  Call "INP"
  Continue
 .
 ? $e_char = "["
  Call "DO{"
  Continue
 .
#  << 10 "Unknow BrainFuck Construction! Syntax Error!" 10
#  Exit
} `e_pos < `g_size


Label "GCH"
[
 PartOfString $g_data `e_pos 1 $e_char
]
Label "CPP"
[
 GetField &cells `realN `t 4
 ++ `t
 SetField &cells `realN `t 4
]
Label "CMM"
[
 GetField &cells `realN `t 4
 -- `t
 SetField &cells `realN `t 4
]
Label "PRT"
[
 GetField &cells `realN `t 4
 := `t ~b
 PutChar ~b
]
Label "INP"
[
 GetChar `t
 SetField &cells `realN `t 4  
]
Label "DO{"
[
 GetField &cells `realN `t 4
 ? `t = 0
  := `clvl `lvl
  {
   PartOfString $g_data `e_pos 1 $e_char
   ? $e_char = "["
    ++ `lvl
   .
   ? $e_char = "]"
    ? `lvl = `clvl
     ++ `e_pos
     Return
    !
     -- `lvl
    .
   .
   ++ `e_pos
  } `e_pos < `g_size
  << "Can't Find End Of Loop! Syntax Error!" 10
  Exit
 !
  ++ `clvl
 .
]

Label "}  "
[
 -- `clvl
 := `clvl `lvl
 -- `e_pos
 -- `e_pos
 ? `e_pos < 0
  << "Can't Find Loop Start! Syntax Error!" 10
  Exit
 .
 {
  PartOfString $g_data `e_pos 1 $e_char
  ? $e_char = "]"
   ++ `lvl
  .
   
  ? $e_char = "["
   ? `clvl = `lvl
    Return
   !
    -- `lvl
   .
  .
  -- `e_pos
 } `e_pos >= 0
 << "Can't Find Loop Start! Syntax Error!" 10
 Exit
]

:= `l_return `I_LastGoToLineNumber
>


Примеры типа:
Код

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


Код

+++++[>+++++++++<-],[[>--.++>+<<-]>+.->[<.>-]<<,]


Код

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


Код

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


Код

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


Код

>,[
   [
       ----------[
           >>>[>>>>]+[[-]+<[->>>>++>>>>+[>>>>]++[->+<<<<<]]<<<]
           ++++++[>------<-]>--[>>[->>>>]+>+[<<<<]>-],<
       ]>
   ]>>>++>+>>[
       <<[>>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<<]]<[>+<-]>]
       >[>[>>>>]+[[-]<[+[->>>>]>+<]>[<+>[<<<<]]+<<<<]>>>[->>>>]+>+[<<<<]]
       >[[>+>>[<<<<+>>>>-]>]<<<<[-]>[-<<<<]]>>>>>>>
   ]>>+[[-]++++++>>>>]<<<<[[<++++++++>-]<.[-]<[-]<[-]<]<,
]]


проглатывает на УРА.

Список всех функций (их кодов):
Код

//Functions Codes
#define LGA_P_DO       0x00
#define LGA_P_WHILE       0x01
#define LGA_P_IF       0x02
#define LGA_P_ELSE       0x03
#define LGA_P_ENDIF       0x04
#define LGA_P_CONTINUE      0x05
#define LGA_P_BREAK       0x06
#define LGA_P_GOTOLINE      0x07
#define LGA_P_EXIT       0x08
#define LGA_P_LOOP       0x09
#define LGA_P_DUMP       0x0a
#define LGA_P_LABEL       0x0b
#define LGA_P_CLS       0x0c
#define LGA_P_PAUSE       0x0d
#define LGA_P_RETURN      0x0e
#define LGA_P_SYSTEM      0x0f
#define LGA_P_TIME       0x80
#define LGA_P_OPTIMIZE      0x81
#define LGA_P_OPENFUNC      0x82
#define LGA_P_CLOSEFUNC      0x83

#define LGA_P_PUTCHAR      0x10
#define LGA_P_PRINT       0x11
#define LGA_P_LINEPRINT      0x12
#define LGA_P_INPUT       0x13
#define LGA_P_READFROMFILE     0x14
#define LGA_P_WRITETOFILE     0x15
#define LGA_P_GETCHAR      0x16

#define LGA_P_VAR       0x20
#define LGA_P_FREE       0x21
#define LGA_P_ASSIGN      0x22
#define LGA_P_MATH       0x23
#define LGA_P_RANDOM      0x24
#define LGA_P_COPYSTRING     0x25
#define LGA_P_STRINGLEN      0x26
#define LGA_P_PARTOFSTRING     0x27
#define LGA_P_ASCIISYMBOL     0x28
#define LGA_P_ASCIICODE      0x29
#define LGA_P_PLUSPLUS      0x2a
#define LGA_P_MINUSMINUS     0x2b
#define LGA_P_DYNAMICVAR     0x2c
#define LGA_P_DYNAMICASSIGN     0x2d
#define LGA_P_DYNAMICFREE     0x2e

#define LGA_P_TACT       0x30
#define LGA_P_SET       0x31
#define LGA_P_GET       0x32
#define LGA_P_ZIPCORPSES     0x33
#define LGA_P_GROWUP      0x34

#define LGA_P_CREATUREINIT     0x40
#define LGA_P_KILLCREATURE     0x41
#define LGA_P_CREATUREBORN     0x42
#define LGA_P_CREATURENEARNUMBER   0x43
#define LGA_P_GETCREATURE     0x44
#define LGA_P_GETCREATUREPARAMETERS   0x45
#define LGA_P_MUTATECREATURE    0x46
#define LGA_P_GETPERFECTCREATURE   0x47
#define LGA_P_GETWEAKESTCREATURE   0x48
#define LGA_P_GETAVERAGECREATUREPARAMETERS 0x49
#define LGA_P_CREATUREEAT     0x4a
#define LGA_P_GETCREATURECORPSE    0x4b
#define LGA_P_CREATUREGO     0x4c

#define LGA_P_MONSTERINIT     0x50
#define LGA_P_KILLMONSTER     0x51
#define LGA_P_MONSTERBORN     0x52
#define LGA_P_GETMONSTER     0x53
#define LGA_P_GETMONSTERPARAMETERS   0x54
#define LGA_P_GETAVERAGEMONSTERPARAMETERS 0x55
#define LGA_P_MONSTERHUNT     0x56
#define LGA_P_GETMONSTERCORPSE    0x57
#define LGA_P_MONSTERWALK     0x58

#define LGA_P_GETGRASSPARAMETERS   0x60
#define LGA_P_CREATEGRASS     0x61
#define LGA_P_KILLGRASS      0x62
#define LGA_P_GETGRASSCORPSE    0x63
#define LGA_P_GETGRASSAMOUNT    0x64
#define LGA_P_ZIPGRASSLAYERS    0x65

#define LGA_P_SETFIELDSIZE     0x70
#define LGA_P_GETFIELD      0x71
#define LGA_P_SETFIELD      0x72


Язык ни на что не претендует, но мне, как что-то своё, очень близок wub.gif

Тем более что он работает быстрее Basic1.0 раз в 20, Basic4.5 в 5, медленнее Си где-то раз в 100 smile.gif И быстрее ABAPа (который выступал как идеологический язык при написании этого) раз в 5.

Сообщение отредактировал azrev - 6.01.2008 - 18:23
Пользователь offlineПрофайлОтправить личное сообщение
Вернуться к началу страницы
+Цитировать сообщение

ОтветитьОпции темыСоздать новую тему
2 чел. читают эту тему (2 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
 

 rss   Упрощённая версия Сейчас: 16.09.2019 - 12:08