Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Parser für Klammern (https://www.delphipraxis.net/186891-parser-fuer-klammern.html)

ford42 9. Okt 2015 07:39

Parser für Klammern
 
Hey,
ich sollte erst einen Parser für */+- schreiben, das ist mir auch gelungen.
Doch nun ist noch die Aufgabe dazu gekommen, dass ich noch einen Parser für Klammern einbauen soll.

Ich hatte zwar schon eine Idee, aber dann hab ich gemrkt, dass ich einen Denkfehler drin hatte und sie deshalb nicht funktionieren würde.


Kann mir bitte jemand einen Tipp für ein KonZept/Algorithmus geben? :)


Grüße ford42

PS: Sry, für die vielen Threads, aber ich weiß gerade sonst echt nicht weiter. :/

EDIT: Wenn es nur eine innere Klammer geben würde, würde meine Idee funktionieren, aber weil es mehrere innere Klammern gibt funktioniert sie nicht mehr.

Meine Idee:
Die Position für die offenen Klammern in ein Array schreiben
Das selbe für die schließende Klammern

Dann den letzten Wert von dem Array für die offenen Klammern als Startgrenze und der erste Wert von den schließenden Klammern als Endgrenze nehmen.
Die Sachen was in dieser Grenze steht mit dem vorhandenem Parser verrechnen, das Ergebnis mit den 2 Klammern und dem Inhalt ersetzen und die nächste Grenze ermitteln + ausrechnen + ersetzen,...

Sir Rufo 9. Okt 2015 07:58

AW: Parser für Klammern
 
In deinem letzten Beitrag sind dir drei Lösungen offeriert worden, die alle Ausdrücke mit Klammern verarbeiten.

Wo ist denn jetzt das Problem?

ford42 9. Okt 2015 08:05

AW: Parser für Klammern
 
Soweit ich das verstehe, waren das alles fertig Lösungen, ich würde lieber mit ner Idee was programmieren, da somit der Lernefekt vlt auch größer ist. :)

Grüße ford42

JasonDX 9. Okt 2015 08:30

AW: Parser für Klammern
 
Der beste Weg ist, sich mit kontextfreien Grammatiken zu beschäftigen, und Algorithmen zu suchen (bspw. CYK), die diese erkennen können.
Dann kannst du eine Grammatik für deine Terme mit Klammern schreiben, und auf Basis eines erkennenden Algorithmus dann deinen Parser schreiben. (Oder nimmst dann Lex und Yacc für letzteren Teil).

Vorteil: Du musst eine Grammatik schreiben, und damit klar definieren, was ein gültiger Term ist, und was nicht. Vermeidet viel Kopfzerbrechen beim debuggen.

Jasocul 9. Okt 2015 08:35

AW: Parser für Klammern
 
Ich werfe mal den Begriff "Rekursion" in den Raum.

Sir Rufo 9. Okt 2015 09:02

AW: Parser für Klammern
 
Zitat:

Zitat von ford42 (Beitrag 1318114)
Soweit ich das verstehe, waren das alles fertig Lösungen, ich würde lieber mit ner Idee was programmieren, da somit der Lernefekt vlt auch größer ist. :)

Grüße ford42

Kann man jetzt daraus schliessen, dass du dir die Links noch nicht einmal angeschaut hast?

Du solltest dir auf jeden Fall das hier anschauen.
http://www.delphipraxis.net/1317773-post3.html (Beitrag 3)
Erklärung und Source ... aber nicht PlugAndPlay

ford42 9. Okt 2015 09:29

AW: Parser für Klammern
 
Zitat:

Zitat von Sir Rufo (Beitrag 1318120)
Zitat:

Zitat von ford42 (Beitrag 1318114)
Soweit ich das verstehe, waren das alles fertig Lösungen, ich würde lieber mit ner Idee was programmieren, da somit der Lernefekt vlt auch größer ist. :)

Grüße ford42

Kann man jetzt daraus schliessen, dass du dir die Links noch nicht einmal angeschaut hast?

Du solltest dir auf jeden Fall das hier anschauen.
http://www.delphipraxis.net/1317773-post3.html (Beitrag 3)
Erklärung und Source ... aber nicht PlugAndPlay

Doch, habe ich natürlich. :)

Nur mir fällt es sehr schwer diesen Parser mit meiner GUI und dem Controller zu verbinden.
Klar ich hätte das GUI und den Controller umbauen könnten, aber ich wollte es auch so hinbekommen, ohne dass ich alles umbauen muss.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz