Advertisement
ChristophX86

brainfuck Compiler

Jul 21st, 2012
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 5.10 KB | None | 0 0
  1. #NoTrayIcon
  2. #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
  3. #AutoIt3Wrapper_UseUpx=n
  4. #AutoIt3Wrapper_Res_Comment=brainfuck Compiler
  5. #AutoIt3Wrapper_Res_Description=brainfuck Compiler
  6. #AutoIt3Wrapper_Res_Fileversion=2.0
  7. #AutoIt3Wrapper_Res_SaveSource=y
  8. #AutoIt3Wrapper_Res_Language=1033
  9. #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
  10.  
  11. Local $GUI, $Menu, $New, $Open, $Save, $Exit, $CompileToC, $CompileToExe, $Edit, $Filename, $File, $Data, $GCC, $WorkingDir
  12.  
  13. $GUI = GUICreate("brainfuck Compiler (brainfuck.forumieren.eu)", 400, 300)
  14. GUISetFont(10, 1000, 0, "Courier New", $GUI)
  15. $Menu = GUICtrlCreateMenu("File")
  16. $New = GUICtrlCreateMenuItem("New", $Menu)
  17. $Open = GUICtrlCreateMenuItem("Open", $Menu)
  18. $Save = GUICtrlCreateMenuItem("Save", $Menu)
  19. GUICtrlCreateMenuItem("", $Menu)
  20. $Exit = GUICtrlCreateMenuItem("Exit", $Menu)
  21. $Menu = GUICtrlCreateMenu("Tools")
  22. $Menu = GUICtrlCreateMenu("Compile", $Menu)
  23. $CompileToC = GUICtrlCreateMenuItem("BF to C", $Menu)
  24. $CompileToExe = GUICtrlCreateMenuItem("BF (to C) to Exe", $Menu)
  25. $Menu = GUICtrlCreateMenu("Plugins")
  26. $Edit = GUICtrlCreateEdit("", 0, 0, 400, 280)
  27. GUISetState(@SW_SHOW, $GUI)
  28.  
  29. $GCC = FileOpenDialog("", @ScriptDir, "GCC (gcc.exe)", 1, "", $GUI)
  30. If @error Then Exit
  31. $WorkingDir = StringSplit(StringReplace($GCC, "/", "\"), "\")
  32. $WorkingDir = StringTrimRight($GCC, StringLen($WorkingDir[$WorkingDir[0]])+1)
  33.  
  34. Do
  35.     Switch GUIGetMsg()
  36.         Case -3, $Exit
  37.             ExitLoop
  38.         Case $New
  39.             GUICtrlSetData($Edit, "")
  40.         Case $Open
  41.             $Filename = FileOpenDialog("", @ScriptDir, "All Source (*)", 1, "", $GUI)
  42.             If (Not @error) Then
  43.                 $File = FileOpen($Filename)
  44.                 $Data = FileRead($File)
  45.                 FileClose($File)
  46.                 GUICtrlSetData($Edit, $Data)
  47.             EndIf
  48.         Case $Save
  49.             $Filename = FileSaveDialog("", @ScriptDir, "All Source (*)", 16, "", $GUI)
  50.             If (Not @error) Then
  51.                 $File = FileOpen($Filename, 2)
  52.                 $Data = GUICtrlRead($Edit)
  53.                 FileWrite($File, $Data)
  54.                 FileClose($File)
  55.             EndIf
  56.         Case $CompileToC
  57.             $Data = GUICtrlRead($Edit)
  58.             $Data = BrainfuckToC($Data)
  59.             GUICtrlSetData($Edit, $Data)
  60.         Case $CompileToExe
  61.             $Filename = FileSaveDialog("", @ScriptDir, "Executable (*.exe)", 16, "", $GUI)
  62.             If (Not @error) Then
  63.                 $File = FileOpen(@ScriptDir & "\~brainfuck.c", 2)
  64.                 $Data = GUICtrlRead($Edit)
  65.                 $Data = BrainfuckToC($Data)
  66.                 FileWrite($File, $Data)
  67.                 FileClose($File)
  68.                 RunWait($GCC & ' "' & @ScriptDir & "\~brainfuck.c" & '" -o "' & $Filename & '"', $WorkingDir)
  69.                 FileDelete(@ScriptDir & "\~brainfuck.c")
  70.             EndIf
  71.     EndSwitch
  72. Until False
  73. Exit
  74.  
  75. Func PreprocessorDirectives($brainfuck)
  76.     Local $i, $file, $data, $search, $replace
  77.     Local $include = StringRegExp($brainfuck, '(?m)^\s*(#include +".*?")', 3)
  78.     If (Not @error) Then
  79.         For $i = 0 To UBound($include)-1 Step 1
  80.             $file = StringRegExp($include[$i], '#include +"(.*?)"', 3)
  81.             $file = $file[0]
  82.             If FileExists($file) Then
  83.                 $data = PreprocessorDirectives(FileRead($file))
  84.             Else
  85.                 $data = ""
  86.             EndIf
  87.             $brainfuck = StringReplace($brainfuck, $include[$i], $data)
  88.         Next
  89.     EndIf
  90.     Local $define = StringRegExp($brainfuck, '(?m)(?s)^\s*(#define +".*?" +".*?")', 3)
  91.     If (Not @error) Then
  92.         For $i = 0 To UBound($define)-1 Step 1
  93.             $search = StringRegExp($define[$i], '(?s)#define +"(.*?)" +"(.*?)"', 3)
  94.             $replace = $search[1]
  95.             $search = $search[0]
  96.             $brainfuck = StringReplace($brainfuck, $define[$i], "")
  97.             $brainfuck = StringReplace($brainfuck, $search, $replace, 0, 1)
  98.         Next
  99.     EndIf
  100.     Return $brainfuck
  101. EndFunc
  102.  
  103. Func BrainfuckPreprocessor($brainfuck)
  104.     $brainfuck = PreprocessorDirectives($brainfuck)
  105.     $brainfuck = StringRegExpReplace($brainfuck, "[^\>\<\+\-\.\,\[\]]", "")
  106.     $brainfuck = StringReplace($brainfuck, "[-]", "c")
  107.     $brainfuck = StringRegExp($brainfuck, "(\>+|\<+|\++|\-+|\.|\,|\[|\]|c)", 3)
  108.     If @error Then Return SetError(1, 0, -1)
  109.     Local $i, $array[2]
  110.     For $i = 0 To UBound($brainfuck)-1 Step 1
  111.         $array[0] = StringLeft($brainfuck[$i], 1)
  112.         $array[1] = StringLen($brainfuck[$i])
  113.         $brainfuck[$i] = $array
  114.     Next
  115.     Return $brainfuck
  116. EndFunc
  117.  
  118. Func BrainfuckToC($brainfuck)
  119.     Local $bfplus = BrainfuckPreprocessor($brainfuck)
  120.     If @error Then Return SetError(1, 0, "")
  121.     Local $c, $i, $array, $tab = 1, $j
  122.  
  123.     $c = "#include <stdio.h>" & @CRLF & @CRLF
  124.     $c &= "int main(void) {" & @CRLF
  125.     $c &= @TAB & "char array[30000];" & @CRLF
  126.     $c &= @TAB & "char *ptr = array;" & @CRLF
  127.  
  128.     For $i = 0 To UBound($bfplus)-1 Step 1
  129.         $array = $bfplus[$i]
  130.         For $j = 1 To ( $tab - ($array[0] = "]") ) Step 1
  131.             $c &= @TAB
  132.         Next
  133.         Switch $array[0]
  134.             Case ">"
  135.                 $c &= "ptr  += " & $array[1] & ";" & @CRLF
  136.             Case "<"
  137.                 $c &= "ptr  -= " & $array[1] & ";" & @CRLF
  138.             Case "+"
  139.                 $c &= "*ptr += " & $array[1] & ";" & @CRLF
  140.             Case "-"
  141.                 $c &= "*ptr -= " & $array[1] & ";" & @CRLF
  142.             Case "."
  143.                 $c &= "putchar(*ptr);" & @CRLF
  144.             Case ","
  145.                 $c &= "*ptr = getchar();" & @CRLF
  146.             Case "["
  147.                 $c &= "while (*ptr > 0) {" & @CRLF
  148.                 $tab += 1
  149.             Case "]"
  150.                 $c &= "}" & @CRLF
  151.                 $tab -= 1
  152.             Case "c"
  153.                 $c &= "*ptr = 0;" & @CRLF
  154.         EndSwitch
  155.     Next
  156.     $c &= @TAB & "return 0;" & @CRLF & "}"
  157.     Return $c
  158. EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement