Also mein genialer Gedanke war folgender:
Alle Teilterme, die unterstützt werden, werden in einen Regulären Ausdruck gepackt. Und zwar in einer einzig gültigen Notation.
Ich finde es zwar eine gute Idee, Groß- und Kleinschriebung zu ignorieren. Aber möglicherweise ist das in künftigen Versionen hinderlich. Wie wäre es zum Beispiel, wenn wir später noch Unterstützung für Variablen einbauen?
Zum Beispiel kann der User x=5 setzen und später den Ausdruck x+7 ausrechnen lassen. Somit wären wir beispielsweise beim Kapitel Funktionen. Wäre es nicht praktisch, in einer For x=-5 to 5-Schleife einen kleinen Funktionsverlauf bzw. Graphen ermitteln zu können?
Ich würde deshalb die Groß- und Kleinschreibung nicht unterstützen, weil es ja vielleicht Probleme geben könnte, Variablen von Funktionen und anderen Variablen zu unterscheiden:
Hier zum Beispiel gibt's die Variable f und die Funktion f(). Ist nur ein Beispiel, mir fällt gerade kein anderes ein.
Und wenn, dann würde ich den Mathematischen Ausdruck (MathExp

) nicht mit
LCase() klein machen, sondern die Groß- und Kleinschriebung mittels edel's Flag oder (?i) im Regulären Ausdruck ignorieren. So hat man zur Not hinterher immer noch den Originalstring zur Verfügung.
>Soll ich alle anderen ungültigen Zeichen auch noch auflisten, oder wie können diese am besten behandelt werden?
(Man, wie man abschweifen kann...

)
Zum eigentlichen Problem: Meine oben angesprochene Idee war folgende:
Code: Alles auswählen
_________________________________________________________________________________________________
CreateRegularExpression(#PB_Any, "(?i)(\d(|\.\d+)+|\$[\da-f]+|\*|/|-|\+|(sin|cos|tan|)\(|\)|\^)")
------1---- ----2----- 3 4 5 6 -------7------- 8 9
0. Ignoriert Groß- und Kleinschreibung
1. Erkennt ganze als auch Dezimalzahlen
2. Erkennt Hexadezimalezahlen
3.-6. Als Beispiel hier mal die einfachsten Rechenoperationen
7. Erkennt öffnende Klammern. Optional darf sin, cos oder tan davor stehen, was die Klammer zu einer Funktion macht
8. Schließende Klammern
9. Potenzen
...alle Unterstützen Operationen, Funktionen, Operatoren, etc. würden hier folgen.
Wenn man alles Erlaubte wie hier in einen Ausdruck packt, braucht mannicht noch extra die ungültigen Sachen definieren. Wenn ich 'ne Pommes weiß will, bestell ich auch nicht extra Ketschup um allen zu zeigen: "Den Ketschup will ich nicht essen."
Dann gibt es 2 Möglichkeiten:
Code: Alles auswählen
If ReplaceRegularExpression(rex, MathExp$, "")
Debug "Fehler"
EndIf
; oder
Dim Token.s(0)
Define length, n, AnzahlToken=ExtractRegularExpression(rex, MathExp$, Token())
For n=1 to AnzahlToken
length=Len(Token(n-1))
Next
If length <> Len(MathExp$)
Debug "Fehler
EndIf
1. Entweder man ersetzt alle gültigen Zeichen durch "" (nichts) und prüft dann ob was übrig bleibt (das snd dann ungültige Zeichen).
2. Oder man geht das Token-Array durch und summiert deren einzelne Stringllängen; anschließend vergleicht man diese Stringlänge mit der Länge des MathExp$.