2. Motivation
DataFinder
Software zum Management wissenschaftlich-technischer Daten
Implementierung in Python und Qt
Problem
Vereinfachung des DataFinder-API zur Suche in Metadaten erforderlich
Anstatt Syntax mit Hilfe definierter Klassen abzubilden, soll einfache
Verwendung von Zeichenketten ausreichen, wie z.B.
projectName = quot;X-38quot; and author = quot;Schüttequot;
Lösungvariante
Reguläre Ausdrücke
Schön… aber was macht das hier eigentlich???
quot;[-+]?(d+(.d*)?|.d+)([eE][-+]?d+)?quot;
Alternativen…?
Folie 2
3. Pyparsing im Überblick
Was ist Pyparsing?
Klassenbibliothek zur Erstellung von Parsern (recursive descent)
Design auf einfache Erstellung und Aktualisierung ausgelegt
Parser für regulären Sprachen und Teilmenge kontextfreier
Sprachen (vgl. Chomsky-Hierarchie)
Pure-Python, Python >= 2.3.2
MIT-Lizenz
Gute Dokumentation
Epydoc, Klassendiagramm, Beispiele, Wiki
Folie 3
4. Was macht eigentlich ein Parser? (vereinfacht)
Zeichenstrom
|H|e|l|l|o|,|Wo|r|l|d|!|
„Hello,World!“-Parser
Syntaktisch korrekt?
Abgeleitete Token
|Hello|,|World|!|
Folie 4
5. Grundlegende Vorgehensweise mit Pyparsing
1. Definition der Grammatik (Token / Verknüpfungen)
Hierarchische Definition
Optionale Definition von Ergebnisnamen und Parseraktionen
2. Aufruf von parseString oder scanString
Standardmäßig werden Whitespaces ignoriert
Anwendung definierter Parseraktionen
3. Verarbeitung des Ergebnisses als Liste oder unter Verwendung der
definierter Namen
Folie 5
7. Pyparsing Grundlagen
Definition fester Token
Literal / CaselessLiteral
ifToken = Literal(quot;ifquot;)
Findet das Token in if(x=1) und in ifAndOnlyYouAndMe
Keyword / CaselessKeyword
ifToken = Keyword(quot;ifquot;)
Findet das Token in if(x=1), aber nicht in
ifAndOnlyYouAndMe
Caseless-Varianten geben als Ergebnis immer die definierte Variante
zurück, also hier if
Folie 7
8. Pyparsing Grundlagen
Definition variabler Token
Word – Definition durch erlaubte Zeichen
name = Word(quot;Tabiosquot;)
name = Word(quot;Tquot;, quot;abiosquot;)
CharsNotIn – Definition durch nicht erlaubter Zeichen
name = CharsNotIn(quot;,;:-!quot;)
Zusätzlich Spezifikation der Länge möglich (min, max, exakt)
Regex
Erwartet als Parameter einen regulären Ausdruck, wie für das
Standardmodul re
Vorher nach Pyparsing-Lösung suchen!!!
Folie 8
10. Pyparsing Grundlagen
Optionale Ausdrücke, Wiederholungen
Optional
Definition optionaler Ausdrücke
dateTime = day + quot;.quot; + month + quot;.quot; + year +
Optional(time)
ZeroOrMore
Ähnlich zu Optional, aber erlaubt Wiederholungen
logMsg = dateTime + ZeroOrMore(Word(alphas))
OneOrMore
Ähnlich zu ZeroOrMore, aber erfordert mindestens einen Treffer
logMsg = dateTime + OneOrMore(Word(alphas))
Folie 10
11. Pyparsing Grundlagen
Konvertierungen
Upcase - Konvertierung in Großbuchstaben
Suppress - Unterdrückung von Token
date = day + Suppress(quot;.quot;) + month +
Suppress(quot;.quot;) + year
print date.parseString(quot;11.03.2008quot;).asList()
[quot;11quot;, quot;03quot;, quot;2008quot;]
Combine – Verbindet einzelne Token zu einer Zeichenkette
date = Combine(day + quot;.quot; + month + quot;.quot; + year)
print date.parseString(quot;11.03.2008quot;).asList()
[quot;11.03.2008quot;] anstatt
[quot;11quot;, quot;.quot;, quot;03quot;, quot;.quot;, quot;2008quot;] (ohne Combine)
Folie 11
12. Pyparsing Grundlagen
Rekursive Grammatiken
Forward – Platzhalter zur Definition rekursiver Grammatiken
Beispiel Parsen einer Liste
list = Forward()
listItem = Word(alphas)
list << (listItem + Suppress(Literal(quot;,quot;)) + list |
listItem)
print list.parseString(quot;Wert , Name, testquot;).asList()
[quot;Wertquot;, quot;Namequot;, quot;testquot;]
Klammerung beachten! (Operator | bindet stärker als <<)
Überprüfung auf Endlosrekursion durch Aufruf von validate()
Folie 12
13. Pyparsing Grundlagen
Parseraktionen
Erlaubt Änderung der erkannten Token während des Parsevorgangs
Hinzufügen / Entfernen von Informationen
Konvertierungen
…
3 Schnittstellen
f(t); t – Liste erkannter Token
f(l, t); l – Position im zu parsenden String
f(s, l, t); s – Zu parsender String
Hilfsfunktionen
replaceWith(replaceString)
removeQuotes()
…
Folie 13
14. Pyparsing Grundlagen
Parseraktionen - Beispiel
Definition einer Aktion zur Konvertierung
def convertNumValue(t):
numValue = t.asList()[0]
try:
return int(numValue)
except ValueError:
return float(numValue)
Anhängen der Aktion
numValue.setParseAction(convertNumValue) oder
numValue.addParseAction(convertNumValue)
Ergebnis
print numValue.parseString(quot;12340quot;).asList()
[12340] anstatt [quot;12340quot;]
Folie 14
16. Pyparsing Grundlagen
Verarbeitung von Ergebnissen
Geparste Token werden in einer hierarchischen Struktur zurückgegeben
(ParsingResults)
Verarbeitung der Token als Listen, XML, Dictionary oder über die
Objekteigenschaften möglich
Verarbeitung als Dictionary oder über Objekteigenschaften setzt
Benennung der Ergebnisse bei der Definition voraus
Überschaubarer Grammatiken -> Benennung nicht unbedingt
erforderlich
Komplexer Grammatiken -> Benennung empfohlen
Folie 16
18. Pyparsing Grundlagen
…
Pyparsing enthält noch etliche Details, die aber den Rahmen dieses
Vortrags sprengen, z.B.:
Ergebnisgruppierungen Group, Dict
Weitere Hilfsfunktionen
Verarbeitung XML, HTML
Positionsabhängige Hilfsfunktionen
Tokenkonstanten (z.B. für Kommentare)
Folie 18
21. Suchrestriktionen im DataFinder
Anwendung
Zentrale Grammatikdefinition wird genutzt für
Transformation der geparsten Token auf Syntax der Bibliothek,
welche intern zur Suchabfrage genutzt wird
Syntax-Highlighting
Folie 21