SlideShare uma empresa Scribd logo
1 de 22
Baixar para ler offline
Pyparsing

Tobias Schlauch, DLR Simulations- und Softwaretechnik
Python User Group Köln 14. Mai 2008




                                                   Folie 1
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
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
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
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
Erstes Beispiel
Hello World!

  Definition der Token / Muster
  greeting = oneOf(quot;Hello Hiquot;) + Literal(quot;,quot;) +
                  Word(alphas) + Literal(quot;!quot;)


  Aufruf von parseString()
  print greeting.parseString(quot;Hello, World!quot;).asList()
  ['Hello', ',', 'World', '!']


  print greeting.parseString(„Hi, SISTECquot;)
  pyparsing.ParseException: Expected quot;!quot; (at char 13),
  (line:1, col:14)
  Ups „!“ vergessen



                                                     Folie 6
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
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
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 alternativer Ausdrücke (Priorität: Zeichenkettenlänge)
        operator = Literal(quot;<quot;) ^ Literal(quot;<=quot;)

  MatchFirst (|) – Definition alternativer Ausdrücke (Priorität: Definitions-
  reihenfolge)
       operator = Literal(quot;<=quot;) | Literal(quot;<quot;)


                                                                                Folie 9
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
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
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
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
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
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;abcquot;, [quot;defquot;, [quot;ghquot;]]]]


  operatorPrecedence – Parsen von Operatorrangfolgen (später mehr)

                                                                     Folie 15
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
Pyparsing Grundlagen
Verarbeitung von Ergebnissen - Beispiel
  Definition der Token / Muster
  date = day.setResultsName(quot;dayquot;) + quot;.quot; +
            month.setResultsName(quot;monthquot;) + quot;.quot; +
            year.setResultsName(quot;yearquot;)
  token = date.parseString(quot;11.03.2008quot;)
  Ausgaben
  print token.asList()
  [quot;11quot;, quot;.quot;, quot;03quot;, quot;.quot;, quot;2008quot;]
  print token.asXML()
  quot;<ITEM><day>11</day><ITEM>quot;.quot;</ITEM><month…quot;
  print token.asDict()
  {quot;dayquot;: quot;11quot;, quot;monthquot;: quot;03quot;, quot;yearquot;: quot;2008quot;}
  print token.day
  quot;11quot;


                                                    Folie 17
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
Performance-Tuning


  Aktivierung von Packrat-Parsing (enablePackrat)
  Verwendung von Psyco (http://psyco.sourceforge.net/)


     Verliog-Parser            Python V2.4.1   Python V2.5
                               (lines parsed   (lines parsed
                               /second)        /second)
     base                      160.6           146.5
     packrat                   428.7           395.8
     psyco                     365.7           - n/a -
     packrat + psyco           614.4           - n/a -



   Quelle: http://pyparsing.wikispaces.com/News

                                                               Folie 19
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;notquot;, 1, opAssoc.RIGHT),
                      (quot;andquot;, 2, opAssoc.LEFT),
                      (quot;orquot;, 2, opAssoc.LEFT)])
   Beispiel
   myRestr = quot;a > 'test' and not(b < '3')quot;
   print searchRestriction.parseString(myRestr).asList()
   [[quot;aquot;, quot; >quot;, quot;testquot;, quot;andquot;, [quot;notquot;, quot;bquot;, quot;<quot;, quot;3quot;]]]


                                                      Folie 20
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
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

                                                                     Folie 22

Mais conteúdo relacionado

Mais procurados

Mozilla Audio Data API
Mozilla Audio Data API Mozilla Audio Data API
Mozilla Audio Data API Mayflower GmbH
 
Jpgraph - eine Einführung
Jpgraph - eine EinführungJpgraph - eine Einführung
Jpgraph - eine Einführungfrankstaude
 
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003Brigitte Jellinek
 
Interprozesskommunikation mit PHP
Interprozesskommunikation mit PHPInterprozesskommunikation mit PHP
Interprozesskommunikation mit PHPStephan Schmidt
 
SysDB – System DataBase — Ein Datenaggregator für System-Informationen
SysDB – System DataBase — Ein Datenaggregator für System-InformationenSysDB – System DataBase — Ein Datenaggregator für System-Informationen
SysDB – System DataBase — Ein Datenaggregator für System-InformationenSysDB Project
 
Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)Michael Romer
 
Programmieren mit PROLOG
Programmieren mit PROLOGProgrammieren mit PROLOG
Programmieren mit PROLOGQAware GmbH
 
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyLeichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyThorsten Kamann
 
Funktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureFunktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureDr. Christian Betz
 
realtime audio on ze web @ hhjs
realtime audio on ze web @ hhjsrealtime audio on ze web @ hhjs
realtime audio on ze web @ hhjsjan_mindmatters
 
Webcon 2012 Mobile Development mit Sencha Touch
Webcon 2012  Mobile Development mit Sencha TouchWebcon 2012  Mobile Development mit Sencha Touch
Webcon 2012 Mobile Development mit Sencha TouchThorsten Suckow-Homberg
 

Mais procurados (12)

Mozilla Audio Data API
Mozilla Audio Data API Mozilla Audio Data API
Mozilla Audio Data API
 
Jpgraph - eine Einführung
Jpgraph - eine EinführungJpgraph - eine Einführung
Jpgraph - eine Einführung
 
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
 
Interprozesskommunikation mit PHP
Interprozesskommunikation mit PHPInterprozesskommunikation mit PHP
Interprozesskommunikation mit PHP
 
SysDB – System DataBase — Ein Datenaggregator für System-Informationen
SysDB – System DataBase — Ein Datenaggregator für System-InformationenSysDB – System DataBase — Ein Datenaggregator für System-Informationen
SysDB – System DataBase — Ein Datenaggregator für System-Informationen
 
PHP_Codesniffer
PHP_CodesnifferPHP_Codesniffer
PHP_Codesniffer
 
Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)Doctrine 2 - An Introduction (German)
Doctrine 2 - An Introduction (German)
 
Programmieren mit PROLOG
Programmieren mit PROLOGProgrammieren mit PROLOG
Programmieren mit PROLOG
 
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyLeichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
 
Funktionales Programmieren mit Clojure
Funktionales Programmieren mit ClojureFunktionales Programmieren mit Clojure
Funktionales Programmieren mit Clojure
 
realtime audio on ze web @ hhjs
realtime audio on ze web @ hhjsrealtime audio on ze web @ hhjs
realtime audio on ze web @ hhjs
 
Webcon 2012 Mobile Development mit Sencha Touch
Webcon 2012  Mobile Development mit Sencha TouchWebcon 2012  Mobile Development mit Sencha Touch
Webcon 2012 Mobile Development mit Sencha Touch
 

Semelhante a Pyparsing

Reguläre Ausdrucke (PCRE)
Reguläre Ausdrucke (PCRE)Reguläre Ausdrucke (PCRE)
Reguläre Ausdrucke (PCRE)Dominik Siebel
 
Mehr Dynamik Durch Skriptsprachen
Mehr Dynamik Durch SkriptsprachenMehr Dynamik Durch Skriptsprachen
Mehr Dynamik Durch Skriptsprachenjlink
 
Parallele Softwareentwicklung mit .NET 4.0
Parallele Softwareentwicklung mit .NET 4.0Parallele Softwareentwicklung mit .NET 4.0
Parallele Softwareentwicklung mit .NET 4.0Qiong Wu
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeFrank Müller
 
Perl 6 Regex und Grammars
Perl 6 Regex und GrammarsPerl 6 Regex und Grammars
Perl 6 Regex und Grammarslichtkind
 
Dynamische Websites mit XML
Dynamische Websites mit XMLDynamische Websites mit XML
Dynamische Websites mit XMLStephan Schmidt
 
Einführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungEinführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungDigicomp Academy AG
 
TYPO3 coding guidelines
TYPO3 coding guidelinesTYPO3 coding guidelines
TYPO3 coding guidelinesAlex Kellner
 
Java Streams und Lambdas
Java Streams und LambdasJava Streams und Lambdas
Java Streams und LambdasNane Kratzke
 
Praesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbasePraesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbaseStefan Frömken
 
Tech Talk: Groovy
Tech Talk: GroovyTech Talk: Groovy
Tech Talk: Groovymwie
 
Python crash-kurs
Python crash-kursPython crash-kurs
Python crash-kursklausbremer
 
Architektur und Code im Einklang [DeveloperCamp 2017]
Architektur und Code im Einklang [DeveloperCamp 2017]Architektur und Code im Einklang [DeveloperCamp 2017]
Architektur und Code im Einklang [DeveloperCamp 2017]Markus Harrer
 
Vorlesung 7: Laufzeit, Maps
Vorlesung 7: Laufzeit, MapsVorlesung 7: Laufzeit, Maps
Vorlesung 7: Laufzeit, MapsMichael Zilske
 
OSMC 2010 | Logverarbeitung mit syslog-ng - Status und Zukunft by Martin Grauel
OSMC 2010 | Logverarbeitung mit syslog-ng - Status und Zukunft by Martin GrauelOSMC 2010 | Logverarbeitung mit syslog-ng - Status und Zukunft by Martin Grauel
OSMC 2010 | Logverarbeitung mit syslog-ng - Status und Zukunft by Martin GrauelNETWAYS
 
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScriptManfred Steyer
 

Semelhante a Pyparsing (20)

Reguläre Ausdrucke (PCRE)
Reguläre Ausdrucke (PCRE)Reguläre Ausdrucke (PCRE)
Reguläre Ausdrucke (PCRE)
 
Mehr Dynamik Durch Skriptsprachen
Mehr Dynamik Durch SkriptsprachenMehr Dynamik Durch Skriptsprachen
Mehr Dynamik Durch Skriptsprachen
 
Parallele Softwareentwicklung mit .NET 4.0
Parallele Softwareentwicklung mit .NET 4.0Parallele Softwareentwicklung mit .NET 4.0
Parallele Softwareentwicklung mit .NET 4.0
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
 
Perl 6 Regex und Grammars
Perl 6 Regex und GrammarsPerl 6 Regex und Grammars
Perl 6 Regex und Grammars
 
Explain explain
Explain explainExplain explain
Explain explain
 
Dynamische Websites mit XML
Dynamische Websites mit XMLDynamische Websites mit XML
Dynamische Websites mit XML
 
Einführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungEinführung in die funktionale Programmierung
Einführung in die funktionale Programmierung
 
TYPO3 coding guidelines
TYPO3 coding guidelinesTYPO3 coding guidelines
TYPO3 coding guidelines
 
Oracle TEXT
Oracle TEXTOracle TEXT
Oracle TEXT
 
Java Streams und Lambdas
Java Streams und LambdasJava Streams und Lambdas
Java Streams und Lambdas
 
Praesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbasePraesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit Extbase
 
Scala Workshop
Scala WorkshopScala Workshop
Scala Workshop
 
Tech Talk: Groovy
Tech Talk: GroovyTech Talk: Groovy
Tech Talk: Groovy
 
Python crash-kurs
Python crash-kursPython crash-kurs
Python crash-kurs
 
Php Schulung
Php SchulungPhp Schulung
Php Schulung
 
Architektur und Code im Einklang [DeveloperCamp 2017]
Architektur und Code im Einklang [DeveloperCamp 2017]Architektur und Code im Einklang [DeveloperCamp 2017]
Architektur und Code im Einklang [DeveloperCamp 2017]
 
Vorlesung 7: Laufzeit, Maps
Vorlesung 7: Laufzeit, MapsVorlesung 7: Laufzeit, Maps
Vorlesung 7: Laufzeit, Maps
 
OSMC 2010 | Logverarbeitung mit syslog-ng - Status und Zukunft by Martin Grauel
OSMC 2010 | Logverarbeitung mit syslog-ng - Status und Zukunft by Martin GrauelOSMC 2010 | Logverarbeitung mit syslog-ng - Status und Zukunft by Martin Grauel
OSMC 2010 | Logverarbeitung mit syslog-ng - Status und Zukunft by Martin Grauel
 
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
 

Mais de Andreas Schreiber

Provenance-based Security Audits and its Application to COVID-19 Contact Trac...
Provenance-based Security Audits and its Application to COVID-19 Contact Trac...Provenance-based Security Audits and its Application to COVID-19 Contact Trac...
Provenance-based Security Audits and its Application to COVID-19 Contact Trac...Andreas Schreiber
 
Visualization of Software Architectures in Virtual Reality and Augmented Reality
Visualization of Software Architectures in Virtual Reality and Augmented RealityVisualization of Software Architectures in Virtual Reality and Augmented Reality
Visualization of Software Architectures in Virtual Reality and Augmented RealityAndreas Schreiber
 
Provenance as a building block for an open science infrastructure
Provenance as a building block for an open science infrastructureProvenance as a building block for an open science infrastructure
Provenance as a building block for an open science infrastructureAndreas Schreiber
 
Raising Awareness about Open Source Licensing at the German Aerospace Center
Raising Awareness about Open Source Licensing at the German Aerospace CenterRaising Awareness about Open Source Licensing at the German Aerospace Center
Raising Awareness about Open Source Licensing at the German Aerospace CenterAndreas Schreiber
 
Open Source Licensing for Rocket Scientists
Open Source Licensing for Rocket ScientistsOpen Source Licensing for Rocket Scientists
Open Source Licensing for Rocket ScientistsAndreas Schreiber
 
Interactive Visualization of Software Components with Virtual Reality Headsets
Interactive Visualization of Software Components with Virtual Reality HeadsetsInteractive Visualization of Software Components with Virtual Reality Headsets
Interactive Visualization of Software Components with Virtual Reality HeadsetsAndreas Schreiber
 
Provenance for Reproducible Data Science
Provenance for Reproducible Data ScienceProvenance for Reproducible Data Science
Provenance for Reproducible Data ScienceAndreas Schreiber
 
Visualizing Provenance using Comics
Visualizing Provenance using ComicsVisualizing Provenance using Comics
Visualizing Provenance using ComicsAndreas Schreiber
 
Nachvollziehbarkeit mit Hinblick auf Privacy-Verletzungen
Nachvollziehbarkeit mit Hinblick auf Privacy-VerletzungenNachvollziehbarkeit mit Hinblick auf Privacy-Verletzungen
Nachvollziehbarkeit mit Hinblick auf Privacy-VerletzungenAndreas Schreiber
 
Reproducible Science with Python
Reproducible Science with PythonReproducible Science with Python
Reproducible Science with PythonAndreas Schreiber
 
A Provenance Model for Quantified Self Data
A Provenance Model for Quantified Self DataA Provenance Model for Quantified Self Data
A Provenance Model for Quantified Self DataAndreas Schreiber
 
Tracking after Stroke: Doctors, Dogs and All The Rest
Tracking after Stroke: Doctors, Dogs and All The RestTracking after Stroke: Doctors, Dogs and All The Rest
Tracking after Stroke: Doctors, Dogs and All The RestAndreas Schreiber
 
High Throughput Processing of Space Debris Data
High Throughput Processing of Space Debris DataHigh Throughput Processing of Space Debris Data
High Throughput Processing of Space Debris DataAndreas Schreiber
 
Bericht von der QS15 Conference & Exposition
Bericht von der QS15 Conference & ExpositionBericht von der QS15 Conference & Exposition
Bericht von der QS15 Conference & ExpositionAndreas Schreiber
 
Telemedizin: Gesundheit, messbar für jedermann
Telemedizin: Gesundheit, messbar für jedermannTelemedizin: Gesundheit, messbar für jedermann
Telemedizin: Gesundheit, messbar für jedermannAndreas Schreiber
 
Quantified Self mit Wearable Devices und Smartphone-Sensoren
Quantified Self mit Wearable Devices und Smartphone-SensorenQuantified Self mit Wearable Devices und Smartphone-Sensoren
Quantified Self mit Wearable Devices und Smartphone-SensorenAndreas Schreiber
 

Mais de Andreas Schreiber (20)

Provenance-based Security Audits and its Application to COVID-19 Contact Trac...
Provenance-based Security Audits and its Application to COVID-19 Contact Trac...Provenance-based Security Audits and its Application to COVID-19 Contact Trac...
Provenance-based Security Audits and its Application to COVID-19 Contact Trac...
 
Visualization of Software Architectures in Virtual Reality and Augmented Reality
Visualization of Software Architectures in Virtual Reality and Augmented RealityVisualization of Software Architectures in Virtual Reality and Augmented Reality
Visualization of Software Architectures in Virtual Reality and Augmented Reality
 
Provenance as a building block for an open science infrastructure
Provenance as a building block for an open science infrastructureProvenance as a building block for an open science infrastructure
Provenance as a building block for an open science infrastructure
 
Raising Awareness about Open Source Licensing at the German Aerospace Center
Raising Awareness about Open Source Licensing at the German Aerospace CenterRaising Awareness about Open Source Licensing at the German Aerospace Center
Raising Awareness about Open Source Licensing at the German Aerospace Center
 
Open Source Licensing for Rocket Scientists
Open Source Licensing for Rocket ScientistsOpen Source Licensing for Rocket Scientists
Open Source Licensing for Rocket Scientists
 
Interactive Visualization of Software Components with Virtual Reality Headsets
Interactive Visualization of Software Components with Virtual Reality HeadsetsInteractive Visualization of Software Components with Virtual Reality Headsets
Interactive Visualization of Software Components with Virtual Reality Headsets
 
Provenance for Reproducible Data Science
Provenance for Reproducible Data ScienceProvenance for Reproducible Data Science
Provenance for Reproducible Data Science
 
Visualizing Provenance using Comics
Visualizing Provenance using ComicsVisualizing Provenance using Comics
Visualizing Provenance using Comics
 
Quantified Self Comics
Quantified Self ComicsQuantified Self Comics
Quantified Self Comics
 
Nachvollziehbarkeit mit Hinblick auf Privacy-Verletzungen
Nachvollziehbarkeit mit Hinblick auf Privacy-VerletzungenNachvollziehbarkeit mit Hinblick auf Privacy-Verletzungen
Nachvollziehbarkeit mit Hinblick auf Privacy-Verletzungen
 
Reproducible Science with Python
Reproducible Science with PythonReproducible Science with Python
Reproducible Science with Python
 
Python at Warp Speed
Python at Warp SpeedPython at Warp Speed
Python at Warp Speed
 
A Provenance Model for Quantified Self Data
A Provenance Model for Quantified Self DataA Provenance Model for Quantified Self Data
A Provenance Model for Quantified Self Data
 
Open Source im DLR
Open Source im DLROpen Source im DLR
Open Source im DLR
 
Tracking after Stroke: Doctors, Dogs and All The Rest
Tracking after Stroke: Doctors, Dogs and All The RestTracking after Stroke: Doctors, Dogs and All The Rest
Tracking after Stroke: Doctors, Dogs and All The Rest
 
High Throughput Processing of Space Debris Data
High Throughput Processing of Space Debris DataHigh Throughput Processing of Space Debris Data
High Throughput Processing of Space Debris Data
 
Bericht von der QS15 Conference & Exposition
Bericht von der QS15 Conference & ExpositionBericht von der QS15 Conference & Exposition
Bericht von der QS15 Conference & Exposition
 
Telemedizin: Gesundheit, messbar für jedermann
Telemedizin: Gesundheit, messbar für jedermannTelemedizin: Gesundheit, messbar für jedermann
Telemedizin: Gesundheit, messbar für jedermann
 
Big Python
Big PythonBig Python
Big Python
 
Quantified Self mit Wearable Devices und Smartphone-Sensoren
Quantified Self mit Wearable Devices und Smartphone-SensorenQuantified Self mit Wearable Devices und Smartphone-Sensoren
Quantified Self mit Wearable Devices und Smartphone-Sensoren
 

Pyparsing

  • 1. Pyparsing Tobias Schlauch, DLR Simulations- und Softwaretechnik Python User Group Köln 14. Mai 2008 Folie 1
  • 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
  • 6. Erstes Beispiel Hello World! Definition der Token / Muster greeting = oneOf(quot;Hello Hiquot;) + Literal(quot;,quot;) + Word(alphas) + Literal(quot;!quot;) Aufruf von parseString() print greeting.parseString(quot;Hello, World!quot;).asList() ['Hello', ',', 'World', '!'] print greeting.parseString(„Hi, SISTECquot;) pyparsing.ParseException: Expected quot;!quot; (at char 13), (line:1, col:14) Ups „!“ vergessen Folie 6
  • 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
  • 9. 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 alternativer Ausdrücke (Priorität: Zeichenkettenlänge) operator = Literal(quot;<quot;) ^ Literal(quot;<=quot;) MatchFirst (|) – Definition alternativer Ausdrücke (Priorität: Definitions- reihenfolge) operator = Literal(quot;<=quot;) | Literal(quot;<quot;) Folie 9
  • 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
  • 15. 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;abcquot;, [quot;defquot;, [quot;ghquot;]]]] operatorPrecedence – Parsen von Operatorrangfolgen (später mehr) Folie 15
  • 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
  • 17. Pyparsing Grundlagen Verarbeitung von Ergebnissen - Beispiel Definition der Token / Muster date = day.setResultsName(quot;dayquot;) + quot;.quot; + month.setResultsName(quot;monthquot;) + quot;.quot; + year.setResultsName(quot;yearquot;) token = date.parseString(quot;11.03.2008quot;) Ausgaben print token.asList() [quot;11quot;, quot;.quot;, quot;03quot;, quot;.quot;, quot;2008quot;] print token.asXML() quot;<ITEM><day>11</day><ITEM>quot;.quot;</ITEM><month…quot; print token.asDict() {quot;dayquot;: quot;11quot;, quot;monthquot;: quot;03quot;, quot;yearquot;: quot;2008quot;} print token.day quot;11quot; Folie 17
  • 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
  • 19. Performance-Tuning Aktivierung von Packrat-Parsing (enablePackrat) Verwendung von Psyco (http://psyco.sourceforge.net/) Verliog-Parser Python V2.4.1 Python V2.5 (lines parsed (lines parsed /second) /second) base 160.6 146.5 packrat 428.7 395.8 psyco 365.7 - n/a - packrat + psyco 614.4 - n/a - Quelle: http://pyparsing.wikispaces.com/News Folie 19
  • 20. 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;notquot;, 1, opAssoc.RIGHT), (quot;andquot;, 2, opAssoc.LEFT), (quot;orquot;, 2, opAssoc.LEFT)]) Beispiel myRestr = quot;a > 'test' and not(b < '3')quot; print searchRestriction.parseString(myRestr).asList() [[quot;aquot;, quot; >quot;, quot;testquot;, quot;andquot;, [quot;notquot;, quot;bquot;, quot;<quot;, quot;3quot;]]] Folie 20
  • 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
  • 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 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 Folie 22