parsing
-
Schau dir mal das Interpreter Pattern an. Lohnt sich allerdings eher für kleine Parser, nicht für komplettte Programmiersprachen..
-
chabayo schrieb:
Ich bin auf der suche nach der besten Moeglichkeit Texte/Code analytisch zu scannen/parsen.
Wie tief bist du bereit, dich in das Thema einzuarbeiten? Das eine oder andere Buch zu dem Thema wuerde ich schon empfehlen ...
Primaer gehts mir da drum, wenn ich z.B. Beispielcode habe den in seine Funktionen zu zerlegen um schnell mal Uebersicht zu gewinnen, oder Snippets herauszuloesen und anderswo einzufuegen, oder etwas was in diese Richtung parallelen aufweist.
Sowas wie ctags oder Doxygen o.ae.? Was genau hast du vor?
Also im Grunde wohl sowas wie Lex/Yacc, oder (vielleicht) auch Bison ??
Bison ist die GNU-Version von Yacc. Das originale yacc gibts m.W. nur auf kommerziellen Unix-Systemen. Das gleiche gilt in Bezug auf Flex und lex, nur das Flex nicht zum GNU-Projekt gehoert.
Waer gut wenn man deren Regeln waehrend der Laufzeit abaendern koennte...
Das geht weder bei Bison noch bei Spirit noch bei irgendwelchen anderen mir bekannten Parser-Frameworks. Es gibt zwar im Grunde keine prinzipiellen Schwierigkeiten zu ueberwinden, aber wozu soll man das denn brauchen?
-
Bashar schrieb:
chabayo schrieb:
Ich bin auf der suche nach der besten Moeglichkeit Texte/Code analytisch zu scannen/parsen.
Wie tief bist du bereit, dich in das Thema einzuarbeiten? Das eine oder andere Buch zu dem Thema wuerde ich schon empfehlen ...
...soweit wuerde ich nicht gehen, hab mir ein Buch angesehen,und da kann ich ja gleich ein Informatikstudium beginnen. Oder seh ich das so falsch??
Bashar schrieb:
Sowas wie ctags oder Doxygen o.ae.? Was genau hast du vor?
...eigentlich schon, nur komm ich irgendwie nicht ganz klar mit ctags, und so schwer ist es ja wohl auch nicht fuer c einen Parser zu schreiben oder??
--Doxygen: ...werd ich mir genauer ankucken.
.filmor schrieb:
C++? Dann http://spirit.sourceforge.net/.
...sieht ja lecker aus, thx.
Danke erstmal, muss das aufarbeiten.
cu
chab
-
Du solltest die Aufgabe einen Parser für C zu schreiben nicht unterschätzen...
Ich habe mich lange damit herumgeplagt die ANSI Grammatik auf "reales" C u.a. mit Dialekten von embedded Compilern zu erweitern.
Allerdings habe ich den Parser mit Lex und Yacc (bzw. flex und bison) erstellt und nicht mit Boost::spirit.
Und ohne Bücher gelesen zu haben wird es auch ein steiniger Weg. Damals war ich in der gleichen Situation wie du, da ich vom Compilerbau, bzw. Automatentheorien noch keine Ahnung hatte und gleich mit einem Parser für C begonnen habe.
Meiner Einschätzung nach wäre es 1000x leichter sich die ctags näher anzuschauen....
Gruß Patrick
-
Bashar schrieb:
Waer gut wenn man deren Regeln waehrend der Laufzeit abaendern koennte...
Das geht weder bei Bison noch bei Spirit noch bei irgendwelchen anderen mir bekannten Parser-Frameworks.
Wieso soll das bei Spirit nicht gehen?
Bashar schrieb:
Es gibt zwar im Grunde keine prinzipiellen Schwierigkeiten zu ueberwinden, aber wozu soll man das denn brauchen?
Für Parser-Generatoren.
-
.filmor schrieb:
Bashar schrieb:
Waer gut wenn man deren Regeln waehrend der Laufzeit abaendern koennte...
Das geht weder bei Bison noch bei Spirit noch bei irgendwelchen anderen mir bekannten Parser-Frameworks.
Wieso soll das bei Spirit nicht gehen?
Weil beide Frameworks zur Compile-Time den Parser generieren.
-
Nur weil Spirit Expression Templates benutzt, ist der Parser nicht an die Compilezeit gebunden. Ich kann im Programm jederzeit Regeln umdefinieren:
rule<> a; if (cond) a = b; else a = c;Es gibt sogar eine "eigene" Syntax um das direkt als Expression Template zu bauen:
rule<> a = if_p(cond)[b].else_p[c];Siehe Spirit Dokumentation, Kapitel Dynamic. Oder verstehe ich das falsch?
-
OK, dann kann Spirit das wohl doch, den Punkt nehm ich zurueck. Das:
.filmor schrieb:
Für Parser-Generatoren.
... wuerde ich aber trotzdem nicht unterschreiben. Ein Parser-Generator muss doch nicht seine Eingabe-Syntax dynamisch aendern. Ich denke da eher an Sprachen, bei denen man eigene Operatoren definieren und mit beliebiger Rangfolge versehen kann. Aber selbst das muesste ohne dynamisch gebaute Regeln gehen.
-
Bei meinem derzeitigen Projekt für die Arbeit lese ich die Beschreibung gewisser Komponenten aus einer XML-Datei ein. Anhand dieser Beschreibung erzeuge ich dann einen Parser um weitere Daten einzulesen. Für sowas ist es nötig den Parser dynamisch zu erzeugen.
-
Nicht schlagen, aber bei "Regeln zur Laufzeit aendern" denk ich nicht daran, zur Laufzeit einen Parser zu erzeugen, sondern die Regeln *waehrend* des Parsens einer Datei abhaengig vom Inhalt der Datei zu aendern. Dein Problem koennte man ja z.B. auch loesen in dem man eine Beschreibung fuer bison generiert, uebersetzt und ausfuehrt.
-
Okay, für sowas kann ich mir auch nicht wirklich Vorstellen wozu es gut sein sollte.