Moin,
Ich hab' anlässlich zu dem Thema hier Klick! mal was gebastelt.;)
Ich selbst habe nicht die geringste Ahnung, wie BrainFuck funktioniert, deswegen arbeite ich mit einem anderen System:
i
Inkrementiert den aktuellen Wert um 1. (+1)
d
Dekrementiert den aktuellen Wert um 1. (-1)
I
Inkrementiert den aktuellen Wert um 10. (+10)
D
Dekrementiert den aktuellen Wert um 10. (-10)
R
Setzt den aktuellen Wert auf 65 (ASCII-Code für "A").
r
Setzt den aktuellen Wert auf 97 (ASCII-Code für "a").
O oder o (Groß-Klein-Schreibung wird hier nicht beachtet)
Gibt den aktuellen Wert als ASCII-Zeichen aus.
So, hier dann mal das Script.
IDO-Interpreter (Version 1.0)
#include <EditConstants.au3>
$sFile = "test.txt"
$fDebug = True
$hGUI = GUICreate("IDO-Interpreter", 500, 250)
$hCodeInput = GUICtrlCreateEdit("Input", 0, 0, 250, 100)
$hCodeOutput = GUICtrlCreateEdit("Output", 0, 150, 250, 100, $ES_READONLY)
$hDebugOutput = GUICtrlCreateEdit("Debug", 250, 0, 250, 250)
GUICtrlSetBkColor(-1, 0x999999)
GUICtrlSetColor(-1, 0xFFFFFF)
$hRunButton = GUICtrlCreateButton("Execute", 0, 100, 250, 50)
GUISetState()
While 1
$iMsg = GUIGetMsg()
Switch $iMsg
Case -3
Exit
Case $hRunButton
_Run()
EndSwitch
WEnd
Func _Run()
GUICtrlSetData($hDebugOutput, "")
GUICtrlSetData($hCodeOutput, "")
$hTimer = TimerInit()
[/autoit] [autoit][/autoit] [autoit]_Debug("Program started!" & @CRLF & @CRLF)
Dim $asCmd
$asCmd = _InputReadToCommands($sFile)
$iCell = 65
For $i = 1 To $asCmd[0]
_Debug("Read Char: " & $asCmd[$i] & @CRLF & " Action: ")
$fMatch = False
Switch $asCmd[$i]
Case "I"
$fMatch = True
If $asCmd[$i] == "i" Then
$iCell += 1
_Debug("Increment Cell from " & $iCell - 1 & " to " & $iCell & @CRLF)
ElseIf $asCmd[$i] == "I" Then
$iCell += 10
_Debug("Increment Cell from " & $iCell - 10 & " to " & $iCell & @CRLF)
EndIf
Case "D"
$fMatch = True
If $asCmd[$i] == "d" Then
$iCell -= 1
_Debug("Decrement Cell from " & $iCell + 1 & " to " & $iCell & @CRLF)
ElseIf $asCmd[$i] == "D" Then
$iCell -= 10
_Debug("Decrement Cell from " & $iCell + 10 & " to " & $iCell & @CRLF)
EndIf
Case "O"
$fMatch = True
_Debug("Output Cell as ASCII-Char from " & $iCell & " to '" & Chr($iCell) & "'" & @CRLF)
_Output(Chr($iCell))
Case "R"
$fMatch = True
If $asCmd[$i] == "R" Then
_Debug("Resetting Cell from " & $iCell & " (" & Chr($iCell) & ") to 65 (A)" & @CRLF)
$iCell = 65
ElseIf $asCmd[$i] == "r" Then
_Debug("Resetting Cell from " & $iCell & " (" & Chr($iCell) & ") to 97 (a)" & @CRLF)
$iCell = 97
EndIf
EndSwitch
If $fMatch = False Then
_Debug("None. Character is unknown." & @CRLF)
EndIf
Next
_Debug(@CRLF & "Program ended. Time: " & Round(TimerDiff($hTimer) / 1000, 1) & " Seconds")
EndFunc ;==>_Run
Func _InputReadToCommands($sFile)
$sCommands = GUICtrlRead($hCodeInput)
$asCommands = StringSplit($sCommands, "")
Return $asCommands
EndFunc ;==>_InputReadToCommands
Func _Debug($sDebugInfo)
GUICtrlSetData($hDebugOutput, GUICtrlRead($hDebugOutput) & $sDebugInfo)
EndFunc ;==>_Debug
Func _Output($sOutput)
GUICtrlSetData($hCodeOutput, GUICtrlRead($hCodeOutput) & $sOutput)
EndFunc ;==>_Output
Update:
IDO-Interpreter (Version 1.1)
Changelog:
-2 Engines:
-Chesstiger-Engine (Von mir)
-Marsi-Engine (Von Marsi [Nochmal danke!])
#include <EditConstants.au3>
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <GUIEdit.au3>
$sFile = "test.txt"
$fDebug = True
$hGUI = GUICreate("IDO-Interpreter", 500, 250)
$hCodeInput = GUICtrlCreateEdit("Input", 0, 0, 250, 100, $WS_VSCROLL + $ES_AUTOVSCROLL)
$hCodeOutput = GUICtrlCreateEdit("Output", 0, 150, 250, 100, $ES_READONLY + $WS_VSCROLL + $ES_AUTOVSCROLL)
$hDebugOutput = GUICtrlCreateEdit("Debug", 250, 0, 250, 250, $ES_READONLY + $WS_VSCROLL + $ES_AUTOVSCROLL)
GUICtrlSetBkColor(-1, 0x999999)
GUICtrlSetColor(-1, 0xFFFFFF)
$hRunButton = GUICtrlCreateButton("Execute", 0, 100, 150, 50)
$hCtEngineRadio = GUICtrlCreateRadio("Chesstiger-Engine",150,100)
GUICtrlSetState($hCtEngineRadio, $GUI_CHECKED)
$hMarsiEngineRadio = GUICtrlCreateRadio("Marsi-Engine",150,120)
GUISetState()
While 1
$iMsg = GUIGetMsg()
Switch $iMsg
Case -3
Exit
Case $hRunButton
If BitAND(GUICtrlRead($hCtEngineRadio), $GUI_CHECKED) = $GUI_CHECKED Then _Run_CtEngine()
If BitAND(GUICtrlRead($hMarsiEngineRadio), $GUI_CHECKED) = $GUI_CHECKED Then _Run_MarsiEngine()
EndSwitch
WEnd
#region Chesstiger-Engine
Func _Run_CtEngine()
GUICtrlSetData($hDebugOutput, "")
GUICtrlSetData($hCodeOutput, "")
$hTimer = TimerInit()
[/autoit] [autoit][/autoit] [autoit]_Debug("Program started!" & @CRLF & @CRLF)
Dim $asCmd
$asCmd = _InputReadToCommands($sFile)
$iCell = 65
For $i = 1 To $asCmd[0]
_Debug("Read Char: " & $asCmd[$i] & @CRLF & " Action: ")
$fMatch = False
$sChar = $asCmd[$i]
Select
Case $sChar == "I"
$fMatch = True
$iCell += 10
_Debug("Increment Cell from " & $iCell - 10 & " to " & $iCell & @CRLF)
Case $sChar == "i"
$fMatch = True
$iCell += 1
_Debug("Increment Cell from " & $iCell - 1 & " to " & $iCell & @CRLF)
Case $sChar == "D"
$fMatch = True
$iCell -= 10
_Debug("Decrement Cell from " & $iCell + 10 & " to " & $iCell & @CRLF)
Case $sChar == "d"
$fMatch = True
$iCell -= 1
_Debug("Decrement Cell from " & $iCell + 1 & " to " & $iCell & @CRLF)
Case $sChar = "O"
$fMatch = True
_Debug("Output Cell as ASCII-Char from " & $iCell & " to '" & Chr($iCell) & "'" & @CRLF)
_Output(Chr($iCell))
Case $sChar == "R"
$fMatch = True
_Debug("Resetting Cell from " & $iCell & " (" & Chr($iCell) & ") to 65 (A)" & @CRLF)
$iCell = 65
Case $sChar == "r"
$fMatch = True
_Debug("Resetting Cell from " & $iCell & " (" & Chr($iCell) & ") to 97 (a)" & @CRLF)
$iCell = 97
EndSelect
If $fMatch = False Then
_Debug("None. Character is unknown." & @CRLF)
EndIf
Next
_Debug(@CRLF & "Program ended. Time: " & Round(TimerDiff($hTimer), 2) & " ms")
EndFunc ;==>_Run
Func _InputReadToCommands($sFile)
$sCommands = GUICtrlRead($hCodeInput)
$asCommands = StringSplit($sCommands, "")
Return $asCommands
EndFunc ;==>_InputReadToCommands
#endregion
#region Output & Debug
Func _Debug($sDebugInfo)
GUICtrlSetData($hDebugOutput, GUICtrlRead($hDebugOutput) & $sDebugInfo)
EndFunc ;==>_Debug
Func _Output($sOutput)
GUICtrlSetData($hCodeOutput, GUICtrlRead($hCodeOutput) & $sOutput)
EndFunc ;==>_Output
#endregion
#region Marsi-Engine
Func _Run_MarsiEngine() ;By Marsi
GUICtrlSetData($hCodeOutput,"")
GUICtrlSetData($hDebugOutput,"")
_Debug("Program started." & @CRLF & "The Marsi-engine does not support debugging." & @CRLF)
Local $Timer, $Interpretiert
[/autoit] [autoit][/autoit] [autoit]$Timer = TimerInit()
$Interpretiert = _Ido2Asc(GUICtrlRead($hCodeInput))
$Timer = TimerDiff($Timer)
_Debug('Program ended. Time: ' & Round($Timer, 2) & ' ms' & @CRLF)
_Output($Interpretiert)
EndFunc
Func _Ido2Asc($s)
Local $n = 65, $o = ''
For $i = 1 To StringLen($s) Step 1
Switch Asc(StringMid($s, $i, 1))
Case 105
$n += 1
Case 73
$n += 10
Case 100
$n -= 1
case 68
$n -= 10
Case 82
$n = 65
Case 114
$n = 97
Case 111
$o &= Chr($n)
Case 79
$o &= Chr($n)
EndSwitch
Next
Return $o
EndFunc ;==>_Ido2Asc
#endregion
Nebenbei, IDO kommt von den drei Grundbefehlen: Increment Decrement Output
Zeilenumbrüche werden einfach ignoriert.
Ach, hier noch mal ein Beispiel:
lg chess;)
Edit: Englisch ( ) korrigiert.