Suche Informationen über -- Text - lexer - parser --

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi EnTe, hab irgendwie Lust selber mal zu versuchen so ein Parser + AST-Generator für eure Wiki-Syntax zu machen :D

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
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

sape hat geschrieben:Hi EnTe, hab irgendwie Lust selber mal zu versuchen so ein Parser + AST-Generator für eure Wiki-Syntax zu machen :D
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

Code: Alles auswählen

[code] nicht zu parsender Text
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 ;)
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?
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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 :D
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 :D -- 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 \\ :D 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

Code: Alles auswählen

[b][/b]
wird :D
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:

Code: Alles auswählen

[size=9][/size]
EnTeQuAk hat geschrieben: Nein... das ist der BBCode

Code: Alles auswählen

[code] nicht zu parsender Text
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 ;)
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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.
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:

Code: Alles auswählen

[size=9][/size]
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.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

@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
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

= headline = wird mit <h1>headline</h2> übersetzt...

== headline 2 == wird mit <h2>headline2</h2> übersetzt..

usw...


MfG EnTeQuAk
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

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:

Code: Alles auswählen

('bold** dadadada **bold2',)
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
cracki
User
Beiträge: 72
Registriert: Montag 25. Dezember 2006, 05:01

implementier nen richtigen parser, samt statemachine und allem
...meh...
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Aber dieser muss die Syntax ja auch irgentwie treffen können oder? :D

Möchte ich übrigens auch...

oder ich warte erstma auf 'sape''s Lösung... mal schaun, wie seins ausschaut

MfG EnTeQuAk
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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
TUFKAB – the user formerly known as blackbird
cracki
User
Beiträge: 72
Registriert: Montag 25. Dezember 2006, 05:01

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?
...meh...
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?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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:

Code: Alles auswählen

['LITERAL_ALL_CHARS\n', '\n', 'test', '\n']
lg
Antworten