Moin moin,
ich hab vorhin beim Aufräumen ein altes und kaputtes Skript gefunden, und hab es jetzt mal korrigiert. Es ist nicht so komplex oder mächtig, hilft aber beim Verständnis davon, wie Programmiersprachen funktionieren. Es ist daher eher als Lehrstück als als nützliches Tool zu betrachten.
Im Prinzip ist es einfach ein simpler rekursiver Evaluator, der gleichzeitig Aspekte eines Tokenizers und Parsers in sich vereint. Wegen seiner Einfachheit braucht es noch nicht mal einer Baumstruktur, geschweige denn eines echten Tokenizers. Wenn ihr es schafft, das Skript so zu verändern, dass es auch Klammern unterstützt, habt ihr es verstanden, dürft euch auf die Schulter klopfen und nach Hause gehen.
Er kann Terme der Form "2*x-4*6==7" oder "9-x*x*x" auswerten.
Spoiler anzeigen
$gleichung="2*3*x-9*x==3"
$x=4
Func _Eval($gleichung)
If StringInStr($gleichung,"==") Then
$sides=StringSplit($gleichung,"==",3)
If Number(_Eval($sides[0])) == Number(_Eval($sides[1])) Then
Return "TRUE"
Else
Return "FALSE"
EndIf
EndIf
If StringInStr($gleichung,"+") Then
$parts=StringSplit($gleichung,"+",2)
$return=0
For $term In $parts
$return += _Eval($term)
Next
ConsoleWrite($gleichung&"-->"&$return&@CRLF)
Return $return
EndIf
If StringInStr($gleichung,"-") Then
$parts=StringSplit($gleichung,"-")
$return=_Eval($parts[1])
For $i=2 To UBound($parts)-1
$return -= _Eval($parts[$i])
Next
ConsoleWrite($gleichung&"-->"&$return&@CRLF)
Return $return
EndIf
If StringInStr($gleichung,"*") Then
$parts=StringSplit($gleichung,"*",2)
$return=1
For $term In $parts
$return *= _Eval($term)
Next
ConsoleWrite($gleichung&"-->"&$return&@CRLF)
Return $return
EndIf
If StringInStr($gleichung,"/") Then
$parts=StringSplit($gleichung,"/")
$return=_Eval($parts[1])
For $i=2 To UBound($parts)-1
$return /= _Eval($parts[$i])
Next
ConsoleWrite($gleichung&"-->"&$return&@CRLF)
Return $return
EndIf
If $gleichung == "x" Then Return $x ;x wird ausgewertet
Return $gleichung ;Ansonsten ist es wohl eine Zahl
EndFunc
MsgBox(64,$gleichung,"= " & _Eval($gleichung))
Lange kein AutoIt mehr gemacht, könnte eins dem Skript möglicherweise ansehen..