• 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
    [autoit]

    $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))

    [/autoit]


    Lange kein AutoIt mehr gemacht, könnte eins dem Skript möglicherweise ansehen..

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.

  • minx: Ja, ist mir klar, aber das sieht irgendwie falsch aus (weil ja durchaus mehrere Bedingungen zutreffen können). Aber die ElseIf-Variante wäre natürlich equivalent.

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.