Hallo, ich möchte in C++ folgendes tun: gegeben sei eine LaTeX-Datei main.tex. Dort werden per \input{} weitere Files includiert, und diese können wiederum mit \input{} weiteres includieren. Was ich jetzt tun möchte, ist, die Struktur dieser Includierungen heraus zu finden und in einem Baum abzuspeichern. Ich habe mir überlegt, einfach mittels Rekursion ein File nach \input{} zu durchsuchen, und dann die inkludierten Files ebenso. Aber das Problem ist dann ja: wenn im normalen Text irgendwo auch \input vorkommt, dann würde mein "Parser" ja eine vermeintliche Datei finden... also, ganz so einfach scheint es nicht zu sein. Habt ihr kluge Ideen?
Fang doch erstmal einfach an: Finde ein input in einer Datei und weise den Dateinamen einer Variablen zu. Wenn das läuft, kommt der Rest über Rekursion ganz einfach angeflogen.
Nicht nur Dein Parser würde eine "Datei" finden, der von TeX würde genauso reagieren. Also alles im grünen Bereich. fchk
Frank K. schrieb: > Nicht nur Dein Parser würde eine "Datei" finden, der von TeX würde > genauso reagieren. Auch dann, wenn \input{datei} in einer verbatim-Umgebung steht? Wobei man diesen Fall auch noch relativ leicht abfangen könnte. Damit hätte man wahrscheinlich 99,99% aller Fälle abgedeckt. Wenn's 100% sein sollen, bleibt wohl nicht viel anderes übrig, als den Original-Parser zu verwenden, dessen Quellcode ja öffentlich ist.
Yalu, genau das dachte ich auch. Ich versuche jetzt mal, die Datei Zeilenweise einzulesen. Wenn in einer Zeile \begin{verbatim} steht, setze ich ein Flag, und lese so lange weiter, bis \end{verbatim} steht, und resete dann das Flag. Und nur wenn das Flag nicht gesetzt ist, suche ich nach \input. Kann man das so machen? Hmm ich werde mir mal den originalen Source ansehen.
Oscon schrieb: > kann man > das so machen? Man kann vieles machen, die Frage ist: Lohnt der Aufwand? Wie oft hat man bitte diesen Fall? Und wie "schlimm" ist es wenn in einem von 1000 Files mal ein falsches include angezeigt wird?
Stimmt, ja da hast du recht. Noch eine Frage zur Vorgehensweise: ich hätte das jetzt mit einer rekursiven Funktion erledigt. So kann ich den Baum unglaublich elegant aufbauen und es wird alles sehr einfach. Frage: darf man das so machen? Im Prinzip bin ich ein Gegner der rekursion; normalerweise programmiere ich Mikrocontroller und dort sollte man das ja aufgrund des begrenzten Stack nicht machen...
Nein Rekursion wird mit Geldstrafe zu 90 Tagessätzen oder alternativ mit bis zu 2 Jahren Freiheitsstrafe geahndet. Lass dich dabei nicht erwischen!
rekursion ist halt ultraschlecht lesbar, aber manche probleme lassen sich dadurch sehr elegant lösen
Du solltest den (fehlerhaften) Fall abfangen, dass eine LaTex-Datei sich selbst mit 'include' einfügt ("inkludiert"). Ansonsten stürzt das rekursive Programm ab.
Wenn das Programm "vernünftig" angewandt wird, also mit realistischen LaTeX-Dokumenten, sollte die Rekursion kein Problem darstellen, da der Programmstack auf PCs typischerweise ein paar Megabytes groß ist und bei Bedarf auch noch vergrößert werden kann. Wenn der Anwender das Programm aber auf Herz und Nieren testen wird, würde ich auf die Rekursion verzichten und stattdessen dynamischen Speicher verwenden. Auch der Speicher wird irgendwann überlaufen, das ist von der Software aber leichter zu erkennen, so dass sich das Programm dann kontrolliert mit Fehlermeldung beenden kann. Ich würde das Ganze auch nicht als Baum, sondern als allgemeinen gerichteten Graphen darstellen. Das wird übersichtlicher, wenn eine Datei mehrfach inkludiert wird, die ihrerseits weitere Dateien inkludiert. Dann enthält der Baum mehrere gleiche Unterbäume, was ihn unnötig aufbläht. Im gerichteten Graphen hingegen taucht jede Datei genau einmal auf. Zudem können damit auch die von Jürgen angesprochenen rekursiven Inklusionen problemlos dargestellt werden. Da bei der Generierung des gerichteten Graphen ein rekursiver Algorithmus nicht einfacher als ein iterativer ist, stellt sich die Frage nach der Legitimität der Rekursion gar nicht erst. In den meisten LaTeX-Dokumenten wird jede Datei nur einmal inkludiert, so sich der gerichtete Graph nicht vom Baum unterscheiden wird. Da die Programmierung des Graphen nicht schwieriger ist, würde ich diesen vorziehen. Lediglich die grafische Darstellung des Graphen wird aufwendiger, aber dafür gibt es ja bspw. das Graphviz-Paket.
es soll ja noch dinge wie grep, sed und awk geben mit denen man textdateien parsen kann, wenn man kann auch graphviz wäre recht simpel um eine darstellung zu erzeugen weil man einfach schreiben kann: a -> b und a -> c , usw da braucht man keinen baum basteln das macht das tool schon
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.