~~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}}