Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #NoTrayIcon
- #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
- #AutoIt3Wrapper_UseUpx=n
- #AutoIt3Wrapper_Res_Comment=brainfuck Compiler
- #AutoIt3Wrapper_Res_Description=brainfuck Compiler
- #AutoIt3Wrapper_Res_Fileversion=2.0
- #AutoIt3Wrapper_Res_SaveSource=y
- #AutoIt3Wrapper_Res_Language=1033
- #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
- Local $GUI, $Menu, $New, $Open, $Save, $Exit, $CompileToC, $CompileToExe, $Edit, $Filename, $File, $Data, $GCC, $WorkingDir
- $GUI = GUICreate("brainfuck Compiler (brainfuck.forumieren.eu)", 400, 300)
- GUISetFont(10, 1000, 0, "Courier New", $GUI)
- $Menu = GUICtrlCreateMenu("File")
- $New = GUICtrlCreateMenuItem("New", $Menu)
- $Open = GUICtrlCreateMenuItem("Open", $Menu)
- $Save = GUICtrlCreateMenuItem("Save", $Menu)
- GUICtrlCreateMenuItem("", $Menu)
- $Exit = GUICtrlCreateMenuItem("Exit", $Menu)
- $Menu = GUICtrlCreateMenu("Tools")
- $Menu = GUICtrlCreateMenu("Compile", $Menu)
- $CompileToC = GUICtrlCreateMenuItem("BF to C", $Menu)
- $CompileToExe = GUICtrlCreateMenuItem("BF (to C) to Exe", $Menu)
- $Menu = GUICtrlCreateMenu("Plugins")
- $Edit = GUICtrlCreateEdit("", 0, 0, 400, 280)
- GUISetState(@SW_SHOW, $GUI)
- $GCC = FileOpenDialog("", @ScriptDir, "GCC (gcc.exe)", 1, "", $GUI)
- If @error Then Exit
- $WorkingDir = StringSplit(StringReplace($GCC, "/", "\"), "\")
- $WorkingDir = StringTrimRight($GCC, StringLen($WorkingDir[$WorkingDir[0]])+1)
- Do
- Switch GUIGetMsg()
- Case -3, $Exit
- ExitLoop
- Case $New
- GUICtrlSetData($Edit, "")
- Case $Open
- $Filename = FileOpenDialog("", @ScriptDir, "All Source (*)", 1, "", $GUI)
- If (Not @error) Then
- $File = FileOpen($Filename)
- $Data = FileRead($File)
- FileClose($File)
- GUICtrlSetData($Edit, $Data)
- EndIf
- Case $Save
- $Filename = FileSaveDialog("", @ScriptDir, "All Source (*)", 16, "", $GUI)
- If (Not @error) Then
- $File = FileOpen($Filename, 2)
- $Data = GUICtrlRead($Edit)
- FileWrite($File, $Data)
- FileClose($File)
- EndIf
- Case $CompileToC
- $Data = GUICtrlRead($Edit)
- $Data = BrainfuckToC($Data)
- GUICtrlSetData($Edit, $Data)
- Case $CompileToExe
- $Filename = FileSaveDialog("", @ScriptDir, "Executable (*.exe)", 16, "", $GUI)
- If (Not @error) Then
- $File = FileOpen(@ScriptDir & "\~brainfuck.c", 2)
- $Data = GUICtrlRead($Edit)
- $Data = BrainfuckToC($Data)
- FileWrite($File, $Data)
- FileClose($File)
- RunWait($GCC & ' "' & @ScriptDir & "\~brainfuck.c" & '" -o "' & $Filename & '"', $WorkingDir)
- FileDelete(@ScriptDir & "\~brainfuck.c")
- EndIf
- EndSwitch
- Until False
- Exit
- Func PreprocessorDirectives($brainfuck)
- Local $i, $file, $data, $search, $replace
- Local $include = StringRegExp($brainfuck, '(?m)^\s*(#include +".*?")', 3)
- If (Not @error) Then
- For $i = 0 To UBound($include)-1 Step 1
- $file = StringRegExp($include[$i], '#include +"(.*?)"', 3)
- $file = $file[0]
- If FileExists($file) Then
- $data = PreprocessorDirectives(FileRead($file))
- Else
- $data = ""
- EndIf
- $brainfuck = StringReplace($brainfuck, $include[$i], $data)
- Next
- EndIf
- Local $define = StringRegExp($brainfuck, '(?m)(?s)^\s*(#define +".*?" +".*?")', 3)
- If (Not @error) Then
- For $i = 0 To UBound($define)-1 Step 1
- $search = StringRegExp($define[$i], '(?s)#define +"(.*?)" +"(.*?)"', 3)
- $replace = $search[1]
- $search = $search[0]
- $brainfuck = StringReplace($brainfuck, $define[$i], "")
- $brainfuck = StringReplace($brainfuck, $search, $replace, 0, 1)
- Next
- EndIf
- Return $brainfuck
- EndFunc
- Func BrainfuckPreprocessor($brainfuck)
- $brainfuck = PreprocessorDirectives($brainfuck)
- $brainfuck = StringRegExpReplace($brainfuck, "[^\>\<\+\-\.\,\[\]]", "")
- $brainfuck = StringReplace($brainfuck, "[-]", "c")
- $brainfuck = StringRegExp($brainfuck, "(\>+|\<+|\++|\-+|\.|\,|\[|\]|c)", 3)
- If @error Then Return SetError(1, 0, -1)
- Local $i, $array[2]
- For $i = 0 To UBound($brainfuck)-1 Step 1
- $array[0] = StringLeft($brainfuck[$i], 1)
- $array[1] = StringLen($brainfuck[$i])
- $brainfuck[$i] = $array
- Next
- Return $brainfuck
- EndFunc
- Func BrainfuckToC($brainfuck)
- Local $bfplus = BrainfuckPreprocessor($brainfuck)
- If @error Then Return SetError(1, 0, "")
- Local $c, $i, $array, $tab = 1, $j
- $c = "#include <stdio.h>" & @CRLF & @CRLF
- $c &= "int main(void) {" & @CRLF
- $c &= @TAB & "char array[30000];" & @CRLF
- $c &= @TAB & "char *ptr = array;" & @CRLF
- For $i = 0 To UBound($bfplus)-1 Step 1
- $array = $bfplus[$i]
- For $j = 1 To ( $tab - ($array[0] = "]") ) Step 1
- $c &= @TAB
- Next
- Switch $array[0]
- Case ">"
- $c &= "ptr += " & $array[1] & ";" & @CRLF
- Case "<"
- $c &= "ptr -= " & $array[1] & ";" & @CRLF
- Case "+"
- $c &= "*ptr += " & $array[1] & ";" & @CRLF
- Case "-"
- $c &= "*ptr -= " & $array[1] & ";" & @CRLF
- Case "."
- $c &= "putchar(*ptr);" & @CRLF
- Case ","
- $c &= "*ptr = getchar();" & @CRLF
- Case "["
- $c &= "while (*ptr > 0) {" & @CRLF
- $tab += 1
- Case "]"
- $c &= "}" & @CRLF
- $tab -= 1
- Case "c"
- $c &= "*ptr = 0;" & @CRLF
- EndSwitch
- Next
- $c &= @TAB & "return 0;" & @CRLF & "}"
- Return $c
- EndFunc
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement