~~SLIDESHOW~~ ----- Diese Wiki Seite sieht etwas verhagelt aus, da sie in erster Linie im Präsentationsmodus funktionieren muß. Browser im Kiosk Modus: * Safari: keine Ahnung * Firefox recht gut per Plugin: https://addons.mozilla.org/de/firefox/addon/1568 * Opera von Haus aus = Parser mit Ragel komplizierte Grammatiken und rattenschnelles XML Vortrag am 22. September 2010 //If you graph these numbers, patterns emerge.// [[http://www.imdb.com/title/tt0138704/|Max Cohen, PI]] ----- == Warum Parser bauen? trotz [[http://de.wikipedia.org/wiki/Xml|XML]], [[http://de.wikipedia.org/wiki/JSON|JSON]], [[http://de.wikipedia.org/wiki/YAML|YAML]] etc.: * eigene maßgeschneiderte Protokolle, * 3rd Party Libs nicht vorhanden, * nicht gut genug oder * Lizenzprobleme. == Was spricht gegen Ad-Hoc Parsing (a.k.a. Gefrickel)? * der Parser sollte korrekt sein, * Wartbarkeit, * [[http://de.wikipedia.org/wiki/EBNF|BNF Grammatik]] ist meist schon da, * fast immer schlechter als ein humorloser Zustandsautomat. == Quelltext Impression z.B. die [[http://www.w3.org/TR/2008/REC-xml-20081126/#NT-document|XML Spec]] sagt: document ::= prolog element Misc* prolog ::= XMLDecl? Misc* (doctypedecl Misc*)? XMLDecl ::= '' VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"') [[http://www.complang.org/ragel/|Ragel]] will:VersionInfo = S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"'); XMLDecl = ''; prolog = XMLDecl? Misc*; document = prolog elem_query Misc*; und natürlich noch ein paar Zaubersprüche rundrum. == Wie komme ich drauf? * Experiment ob SVG ([[http://www.w3.org/TR/SVG11/paths.html#PathDataBNF|Path Syntax!]]) als Speicherformat für [[:jugm:p2d|piccolo2d.org, eine Java 2D Scenegraph API]] taugt. Dann könnten Designer die Screens direkt mit Illustrator oder Inkscape bauen. [[https://github.com/piccolo2d/piccolo2d.java/blob/svg/svg/src/main/ragel/PathParser.rl|Ergebnis: evtl.]], * iPhone App soll ca. 500K einfaches XML schneller als [[http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html|NSXMLParser]] parsen (14 Sec.). Ergebnis: 0.3 Sec. == Anschnallen: Die Bausteine * die [[http://www.complang.org/ragel/|Grammatik (BNF-artig)]] * "Actions" bzw. Callbacks in die eigene Logik * Treiber Code um das ganze loszutreten * ragel [[http://github.com/mro/MROGeometry/blob/master/Makefile|Kommandozeile per Makefile]] * Zustandsautomat in C compilieren * Zustandsautomat via [[http://de.wikipedia.org/wiki/Graphviz|Graphviz]] visualisieren ---------- * Installation sudo port install ragel == Beispiel: SVG Path Parser * [[http://www.w3.org/TR/SVG11/paths.html#PathDataBNF|Grammatik beim W3C]] * [[https://codeberg.org/mro/MROGeometry/src/branch/master/MROGeometry/PathParser.rl|Ragel Input]] * [[https://codeberg.org/mro/MROGeometry/src/branch/master/MROGeometry/PathParser.m|Ragel Output (Objective C)]] * {{:cocoaheads:pathparser.pdf|Ragel Output (Zustandsautomat PDF)}} ------ http://gist.github.com/579192#file_path_parser.rl == Beispiel: XML Parser * [[http://www.w3.org/TR/REC-xml/#NT-document|Grammatik beim W3C]] * [[https://gist.github.com/mro/591942#file-schema-rnc|RelaxNG Schema]] * [[https://gist.github.com/mro/591942#file-xmlloaderragel-rl|Ragel Input]] * [[https://gist.github.com/mro/591942#file-xmlloaderragel-m|Ragel Output (Objective C)]] * {{:cocoaheads:xmlloaderragel.pdf|Ragel Output (Zustandsautomat PDF)}} == Ausblick: Zustandsautomaten * [[http://zedshaw.com/essays/ragel_state_charts.html|UTU Hub State]] {{ http://zedshaw.com/essays/HubState_small.png }} == Vielen Dank {{ :cocoaheads:cocoaheads-logo.svg?200}} für Eure Aufmerksamkeit. Feedback willkommmen an [[work@mro.name?subject=Cocoaheads Vortrag: Parser mit Ragel|Marcus Rohrmoser]] Die Folien zum Nachlesen gibt's hier: {{ :cocoaheads:ragel.qr.png?200}} http://mro.name/go/cocoaheads_ragel ------ {{tag> Vortrag CocoaHeads Ragel Parser XCode}}