Seite 2 von 5
Verfasst: Donnerstag 1. Februar 2007, 16:29
von sape
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
- 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 */
lg
Verfasst: Donnerstag 1. Februar 2007, 20:48
von EnTeQuAk
sape hat geschrieben:Hi EnTe, hab irgendwie Lust selber mal zu versuchen so ein Parser + AST-Generator für eure Wiki-Syntax zu machen
wäre geil... wenn ich den dann auch mitbenutzen darf
- Sind da auch verschachtelte Markups vorgesehen? Z.B.
//**__ bolded underlined italic text__**//
Jap -- sollten möglichst erkannt werden
[*]Ist eine Escape-Syntax vorgesehen, mit den man auch die Markups auch in Texten benutzen kann? Z.B. \**
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
!**! oder so was in der art... is zwar doof... weiß aber nicht

Erstmal nicht.

dafür gibet ja auch die 'code' section
[*]Zu den Überschriften: Kannst du die Zahlen für alle 6 stufen durchgeben?
Das versteh ich jetz wirklich nicht
[*]Das ist dann sowas wie ein Kommentar wie in C++ oder?
{{{
nicht zu parsender Text
}}}
Nein... das ist der BBCode
Das ist damit gemeint...
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

Verfasst: Donnerstag 1. Februar 2007, 20:58
von BlackJack
EnTeQuAk hat geschrieben:
[*]Ist eine Escape-Syntax vorgesehen, mit den man auch die Markups auch in Texten benutzen kann? Z.B. \**
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
!**! oder so was in der art... is zwar doof... weiß aber nicht

Erstmal nicht.

dafür gibet ja auch die 'code' section
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?
Verfasst: Donnerstag 1. Februar 2007, 21:02
von sape
EnTeQuAk hat geschrieben:sape hat geschrieben:Hi EnTe, hab irgendwie Lust selber mal zu versuchen so ein Parser + AST-Generator für eure Wiki-Syntax zu machen
wäre geil... wenn ich den dann auch mitbenutzen darf
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 Profi
EnTeQuAk hat geschrieben:
[*]Ist eine Escape-Syntax vorgesehen, mit den man auch die Markups auch in Texten benutzen kann? Z.B. \**
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
!**! oder so was in der art...
Hmm, und das Escapen des Ausrufezeichens dann mit Zwei? warum nicht gleich \**. Und wenn man \ anzeigen will dann halt \\

Ausrufezeichen gehen aber auch
EnTeQuAk hat geschrieben:
is zwar doof... weiß aber nicht

Erstmal nicht.

dafür gibet ja auch die 'code' section
Hmm, kA was du meinst. Ich möchte ja auch gerne in meine Plaintext zum Beispiel ** stehen haben ohne das daraus ein
wird
EnTeQuAk hat geschrieben:
[*]Zu den Überschriften: Kannst du die Zahlen für alle 6 stufen durchgeben?
Das versteh ich jetz wirklich nicht
Du hast doch sowas hier:
= Überschrift erster Stufe = (die größte)
== Überschrift zweiter Stufe ==
=== Überschrift dritter Stufe ===
==== Überschrift vierter Stufe ====
===== Überschrift fünfter Stufe =====
====== Überschrift sechster Stufe ====== (die kleinste)
Welche Zahl ist die erste Stufe und die restlichen? Hier im Forum wird für klein eine 9 benutzt so:
EnTeQuAk hat geschrieben:
Nein... das ist der BBCode
Das ist damit gemeint...

Ah ok. Gut das ich nachgefragt habe.
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

Verfasst: Donnerstag 1. Februar 2007, 21:04
von sape
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

Ok, ich schau mir das mal nachehr an und fange dann mal Morgen an ein wenig zu experimentieren.
Verfasst: Donnerstag 1. Februar 2007, 21:18
von BlackJack
sape hat geschrieben:EnTeQuAk hat geschrieben:
[*]Zu den Überschriften: Kannst du die Zahlen für alle 6 stufen durchgeben?
Das versteh ich jetz wirklich nicht
Du hast doch sowas hier:
= Überschrift erster Stufe = (die größte)
== Überschrift zweiter Stufe ==
=== Überschrift dritter Stufe ===
==== Überschrift vierter Stufe ====
===== Überschrift fünfter Stufe =====
====== Überschrift sechster Stufe ====== (die kleinste)
Welche Zahl ist die erste Stufe und die restlichen? Hier im Forum wird für klein eine 9 benutzt so:
Es geht da um Überschriften und nicht um Schriftgrössen.
Ich habe noch mal darüber nachgedacht. Wäre es nicht vielleicht doch besser (Performanter) einfach replaces zu mit regEx?
Spätestens bei beliebigen Verschachtelungen bekommst Du Probleme, weil die nicht mit regulären Ausdrücken erkannt werden können.
Verfasst: Donnerstag 1. Februar 2007, 21:19
von EnTeQuAk
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 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
Verfasst: Donnerstag 1. Februar 2007, 21:32
von sape
@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.
BlackJack hat geschrieben:Es geht da um Überschriften und nicht um Schriftgrössen.
Ja da ist mir ja schon klar

Aber es geht doch um Überschriften die in unterschiedlich größten dargestellt werden.
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
Verfasst: Donnerstag 1. Februar 2007, 21:41
von EnTeQuAk
= headline = wird mit <h1>headline</h2> übersetzt...
== headline 2 == wird mit <h2>headline2</h2> übersetzt..
usw...
MfG EnTeQuAk
Verfasst: Freitag 2. Februar 2007, 13:08
von 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:
Code: Alles auswählen
import re
RE = re.compile('\*\*(.*)\*\*')
txt = '**bold** dadada **bold2 **
da = RE.match(txt)
print da.groups()
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
Verfasst: Freitag 2. Februar 2007, 14:09
von cracki
implementier nen richtigen parser, samt statemachine und allem
Verfasst: Freitag 2. Februar 2007, 14:12
von 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
Verfasst: Freitag 2. Februar 2007, 18:44
von mitsuhiko
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.
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.
Wer sowas sucht:
http://trac.pocoo.org/browser/pocoo/tru ... /bbcode.py
Verfasst: Freitag 2. Februar 2007, 20:30
von cracki
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?
Verfasst: Freitag 2. Februar 2007, 21:04
von BlackJack
blackbird hat geschrieben: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.
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.
Das "Nein" verstehe ich jetzt nicht? Wo widersprichst Du mir denn? Oder wo gibt's Probleme mit einem rekursiv absteigenden Parser?
Verfasst: Freitag 2. Februar 2007, 21:17
von jens
Ich stecke zwar da nicht so tief in der Materie, aber mal eine generelle Frage...
cracki hat geschrieben:tokenisieren, parsen, ausgeben...
Dieser Aufbau wird doch immer wieder gemacht. Könnte man nicht eine Variante bauen, die allgemein Gültig ist?
Ich meine, das man nicht direkt die Regeln "wenn input = xy dann output =xy" festlegt, sondern das nochmals in einer weiteren Ebene.
Also das man einen Parser hat, bei den man die Syntax quasi per config definiert. So könnte man den Parser für verschiedene Markups gleichzeitig nutzten.
Im Grunde so wie pygments mit seinen verschiedenen Lexer.
Verfasst: Freitag 2. Februar 2007, 22:12
von Leonidas
jens hat geschrieben:cracki hat geschrieben:tokenisieren, parsen, ausgeben...
Dieser Aufbau wird doch immer wieder gemacht. Könnte man nicht eine Variante bauen, die allgemein Gültig ist?
Klar, PyParsing und ZestyParser lassen grüßen.
Verfasst: Freitag 2. Februar 2007, 22:36
von sape
jens hat geschrieben:
Also das man einen Parser hat, bei den man die Syntax quasi per config definiert. So könnte man den Parser für verschiedene Markups gleichzeitig nutzten.
Ja kann man. Daran versuche ich mich ja gerade.
Ansonsten, wer es richtig allgemein haben will kann ich nur PyParsing empfehlen. Damit habe ich mich einige Zeit beschäftigt und finde es Ziemlich Klasse gemacht.
Verfasst: Freitag 2. Februar 2007, 22:45
von Leonidas
jens hat geschrieben:Also das man einen Parser hat, bei den man die Syntax quasi per config definiert.
Es gibt ja auch welche die
EBNF als Config akzeptieren. Sieh dir mal als Beispiel dan guten alten yacc an, der versteht BNF.
Verfasst: Samstag 3. Februar 2007, 02:37
von sape
EnTeQuAk hat geschrieben:
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?
Einfach im Lexer den Text spliten:
Code: Alles auswählen
src = """{{{LITERAL_ALL_CHARS
}}}
**//test//**
"""
regexp = re.compile(r'({{{|}}}|\*\*|//|__|)')
output = [x for x in regexp.split(src) if x != '']
print output
Code: Alles auswählen
['{{{', 'LITERAL_ALL_CHARS\n', '}}}', '\n', '**', '//', 'test', '//', '**', '\n']
Die einzelnen Tokens muss dann der Lexer mit den richtigen Typ versehen.
BTW: Wichtig ist das der ausdruck im re-teil in runden klammern eingeschlossen ist!!
r'({{{|}}}|\*\*|//|__|)' = OK
r'{{{|}}}|\*\*|//|__|' = Nicht OK weil dann sowas bei rauskommt:
lg