PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C# String "rechnen"



Flup
01.10.2008, 16:16
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

asdfman
01.10.2008, 16:23
Schreibste en Parser.

Flup
01.10.2008, 16:29
Sry für die Frage, aber wie mach ich das?

claW.
01.10.2008, 16:45
parser (http://de.wikipedia.org/wiki/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.

WingX
01.10.2008, 16:48
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 (http://www.codeproject.com/KB/cs/MathParserLibrary.aspx), dort gibts nämlich sowas schon.
Anhand dieses Codes kannst du dir die Funktionsweise ansehen.

Epyx
01.10.2008, 17:21
Hmm in C++ hab ich dat mal mit Templates gemacht. Aber der Tipp mit CodePrject is nich schlecht. ;) wird sozusagen gebookmarkt.

Flup
01.10.2008, 19:30
Danke, der MathParser von CodeProject funst hervorragend ;)

Flup

Limit
01.10.2008, 23:14
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.

olampl
01.10.2008, 23:32
LUA ist auch eine moeglichkeit, oder man verwendet xpath (ist sau schnell). Habe beides schon in c# verwendet

Flup
02.10.2008, 11:37
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 ;)

olampl
03.10.2008, 01:40
(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

Toaster
03.10.2008, 14:07
Hi,

in JScript gibt es die Eval Funktion die das kann:
http://www.west-wind.com/WebLog/posts/10688.aspx