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

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

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

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?
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.
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:[...]
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?
[...]
Halte es für übertrieben oder unperformant; Aber ich (Und das sage ich als ein Nichtinformatiker), würde gleich eine saubere Lösung anstreben.

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)]
Dieser Strom wird dann an einen Gramma übergeben der überprüft ob es einer der grammatikalischen Regeln folgt, die du definiert hast. Z.B. muss nach einem ** ein Literal folgen (Alle möglichen Zeichen erlaubt bis auf "Keywords" (Z.B. **, __, etc) und MUSS mit ** enden.

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

lg

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

Das nenne ich flexibel
Hört sich sehr schön an ;)

Ich werde mich dann mal für ne Weile verabschieden.

denn...
Aber ich (Und das sage ich als ein Nichtinformatiker), würde gleich eine saubere Lösung anstreben.
Ich auch :D

Nun ja -- ich werde dann ab und zu mal wieder mit ein paar Fragen ankommen :D


Danke nochmal an alle Linkposter, Tipp&Trickposter etc... ihr habt mir wiedermal geholfen, meinen Horizont erweitert!

MfG EnTeQuAk
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?
Antworten