![]() |
Programmmieren eines Mathe-Parsers
liebe Programmiere,
Ich bräcuhte mal eure Hilfe. Gestern habe ich einen Eintrag gemacht, bei dem rauskam, dass ich einen Mathe-Parser programmieren muss. Jetzt habe ich ein Problem. ich habe noch nie mit Parser gearbeitet. Nun habei ch mich im Internet informiert. Allerdings bin ich aus diesen Angaben nich sdchlau geworden :gruebel: . Nun meine Frage: Wie Programmirt man einen Parser. Die definitionen habe ich mir schon angeschaut. Vielen dank für eure Hilfe, mfg Sebastian |
Re: Programmmieren eines Mathe-Parsers
Schau mal im OpenSource-Bereich nach HAM, da kannst Du Dir bestimmt etwas abgucken oder das Ding gleich weiterentwickeln ;)
|
Re: Programmmieren eines Mathe-Parsers
Ich weiß nicht, wie professionell ein Parser sein muss, damit er PARSER genannt werden kann. Aber wenn es dir darum geht, dass du eine Aufgabe in Form eines Strings z.B.
Code:
ausrechnest, kann ich dir empfehlen mit Stringmethoden den String so zu zerlegen, dass du Zahlen rausarbeitest und schaust, welches Rechenzeichen zwischen ihnen steht.
5+9*3-1+(7*2)
Also als erstes die Vorrangoperatoren und dann schreibst du sie zurück in den String. Bei dem Beispiel sollte das Programm dann erstmal nach Klammern suchen und diese lösen und in den Klammern (je nachdem wieviel drin steht) fängst du dann (wie im restlichen Teil der Aufgabe, wenn die Klammern weg sind) an, nach * und / zu suchen und die umliegenden Zahlen zu isolieren bzw. so zu konvertieren (in Integer oder Double z.B.), dass du intern mit ihnen rechnen kannst. Dann löst du die Aufgabe über eine Abfrage was für ein Operator zwischen ihnen steht. Bspw. 7*2 >> if Op = '*' then 7*2 else 7/2; (da du Vorrangrechnung zuerst machst, brauchst du in diesem Fall nur * oder / überprüfen, später + und - . Die Zahlen musst du eben vorher schon mittels StrToInt/Float und Copy aus dem String kopieren. Und so machst dus nachher mit + und - und außerhalb der Klammern auch. Später lässt sich das ja dann auch noch auf Wurzel, Quadrat usw. erweitern. Nur immer den Vorrang beachten. Man könnte auch ein Array nehmen, welches die Zahlen speichert (also alle Zahlen raussuchen) und dann eins, welches angibt, wie mit zwei benachbarten zahlen zu rechnen ist. Da wird es aber schwierig, wenn man Klammern in der Aufgabe hat, denn dann muss man diese Arrays verschachteln... |
Re: Programmmieren eines Mathe-Parsers
Verwende mal die Suchfunktion hier im Forum.
Da gibst Du als Suchwort "Matheparser" oder "Parser" ein. Es werden bestimmt etliche Themen dazu gefunden. |
Re: Programmmieren eines Mathe-Parsers
Zitat:
|
Re: Programmmieren eines Mathe-Parsers
Wenn ich den Begriff "Mathe-Parser" lese, schwenken meine Hirnwindungen eben gleich zu HAM (ich kann nichts dafür, diese Stimmen...) :mrgreen:
|
Re: Programmmieren eines Mathe-Parsers
Oje, was hab' ich da nur angerichtet... ;)
|
Re: Programmmieren eines Mathe-Parsers
Hi,
erst einmal ist die Frage, was genau man unter einem Parser versteht. Genaugenommen wäre das ein Automat für einen Syntaxcheck (so hab ich es jedenfalls im Infounterricht gelernt). In der Regel ist es allerdings so, dass ein Matheparser auch gleich noch das Ergebnis berechnet, bzw. ein Rechner als Matheparser bezeichnet wird. Möchtest du also ein Programm(teil), dass einen eingegebenen Term auf Gültigkeit überprüft, oder das den Wert des Termes berechnet? Wie ich bereits sagte, hatten wir das Thema bereits in der Schule. Noch vorher habe ich mit einem Rechner angefangen. Mein Ergebnis ist ![]() Mfg FAlter [edit] Du hast ein m zu viel. [/edit] |
Re: Programmmieren eines Mathe-Parsers
Zitat:
im Allgemeinen ist es nicht möglich mit einem Automat einen Syntaxcheck durchzuführen, weil die Syntax von einem mathematischen Ausdruck nicht regulär ist. Stammt diese Behauptung von einem Info-Lehrer oder einem Mathe-Lehrer? ;-) |
Re: Programmmieren eines Mathe-Parsers
![]() |
Re: Programmmieren eines Mathe-Parsers
Hi,
die Behauptung stammt von einem Info-Lehrer und als Beispiel hatten wir einen Kellerautomat (der mit einem Stack arbeitet), meist reicht es stattdessen schon, einen Automat mit einem zusätzlichen Zähler anstelle des Stacks zu verwenden, da nur gleichartige Informationen auf dem Stack abgelegt werden und es lediglich nötig ist, zu unterscheiden, ist was drauf oder nicht. Und doch, in gewissen Grenzen bereiten Syntaxchecks mit einem Automaten kein Problem, es muss nicht einmal ein Kellerautomat sein, wenn du z. B. nur prüfen willst, ob die Eingabe eine natürliche Zahl ist. Es kommt auf den Sprachaufbau an, aber etwas in der Form (1+2)*(3^4) zu überprüfen ist möglich. (Der Stack wird dann höchstens für die Klammern benötigt, alles andere schafft man auch ohne). Tatsächlich sind komplexere Syntaxchecks bisher das einzige, wozu ich bisher einen Automaten vorgezogen habe, da ich sonst keine Idee hatte. In anderen Anwendungsfällen kann man auf die Automatentheorie meist verzichten, jedenfalls den blöden Schulbeispielen nach. Wikipedia gibt mir auch recht: Zitat:
![]() Mfg FAlter |
Re: Programmmieren eines Mathe-Parsers
Hallo,
klar funktioniert es mit einem Kellerautomaten. Ich dachte jetzt eher du meinst einen DFA, weil ein Computer ist nichts anderes als ein solcher, und Sebastian92 will das ganze ja auf Delphi programmieren, also kommt nur ein DFA in Frage. Ein Kellerautomat kann mehr als reguläre Sprachen erkennen (nämlich genau kontextfreie), und das reicht für solche Ausdrücke aus. Ein DFA wird aber im Allgemeinen NICHT ausreichen. (Beispielweise für Additionen im R^n oder auch N^n, wenn du - wie du vorgeschlagen hast - nur natürliche Zahlen verwenden willst, funktioniert es nicht.) |
Re: Programmmieren eines Mathe-Parsers
Ja nun werft dem armen doch nicht gleich die gesamte Automatentheorie vor die Füße :). Wobei ich zugeben muss, dass ich erst so wirklich verstanden habe was ein Parser genau tut, nachdem ich mir die theoretische Informatik Vorlesung reingeschlabbert hab.
Wenn du (TE) noch ziemlicher Neuling beim Programmieren bist, und mit Begriffen wie Compilerbau, Tokenizer oder Automaten so überhaupt nichts verbindest, wäre es in der Tat erstmal ratsam, wenn du dir einen existierenden Parser schnappst und ihn nutzt. Um einen eigenen so gut zu bekommen wie manchen bestehenden (HAM z.B. ;)) wird, so meine Vermutung stimmt, dass du Neuling bist, eine ganz schön beachtliche Menge Theorie zwischen dir und einem eigenen brauchbaren Parser stehen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz