Tech Talk: Pyparsing
Upcoming SlideShare
Loading in...5
×
 

Tech Talk: Pyparsing

on

  • 2,094 views

 

Statistics

Views

Total Views
2,094
Views on SlideShare
2,079
Embed Views
15

Actions

Likes
1
Downloads
11
Comments
0

4 Embeds 15

https://wiki.sistec.dlr.de 7
http://www.slideshare.net 5
http://wildfire.gigya.com 2
https://vpdn03.dlr.de 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Tech Talk: Pyparsing Tech Talk: Pyparsing Presentation Transcript

    • Tech Talk: Pyparsing Tobias Schlauch, DLR Simulations- und Softwaretechnik 11. März 2008 Folie
    • Motivation
      • 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 = "X-38" and author = "Schütte"
      • Lösungvariante
        • Reguläre Ausdrücke
        • Schön… aber was macht das hier eigentlich???
        • "[-+]?(d+(.d*)?|.d+)([eE][-+]?d+)?"
      • Alternativen…?
    • 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
    • Was macht eigentlich ein Parser? (vereinfacht) |H|e|l|l|o|,|Wo|r|l|d|!| Syntaktisch korrekt? |Hello|,|World|!| „ Hello,World!“-Parser Zeichenstrom Abgeleitete Token
    • Grundlegende Vorgehensweise mit Pyparsing
      • Definition der Grammatik (Token / Verknüpfungen)
        • Hierarchische Definition
        • Optionale Definition von Ergebnisnamen und Parseraktionen
      • Aufruf von parseString oder scanString
        • Standardmäßig werden Whitespaces ignoriert
        • Anwendung definierter Parseraktionen
      • Verarbeitung des Ergebnisses als Liste oder unter Verwendung der definierter Namen
    • Erstes Beispiel Hello World!
      • Definition der Token / Muster
      • greeting = oneOf("Hello Hi") + Literal(",") + Word(alphas) + Literal("!")
      • Aufruf von parseString()
      • print greeting.parseString("Hello, World!").asList() ['Hello', ',', 'World', '!']
      • print greeting.parseString(„Hi, SISTEC") pyparsing.ParseException: Expected "!" (at char 13), (line:1, col:14)
      • Ups „!“ vergessen
    • Pyparsing Grundlagen Definition fester Token
      • Literal / CaselessLiteral
        • ifToken = Literal("if")
        • Findet das Token in if(x=1) und in ifAndOnlyYouAndMe
      • Keyword / CaselessKeyword
        • ifToken = Keyword("if")
        • 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
    • Pyparsing Grundlagen Definition variabler Token
      • Word – Definition durch erlaubte Zeichen
        • name = Word("Tabios")
        • name = Word("T", "abios")
      • CharsNotIn – Definition durch nicht erlaubter Zeichen
        • name = CharsNotIn(",;:-!")
      • 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!!!
    • Pyparsing Grundlagen Verknüpfungen
      • And (+) – Definition erforderlicher Ausdrücke in fester Reihenfolge
        • sentence = And([subject, verb, object])
        • sentence = subject + verb + object
      • Each (&) – Definition erforderlicher Ausdrücke in beliebiger Reihenfolge
        • identity = persNumber & name
      • Or (^) – Definition optionaler Ausdrücke (Priorität: Zeichenkettenlänge)
        • operator = Literal(&quot;<&quot;) ^ Literal(&quot;<=&quot;)
      • MatchFirst (|) – Definition optionaler Ausdrücke (Priorität: Definitions-reihenfolge)
        • operator = Literal(&quot;<=&quot;) | Literal(&quot;<&quot;)
    • 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))
    • 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.2008&quot;).asList()
        • [&quot;11&quot;, &quot;03&quot;, &quot;2008&quot;]
      • Combine – Verbindet einzelne Token zu einer Zeichenkette
        • date = Combine(day + &quot;.&quot; + month + &quot;.&quot; + year)
        • print date.parseString(&quot;11.03.2008&quot;).asList()
        • [&quot;11.03.2008&quot;] anstatt
        • [&quot;11&quot;, &quot;.&quot;, &quot;03&quot;, &quot;.&quot;, &quot;2008&quot;] (ohne Combine)
    • 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, test&quot;).asList()
      • [&quot;Wert&quot;, &quot;Name&quot;, &quot;test&quot;]
        • Klammerung beachten! (Operator | bindet stärker als <<)
      • Überprüfung auf Endlosrekursion durch Aufruf von validate()
    • 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()
    • 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;12340&quot;).asList()
        • [12340] anstatt [&quot;12340&quot;]
    • Pyparsing Grundlagen Hilfsfunktionen (kleine Auswahl)
      • oneOf – Vereinfachte Definition von Alternativen
      • options = oneOf(&quot;< > <= = >=&quot;)
      • delimitedList – Parsen von Listen
      • list = delimitedList(Word(alphas), &quot;,&quot;)
      • nestedExpr – Parsen von verschalteten Ausdrücken
      • nested = nestedExpr(&quot;(&quot;, &quot;)&quot;, Word(alphas))
      • print nested.parseString(&quot;(abc(def(gh)))&quot;).asList()
      • [[&quot;abc&quot;, [&quot;def&quot;, [&quot;gh&quot;]]]]
      • operatorPrecedence – Parsen von Operatorrangfolgen (später mehr)
    • 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
    • Pyparsing Grundlagen Verarbeitung von Ergebnissen - Beispiel
      • Definition der Token / Muster
      • date = day.setResultsName(&quot;day&quot;) + &quot;.&quot; + month.setResultsName(&quot;month&quot;) + &quot;.&quot; + year.setResultsName(&quot;year&quot;)
      • token = date.parseString(&quot;11.03.2008&quot;)
      • Ausgaben
      • print token.asList() [&quot;11&quot;, &quot;.&quot;, &quot;03&quot;, &quot;.&quot;, &quot;2008&quot;]
      • print token.asXML()
      • &quot;<ITEM><day>11</day><ITEM>&quot;.&quot;</ITEM><month…&quot;
      • print token.asDict() { &quot; day &quot; : &quot; 11 &quot; , &quot; month &quot; : &quot; 03 &quot; , &quot; year &quot; : &quot; 2008 &quot; }
      • print token.day &quot;11&quot;
    • 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)
    • Performance-Tuning
      • Aktivierung von Packrat-Parsing ( enablePackrat )
      • Verwendung von Psyco ( http://psyco.sourceforge.net / )
      • Quelle: http://pyparsing.wikispaces.com/News
      - n/a - 614.4 packrat + psyco - n/a - 365.7 psyco 395.8 428.7 packrat 146.5 160.6 base Python V2.5 (lines parsed /second) Python V2.4.1 (lines parsed /second) Verliog-Parser
    • Suchrestriktionen im DataFinder Definition der Grammatik (stark vereinfacht)
      • literal = QuotedString( &quot;'&quot; )
      • propertyName = Word(alphas)
      • comparisionTerm = propertyName + oneOf( &quot; < > <= => = &quot; ) +
      • literal
      • searchRestriction = operatorPrecedence(comparisionTerm, [( &quot; not &quot; , 1, opAssoc.RIGHT),
        • ( &quot; and &quot; , 2, opAssoc.LEFT),
        • ( &quot; or &quot; , 2, opAssoc.LEFT)])
      • Beispiel
      • myRestr = &quot; a > ' test ' and not(b < ' 3 ' ) &quot;
      • print searchRestriction.parseString(myRestr).asList()
      • [[ &quot; a &quot; , &quot; > &quot; , &quot; test &quot; , &quot; and &quot; , [ &quot; not &quot; , &quot; b &quot; , &quot; < &quot; , &quot; 3 &quot; ]]]
    • 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
    • Vielen Dank! Fragen??
      • Pyparsing Links
        • News: http://pyparsing.wikispaces.com/News
        • Beispiele: http://pyparsing.wikispaces.com/Examples
        • Download: http://sourceforge.net/project/showfiles.php?group_id=97203
      • Weiterführendes zum Thema:
        • Compilerbau: http://de.wikipedia.org/wiki/Compilerbau
        • Aho, Sethi, Ullman: Compilerbau, Tl. 1 . Oldenbourg, 1999
        • Recursive Descent Parser: http://en.wikipedia.org/wiki/Recursive_descent_parser
        • Packrat-Parsing: http://pdos.csail.mit.edu/~baford/packrat /
        • Alternative Python-Parsersysteme: http://pythonsource.com/open-source/parser-generators