C# String "rechnen"

F

Flup

Gast
Hallo zusammen,
ich bin gerade dabei mich ein wenig in C# einzuarbeiten. Nun steh ich vor dem Problem, dass ich einen "formelstring" habe wie "24*52-(8+45)". Nun könnt ich über formelstring.substring natürlich das ganze nach und nach aufarbeiten, aber dabei muss man jede Menge beachten wie "Punkt vor Strich", keine Division durch 0 etc. Gibt es da irgendwas, wie ich den string "einfacher rechnen lassen kann"?

Danke

Flup
 
parser
Zur Analyse des Texts verwenden Parser in der Regel einen separaten lexikalischen Scanner (auch Lexer genannt). Dieser zerlegt die (als simple Aneinanderreihung von Zeichen vorliegenden) Eingabedaten in Token (Eingabesymbole bzw. „Wörter“, die der Parser versteht); weil die Zerlegung in Tokens einer regulären Grammatik folgt, ist der Scanner meist ein endlicher Automat. Diese Token dienen als atomare Eingabezeichen des Parsers.

Der eigentliche Parser als Implementierung eines abstrakten Automaten (meist realisiert als Kellerautomat) kümmert sich dagegen um die Grammatik der Eingabe, führt eine syntaktische Überprüfung der Eingangsdaten durch und erstellt in der Regel aus den Daten einen Ableitungsbaum (in Anlehnung an das Englische gelegentlich auch als Parse-Baum bezeichnet). Dieser wird danach zur Weiterverarbeitung der Daten verwendet; typische Anwendungen sind die semantische Analyse, Codegenerierung in einem Compiler oder Ausführung durch einen Interpreter.

Im obigen HTML-Beispiel würde ein lexikalischer Scanner die HTML-Datei in HTML-Tags und Fließtext zerlegen und diese Bestandteile an den Parser weiterreichen – d. h. den Scanner „interessiert“ nur das Aussehen der Syntaxelemente („wenn es in spitzen Klammern steht, ist es ein HTML-Tag“). Der Parser dagegen verarbeitet die syntaktischen Zusammenhänge, d. h. untersucht, welche Paare von Tags zusammen gehören bzw. wie die Tags ineinander verschachtelt sind; die inhaltliche Bedeutung der Tags interessiert den Parser dagegen nicht, sondern wird erst von der darauf folgenden Weiterverarbeitung berücksichtigt.

Anschaulich dargestellt ist ein Parser diejenige Software, welche die Anweisungen im Quelltext des Anwenders überprüft, weiterverarbeitet und weiterleitet.

wie es funktioniert steht da, die umsetzung musst du machen.
 
asdfman hat sich das ziemlich leicht gemacht.
Das, was du vorhast, erfordert ziemlich viel Arbeit. Ein Parser ist ein Algorithmus, der eine Eingabe, in deinem Fall den Formelstring, nach bestimmten Regeln durchsucht und daraus logisch etwas bastelt, in deinem Fall eine Rechnung. Das ist aber schon ziemlich heftiges Zeugs, für einen Anfänger nicht wirklich geeignet. Vielleicht fängst du lieber mit etwas leichterem an.
Oder du besorgst dir den Sourcecode von hier, dort gibts nämlich sowas schon.
Anhand dieses Codes kannst du dir die Funktionsweise ansehen.
 
Hmm in C++ hab ich dat mal mit Templates gemacht. Aber der Tipp mit CodePrject is nich schlecht. ;) wird sozusagen gebookmarkt.
 
Es gibt doch entsprechender Generatoren, bei denen man nur den Syntax "beschreibt" und die einem dann einen Parser generieren. Wir hatten das mal in der Uni für Haskell. Einen Parser für Prädikatenlogik war damit in wenigen Minuten erzeugt. Ich vermute, dass es für C# etwas ähnliches gibt. Einfach mal nach Parser und Generator suchen.
 
LUA ist auch eine moeglichkeit, oder man verwendet xpath (ist sau schnell). Habe beides schon in c# verwendet
 
JO in Lua würde das so aussehn, was ich bräuchte:

RunScript("function() ergebnis = "..funktionsstring.."end"), aber bis ich Lua drinnen hab ist das mit dem MathParser besser ;)
 
(evtl. ;) ich kenne ihn nicht (noch)), aber LUA ist sehr cool wenns mehr zu rechnen gibt, ich schau mir mal den MathParser an, um zu sehen ob der schneller ist als xpath.

Edit: Glaub ich nicht, aber mal schaun
 
Zuletzt bearbeitet:
Zurück
Oben