Erstmal zu den Node-Typen vom AST, aus dem der AST eine Python-Code besteht:
http://docs.python.org/lib/module-compiler.ast.html
http://epydoc.sourceforge.net/stdlib/co ... odule.html
Jederer dieser Nodes hat Content. Z.B.: Hat die Node Add zwei Summanden und weitere Nodes. Man kann dann z.B. von dem Punkt rekursive zum nächsten oder davorliegenden Node gehen. -- Es spielt keine Rolle bei welcher Node man sich befindet, man kann immer vor oder Zurück gehen (Falls davor oder dahinter weitere Nodes existieren.).
Naja, die ganze Verkettung aus den Nodes (die Man an hand ihres Types identifizieren kann) Bildet dann den sogenannten AST der, wenn richtig implementiert, sehr mächtig ist.
Wenn deine API steht kannst du dann sehr simpel (Siehe z.B: ElementTree für XML ) auf die einzelenen Nodes vom AST zurückgreifen.
Der nächste schritt wäre dann einen Parser zu schreiben, der den AST in eine andere darstellbare Form überführt -> Z.B: XHTML, XML, etc.
lg
Suche Informationen über -- Text - lexer - parser --
Leis dir mal folgendes durch: http://www.rg16.asn-wien.ac.at/~python/ ... /kap20.htm
Ist zwar ein "simples" Beispiel, erklärt aber die Funktionsweise gut.
lg
Ist zwar ein "simples" Beispiel, erklärt aber die Funktionsweise gut.
lg
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Im Zweifelsfall einfach ausprobieren - es stellt sich heraus, dass das nicht geht. Aber es gibt ja auch noch re.split(), welches auch mit regulären Ausdrücken arbeitet.EnTeQuAk hat geschrieben:Und hier die Frage. Mann kan ja einen Text mit ' "text=dada".split('=') ' "zerteilen". Kann ich als Argument für das 'split' auch regular expressions nehmen? -- oder müsste ich da eventuell den txt eines 'match' Objektes übergeben?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Halte es für übertrieben oder unperformant; Aber ich (Und das sage ich als ein Nichtinformatiker), würde gleich eine saubere Lösung anstreben.EnTeQuAk hat geschrieben:[...]
Und hier die Frage. Mann kan ja einen Text mit ' "text=dada".split('=') ' "zerteilen". Kann ich als Argument für das 'split' auch regular expressions nehmen? -- oder müsste ich da eventuell den txt eines 'match' Objektes übergeben?
[...]
Das sieht für mich so aus, das ich einen Lexer aka Tokenizer habe, der mir atomare Eingabezeichen liefert mit vorangeschalteten Typ. In deinem Fall würde es so aussehen das er den kram wie ``Ich bin ** dick geschrieben ** `` z.B. so zerlegt:
Code: Alles auswählen
[(LITERAL, 'Ich bin'), (MARKUP_BOLD, None), (LITERAL, ' dick geschrieben ', (MARKUP_BOLD, None)]
Wenn der Gramma das für OK befindet, reicht er den Strom unverändert an den AST-Generator weiter, der das in ein AST erzeugt/hinzufügt. Das ganze geht da so lange bis die Datei bis zum ende durchgearbeitet wurde. -- Das Ganze nenne ich dann einfach mal Parser + Generator
Der vorteil ist, das du dann einen AST (Nach deiner eigenen Kreation) hast der eine abstrakte Repräsentation für deine Wiki-Code-Syntax darstellt, mit dem du dann fasst alles machen kannst -- Z.B. ist es jetzt ein einfaches einen neuen Parser zu schreiben, der aus dem AST z.B. XML-Code generiert oder (X)HTML, oder, oder.
Das nenne ich flexibel
lg
EDIT: Fehler ausgebessert.
Hört sich sehr schön anDas nenne ich flexibel
Ich werde mich dann mal für ne Weile verabschieden.
denn...
Ich auchAber ich (Und das sage ich als ein Nichtinformatiker), würde gleich eine saubere Lösung anstreben.
Nun ja -- ich werde dann ab und zu mal wieder mit ein paar Fragen ankommen
Danke nochmal an alle Linkposter, Tipp&Trickposter etc... ihr habt mir wiedermal geholfen, meinen Horizont erweitert!
MfG EnTeQuAk
Hi EnTe, hab irgendwie Lust selber mal zu versuchen so ein Parser + AST-Generator für eure Wiki-Syntax zu machen
Ein par Fragen habe ich aber zu der Syntax von euch: http://daucms.de/trac/wiki/MarkupImDetail
Ein par Fragen habe ich aber zu der Syntax von euch: http://daucms.de/trac/wiki/MarkupImDetail
- Sind da auch verschachtelte Markups vorgesehen? Z.B.
//**__ bolded underlined italic text__**// - Ist eine Escape-Syntax vorgesehen, mit den man auch die Markups auch in Texten benutzen kann? Z.B. \**
- Zu den Überschriften: Kannst du die Zahlen für alle 6 stufen durchgeben?
- Das ist dann sowas wie ein Kommentar wie in C++ oder?
{{{
nicht zu parsender Text
}}}
C++:
/* nicht zu parsender Text */
wäre geil... wenn ich den dann auch mitbenutzen darfsape hat geschrieben:Hi EnTe, hab irgendwie Lust selber mal zu versuchen so ein Parser + AST-Generator für eure Wiki-Syntax zu machen
Jap -- sollten möglichst erkannt werden
- Sind da auch verschachtelte Markups vorgesehen? Z.B.
//**__ bolded underlined italic text__**//
Wie meinen? -- also so, das es nicht als Dicker Text erkannt wird? -- wenn man \** benutzt? -- Hmm... denke zwei Ausrufezeichen wären dafür geeignet so von wegen[*]Ist eine Escape-Syntax vorgesehen, mit den man auch die Markups auch in Texten benutzen kann? Z.B. \**
!**! oder so was in der art... is zwar doof... weiß aber nicht
Erstmal nicht. dafür gibet ja auch die 'code' section
Das versteh ich jetz wirklich nicht[*]Zu den Überschriften: Kannst du die Zahlen für alle 6 stufen durchgeben?
Nein... das ist der BBCode[*]Das ist dann sowas wie ein Kommentar wie in C++ oder?
{{{
nicht zu parsender Text
}}}
Code: Alles auswählen
[code] nicht zu parsender Text
MfG EnTeQuAk
EDIT:
schau dir auch einfach ma ein Beispielprojekt an:
http://daucms.de/trac/browser/dauCMS/tr ... order=name
EDIT2:
ich hatte auf Arbeit heute lange weile... morgen werde ich einfach ma meine Ideen und übungen mal reinstellen... vllt. kannst du sie ja gebrauchen
Man kann also im Text nicht so etwas wie __init__ oder max_val=x**2 oder «in C leitet man Kommentare mit // ein» schreiben? Und warum nicht der Backslash wie in sehr vielen anderen Markups und literalen Zeichenketten in Programmiersprachen?EnTeQuAk hat geschrieben:Wie meinen? -- also so, das es nicht als Dicker Text erkannt wird? -- wenn man \** benutzt? -- Hmm... denke zwei Ausrufezeichen wären dafür geeignet so von wegen[*]Ist eine Escape-Syntax vorgesehen, mit den man auch die Markups auch in Texten benutzen kann? Z.B. \**
!**! oder so was in der art... is zwar doof... weiß aber nicht
Erstmal nicht. dafür gibet ja auch die 'code' section
Klar kannst du das dann benutzen wenn es dir gefällt Erwarte aber keine Wunder. Ich will das jetzt aus Fun machen und damit ein wenig mehr Übung in dem Thema krieg -- Bin also kein ProfiEnTeQuAk hat geschrieben:wäre geil... wenn ich den dann auch mitbenutzen darfsape hat geschrieben:Hi EnTe, hab irgendwie Lust selber mal zu versuchen so ein Parser + AST-Generator für eure Wiki-Syntax zu machen
Hmm, und das Escapen des Ausrufezeichens dann mit Zwei? warum nicht gleich \**. Und wenn man \ anzeigen will dann halt \\ Ausrufezeichen gehen aber auchEnTeQuAk hat geschrieben:Wie meinen? -- also so, das es nicht als Dicker Text erkannt wird? -- wenn man \** benutzt? -- Hmm... denke zwei Ausrufezeichen wären dafür geeignet so von wegen[*]Ist eine Escape-Syntax vorgesehen, mit den man auch die Markups auch in Texten benutzen kann? Z.B. \**
!**! oder so was in der art...
Hmm, kA was du meinst. Ich möchte ja auch gerne in meine Plaintext zum Beispiel ** stehen haben ohne das daraus einEnTeQuAk hat geschrieben: is zwar doof... weiß aber nicht
Erstmal nicht. dafür gibet ja auch die 'code' section
Code: Alles auswählen
[b][/b]
Du hast doch sowas hier:EnTeQuAk hat geschrieben:Das versteh ich jetz wirklich nicht[*]Zu den Überschriften: Kannst du die Zahlen für alle 6 stufen durchgeben?
Welche Zahl ist die erste Stufe und die restlichen? Hier im Forum wird für klein eine 9 benutzt so:= Überschrift erster Stufe = (die größte)
== Überschrift zweiter Stufe ==
=== Überschrift dritter Stufe ===
==== Überschrift vierter Stufe ====
===== Überschrift fünfter Stufe =====
====== Überschrift sechster Stufe ====== (die kleinste)
Code: Alles auswählen
[size=9][/size]
Ah ok. Gut das ich nachgefragt habe.EnTeQuAk hat geschrieben: Nein... das ist der BBCodeDas ist damit gemeint...Code: Alles auswählen
[code] nicht zu parsender Text
BTW:
Ich habe noch mal darüber nachgedacht. Wäre es nicht vielleicht doch besser (Performanter) einfach replaces zu mit regEx?
Werde dennoch mal erstmal versuchen meine Idee mit den AST umzusetzen. Die Performance kannst du ja dann mal testen und mir bescheid sagen
Ok, ich schau mir das mal nachehr an und fange dann mal Morgen an ein wenig zu experimentieren.EnTeQuAk hat geschrieben:[...]
EDIT:
schau dir auch einfach ma ein Beispielprojekt an:
http://daucms.de/trac/browser/dauCMS/tr ... order=name
EDIT2:
ich hatte auf Arbeit heute lange weile... morgen werde ich einfach ma meine Ideen und übungen mal reinstellen... vllt. kannst du sie ja gebrauchen
Es geht da um Überschriften und nicht um Schriftgrössen.sape hat geschrieben:Du hast doch sowas hier:EnTeQuAk hat geschrieben:Das versteh ich jetz wirklich nicht[*]Zu den Überschriften: Kannst du die Zahlen für alle 6 stufen durchgeben?Welche Zahl ist die erste Stufe und die restlichen? Hier im Forum wird für klein eine 9 benutzt so:= Überschrift erster Stufe = (die größte)
== Überschrift zweiter Stufe ==
=== Überschrift dritter Stufe ===
==== Überschrift vierter Stufe ====
===== Überschrift fünfter Stufe =====
====== Überschrift sechster Stufe ====== (die kleinste)Code: Alles auswählen
[size=9][/size]
Spätestens bei beliebigen Verschachtelungen bekommst Du Probleme, weil die nicht mit regulären Ausdrücken erkannt werden können.Ich habe noch mal darüber nachgedacht. Wäre es nicht vielleicht doch besser (Performanter) einfach replaces zu mit regEx?
Hatten wir bereits... damit sind aber einige Sachen sehr schwer umzusetzen. z.B. die 'noparse' Syntax... also andere Sachen "verstecken" etc. ist da nicht so leicht...Ich habe noch mal darüber nachgedacht. Wäre es nicht vielleicht doch besser (Performanter) einfach replaces zu mit regEx?
Ich habe bereits einiges geschrieben gehabt... erstmal werden wir weiterhin Tekisuto benutzen, Aber früher oder später möchte ich doch gerne eine eigene Lösung benutzen.
ich werde mir ma nen Ablaufprotokell erstellen, wie so eine "Parser-Session" aussehen soll... mal schaun, ob da etwas herauskommt
MfG EnTeQuAk
@EnTe & BlackJack: -- Wegen RegEx:
Ah Ok. Werde mich dann morgen gleich mal an die Arbeit machen mit den Lexer, Parser und AST-Generator und mal sehen ob was brauchbare dabei rauskommt Kann aber ein wenig dauer bis es fertig wird, da ich kein Profi bin und ich es gleich von Anfang an sauber designen will -> Papier, Stift => Konzept.
Like This:
Überschrift erster Stufe
Überschrift zweiter Stufe
Oder verstehe ich das vollkommen falsch?
Hab das mit dem hier assoziiert: http://docutils.sourceforge.net/docs/us ... -structure
Ah Ok. Werde mich dann morgen gleich mal an die Arbeit machen mit den Lexer, Parser und AST-Generator und mal sehen ob was brauchbare dabei rauskommt Kann aber ein wenig dauer bis es fertig wird, da ich kein Profi bin und ich es gleich von Anfang an sauber designen will -> Papier, Stift => Konzept.
Ja da ist mir ja schon klar Aber es geht doch um Überschriften die in unterschiedlich größten dargestellt werden.BlackJack hat geschrieben:Es geht da um Überschriften und nicht um Schriftgrössen.
Like This:
Überschrift erster Stufe
Überschrift zweiter Stufe
Oder verstehe ich das vollkommen falsch?
Hab das mit dem hier assoziiert: http://docutils.sourceforge.net/docs/us ... -structure
= headline = wird mit <h1>headline</h2> übersetzt...
== headline 2 == wird mit <h2>headline2</h2> übersetzt..
usw...
MfG EnTeQuAk
== headline 2 == wird mit <h2>headline2</h2> übersetzt..
usw...
MfG EnTeQuAk
Argh! -- ich probiere gerade ein wenig herum, mit match-objekten, der richtigen Anwendung von Regex und joa... so die Sachen...
ich habe folgendes bemerkt:
Ob so etwas mal in der Praxis vorkommt.. bestimmt... jedenfalls bekomme ich folgende ausgabe:
So... so soll das aber nicht erkannt werden... *grml* -- wie kann ich da besser vorgehen -- wie müsste ich über den Text iterieren, um Tokens anzufertigen, um solche Sachen auch "zuferlässig" zu treffen?
MfG EnTeQuAk
ich habe folgendes bemerkt:
Code: Alles auswählen
import re
RE = re.compile('\*\*(.*)\*\*')
txt = '**bold** dadada **bold2 **
da = RE.match(txt)
print da.groups()
Code: Alles auswählen
('bold** dadadada **bold2',)
MfG EnTeQuAk
Aber dieser muss die Syntax ja auch irgentwie treffen können oder?
Möchte ich übrigens auch...
oder ich warte erstma auf 'sape''s Lösung... mal schaun, wie seins ausschaut
MfG EnTeQuAk
Möchte ich übrigens auch...
oder ich warte erstma auf 'sape''s Lösung... mal schaun, wie seins ausschaut
MfG EnTeQuAk
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
XML ja, BBCode nein. Für BBCode parsen habe ich für pocoo doch einen relativ komplexen Lexer/Parser Verschnitt schreiben müssen. Probleme sind verschachtelte Quote/Code Blöcke, da geht mit Regex nichts mehr und code/list blöcke ansich, die kein BBCode in sich erlauben etc.BlackJack hat geschrieben:So etwas wie BBCode oder XML/HTML ist recht einfach, weil man bei einem Start-Tag rekursiv absteigen kann und bei einem Ende-Tag wieder eine Ebene höher gehen kann.
Wer sowas sucht: http://trac.pocoo.org/browser/pocoo/tru ... /bbcode.py
TUFKAB – the user formerly known as blackbird
kann so schwer ja nicht sein. tokenisieren, parsen, ausgeben...
hab schon mal nen PEG parser geschrieben. einziges problem ist wie ich aus dem baum dann was gescheites mache. das wuerde ich am liebsten ins grammar einarbeiten... da fehlt mir noch die breitsicht was da ne uebliche art ist das zu machen.
aber bbcode ist doch keine huerde, oder?
hab schon mal nen PEG parser geschrieben. einziges problem ist wie ich aus dem baum dann was gescheites mache. das wuerde ich am liebsten ins grammar einarbeiten... da fehlt mir noch die breitsicht was da ne uebliche art ist das zu machen.
aber bbcode ist doch keine huerde, oder?
...meh...
Das "Nein" verstehe ich jetzt nicht? Wo widersprichst Du mir denn? Oder wo gibt's Probleme mit einem rekursiv absteigenden Parser?blackbird hat geschrieben:XML ja, BBCode nein. Für BBCode parsen habe ich für pocoo doch einen relativ komplexen Lexer/Parser Verschnitt schreiben müssen. Probleme sind verschachtelte Quote/Code Blöcke, da geht mit Regex nichts mehr und code/list blöcke ansich, die kein BBCode in sich erlauben etc.BlackJack hat geschrieben:So etwas wie BBCode oder XML/HTML ist recht einfach, weil man bei einem Start-Tag rekursiv absteigen kann und bei einem Ende-Tag wieder eine Ebene höher gehen kann.