tech talk: pyparsing

Download Tech Talk: Pyparsing

Post on 03-Jul-2015

1.268 views

Category:

Technology

2 download

Embed Size (px)

TRANSCRIPT

  • 1. Tech Talk: Pyparsing Tobias Schlauch, DLR Simulations- und Softwaretechnik11. Mrz 2008 Folie

2. 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 = "Schtte"
  • Lsungvariante
    • Regulre Ausdrcke
    • Schn aber was macht das hier eigentlich???
    • "[-+]?(d+(.d*)?|.d+)([eE][-+]?d+)?"
  • Alternativen?

3. Pyparsing im berblick

  • Was ist Pyparsing?
    • Klassenbibliothek zur Erstellung von Parsern (recursive descent)
    • Design auf einfache Erstellung und Aktualisierung ausgelegt
    • Parser fr regulren Sprachen und Teilmenge kontextfreier Sprachen (vgl. Chomsky-Hierarchie)
  • Pure-Python, Python >= 2.3.2
  • MIT-Lizenz
  • Gute Dokumentation
    • Epydoc, Klassendiagramm, Beispiele, Wiki

4. 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 5. Grundlegende Vorgehensweise mit Pyparsing

  • Definition der Grammatik (Token / Verknpfungen)
    • Hierarchische Definition
    • Optionale Definition von Ergebnisnamen und Parseraktionen
  • Aufruf vonparseStringoderscanString
    • Standardmig werden Whitespaces ignoriert
    • Anwendung definierter Parseraktionen
  • Verarbeitung des Ergebnisses als Liste oder unter Verwendung der definierter Namen

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

7. Pyparsing Grundlagen Definition fester Token

  • Literal / CaselessLiteral
    • ifToken = Literal("if")
    • Findet das Token inif(x=1) undinifAndOnlyYouAndMe
  • Keyword / CaselessKeyword
    • ifToken = Keyword("if")
    • Findet das Token inif(x=1) ,aber nichtinifAndOnlyYouAndMe
  • Caseless-Varianten geben als Ergebnis immer die definierte Variante zurck, also hierif

8. Pyparsing Grundlagen Definition variabler Token

  • Word Definition durch erlaubte Zeichen
    • name = Word("Tabios")
    • name = Word("T", "abios")
  • CharsNotIn Definition durchnichterlaubter Zeichen
    • name = CharsNotIn(",;:-!")
  • Zustzlich Spezifikation der Lnge mglich (min, max, exakt)
  • Regex
    • Erwartet als Parameter einen regulren Ausdruck, wie fr das Standardmodulre
    • Vorher nach Pyparsing-Lsung suchen!!!

9. Pyparsing Grundlagen Verknpfungen

  • And (+) Definition erforderlicher Ausdrcke in fester Reihenfolge
    • sentence = And([subject, verb, object])
    • sentence = subject + verb + object
  • Each (&) Definition erforderlicher Ausdrcke in beliebiger Reihenfolge
    • identity = persNumber & name
  • Or (^) Definition optionaler Ausdrcke (Prioritt: Zeichenkettenlnge)
    • operator = Literal(" =")
    • delimitedList Parsen von Listen
    • list = delimitedList(Word(alphas), ",")
    • nestedExpr Parsen von verschalteten Ausdrcken
    • nested = nestedExpr("(", ")", Word(alphas))
    • print nested.parseString("(abc(def(gh)))").asList()
    • [["abc", ["def", ["gh"]]]]
    • operatorPrecedence Parsen von Operatorrangfolgen (spter mehr)

    16. Pyparsing Grundlagen Verarbeitung von Ergebnissen

    • Geparste Token werden in einer hierarchischen Struktur zurckgegeben (ParsingResults)
    • Verarbeitung der Token als Listen, XML, Dictionary oder ber die Objekteigenschaften mglich
      • Verarbeitung als Dictionary oder ber Objekteigenschaften setzt Benennung der Ergebnisse bei der Definition voraus
      • berschaubarer Grammatiken -> Benennung nicht unbedingt erforderlich
      • Komplexer Grammatiken -> Benennung empfohlen

    17. Pyparsing Grundlagen Verarbeitung von Ergebnissen - Beispiel

    • Definition der Token / Muster
    • date = day.setResultsName("day") + "." + month.setResultsName("month") + "." + year.setResultsName("year")
    • token = date.parseString("11.03.2008")
    • Ausgaben
    • print token.asList() ["11", ".", "03", ".", "2008"]
    • print token.asXML()
    • "11"."
    • print token.asDict() { " day " :" 11 " ," month " :" 03 " ," year " :" 2008 " }
    • print token.day "11"

    18. Pyparsing Grundlagen

    • Pyparsing enthlt noch etliche Details, die aber den Rahmen dieses Vortrags sprengen, z.B.:
      • Ergebnisgruppierungen Group, Dict
      • Weitere Hilfsfunktionen
        • Verarbeitung XML, HTML
        • Positionsabhngige Hilfsfunktionen
      • Tokenkonstanten (z.B. fr Kommentare)

    19. 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 psyco395.8 428.7 packrat 146.5 160.6 base Python V2.5 (lines parsed /second)Python V2.4.1 (lines parsed /second) Verliog-Parser 20. Suchrestriktionen im DataFinder Definition der Grammatik (stark vereinfacht)

    • literal = QuotedString( "'" )
    • propertyName = Word(alphas)
    • comparisionTerm = propertyName + oneOf( " < > = " ) +
    • literal
    • searchRestriction = operatorPrecedence(comparisionTerm,[( " not " , 1, opAssoc.RIGHT),
      • ( " and " , 2, opAssoc.LEFT),
      • ( " or " ,2, opAssoc.LEFT)])
    • Beispiel
    • myRestr =" a >' test 'and not(b " ," test " ," and " , [ " not " ," b " ," < " ," 3 " ]]]

    21. Suchrestriktionen im DataFinder Anwendung

    • Zentrale Grammatikdefinition wird genutzt fr
      • Transformation der geparsten Token auf Syntax der Bibliothek, welche intern zur Suchabfrage genutzt wird
      • Syntax-Highlighting

    22. 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
    • Weiterfhrendes 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