share

Einstieg in PegJS

20.Oktober 2016

Von kleinen Experimenten oder kleinen Tools, die man sich mal kurz „nebenbei“ schreibt um eine Aufgabe einfacher lösen zu können, weiß ich, dass einen Parser für etwas komplexere Fälle gar nicht so einfach ist. Deshalb habe ich mich für mein neuestes Projekt (Proto Parser) entschieden ein entsprechendes Tool zu nutzen, nämlich PegJS, zwar gibt es noch weitere Alternativen, mir schien dieses Tool jedoch das eingängste zu sein. An dieser Stelle möchte ich euch einen kurzen Einblick geben, wie man einen einfachen Parser mit PegJS erstellen kann:

Allgemein

PegJS nimmt ein in einer eigenen Sprache erstellten Beschreibungs an und compiliert daraus Javascript Code, welcher dann jederzeit wiederverwendet werden kann um gewünschtes Format zu parsen. Diese Sprache weist dabei Ähnlichkeiten zu Regulären Ausdrücken auf, diese zu kennen ist also durchaus von Vorteil und erleichtert den Einstieg ungemein, ist aber nicht zwingend erforderlich.

Um einen solchen Parser zu schreiben bietet es sich an das PegJS Online-Tool zu nutzen, hier werden Fehler in der Beschreibung oder beim Parsen direkt ausgegeben. Solange die Parser nicht zu groß werden ist alles gut, sonst fängt dieser an zu haken, denn bei jeder Änderung des Beschreibungstextes (von jetzt an Deskriptor genannt) führt zu einer neuen Generierung, leider lässt sich dies nicht manuell auslösen.

Nun genug der Einleitung…

Deskriptor Elemente

Ein Deskriptor besteht aus Regeln, jede Regel kann wiederrum Regeln enthalten. Zum erstellen dieser Regeln gibt es folgende Sprachelemente:

Weiterhin zu beachten ist, dass in den Regeln wirklich jedes einzelne Zeichen angegeben werden muss, sonst wird beim Parsen ein Fehler festgestellt.

Es gibt noch ein paar Sprachelemente mehr, diese können der Doku entnommen werden. Ein wirklich nützliches Element sind z.B. die Codeblöcke, hiermit kann die Rückgabe einer Regel noch einmal angepasst werden, dies schafft enorme Vereinfachung und eine wesentlich besser verarbeitbare Ausgabe der Parser. Diese Codeblöcke werden einfach in geschwungenen Klammern an die Regel angehängt („{}“). Zusätzlich existieren noch sog. Bezeichner (Label), diese werden getrennt durch einen Doppelpunkt vor einen bel. Ausdruck geschrieben, über diese Bezeichner kann im Code auf die geparsten Elemente zugegeriffen werden. ( label:[a-z] )

Beispiel

Hier jetzt mal ein einfaches Beispiel:

url = protocol "://" (username "@")? domain "/" path
protocol = "http" "s"?
username = [a-zA-Z0-9]+
domainPart = [a-zA-z] [a-zA-z0-9-]*
domain = domainPart ("." domainPart)*
path = [a-zA-z0-9-_.]+ ("/" [a-zA-z0-9-_.]+)* "/"?

Mit diesem Code lässt sich wunderbar eine einfache HTTP(s) URL parsen, allerdings ist die Ausgabe noch recht kryptisch. Daher verändern wir den Code zu folgendem:

url = proto:protocol "://" u:(username "@")? d:domain path:("/" path)?
{
	var ret = {
    	proto: proto,
        domain: d
    };
    if(u)
    	ret.user = u[0];
    if(path)
    	ret.path = path.join('');
    return ret;
}
protocol = a:"http" b:"s"?
{ return a + (b == null ? "" : b)}
username = a:[a-zA-Z0-9]+
{ return a.join('') }
domainPart = a:[a-zA-z] b:[a-zA-z0-9-]*
{ return a+b.join('') }
domain = a:domainPart b:("." domainPart)*
{ 
	return a+b.map(function(a){
		return a.join('')
  	}).join('') 
}
pathPart = a:[a-zA-z0-9-_.]+
{ return a.join('') }
path = a:pathPart b:("/" pathPart)* c:"/"?
{  
	return a+b.map(function(a){
		return a.join('')
  	}).join('') + (c == null ? "" : c)
}

Hier werden durch besagte Codeblöcke die Rückgaben angepasst, um die Verarbeitbarkeit zu verbessern. Als Empfehlung gilt hier immer alle mehrfachauftretenden Elemente als eigene Regel zu erstellen, hiermit vermeidet man erstens Inkonsistenzen bei komplexeren Parsern, außerdem ist es wesentlich einfacher hiermit im Code zu arbeiten, sonst hat man teils sehr tief verschachtelte Schleifen o.ä. .


Proto Parser

20.Oktober 2016

Proto Dateien sind Beschreibungen für Google’s Protocol Buffer und GRPC. Dieses kleine Javascript-Modul, bietet die Möglichkeit diese zu parsen und weiterzuverarbeiten.

Github: https://github.com/lal12/proto-parse

NPM: https://www.npmjs.com/package/proto-parse


Songbeamer

26.September 2016

Kleines Javascript-Modul, um Songbeamer Dateien zu parsen.

Github: https://github.com/lal12/songbeamer

NPM: https://www.npmjs.com/package/songbeamer


365STEPS

26.September 2016

Vor kurzem habe ich die 365 STEPS App für Windows entwickelt und ist seitdem im Store verfügbar. Diese App gab es bisher nur für IOS und Android.

storelogo.scale-400Die App bietet Impulse für jeden Tag, mal ist es Stoff zum Nachdenken, mal ist es einfach mutmachend und motivierend. In der „Event“-Kategorie erscheinen regelmäßig Informationen zu christlichen Events in ganz Deutschland.

Neben der App gibt es noch ein quartalsweise erscheinendes Magazin, außerdem regelmäßig Inputs über Facebook und Instagram. In Zukunft erscheint auch noch eine passende Website. Das ganze STEPS-Projekt legt neben Qualität der Inputs sehr viel Wert auf visuelle Impulse und ein ansprechendes Design. Ein cooles Projekt, mehr Infos dazu sind unter 365steps.de zu finden.

365 STEPS ist ein Teil von STEPS, einem gemeinsamem Medienprojekt der Christlichen Jugendpflege e.V. (cj-info.de) und Nightlight (www.nightlight.de). Unser großes Ziel damit ist es, dass Jugendliche in Deutschland, der Schweiz und Österreich durch Medien im Glauben wachsen.

STEPS ist ein Magazin. STEPS ist eine Webseite. STEPS sind immer wieder auch Videos und natürlich diese App: 365 STEPS. Wir möchten dir jeden Tag auf unterschiedliche Art und Weise etwas von Gott weitergeben. Wir möchten dir jeden Tag durch kurze Posts etwas Inspirierendes weitergeben. Auf vielfältige und bunte Weise!

overview

Download: go.365steps.de/app

 


Über die Auswahl eines Blog-CMS

10.Februar 2015

Ich habe mir beim Aufsetzen dieses Blogs einige Gedanken gemacht, welches CMS genutzt werden soll. Untersucht habe ich nach folgenden Kritierien, wobei die nur die Punkte beachtet wurden, die ohne großen Aufwand möglich sind: (mehr …)


Netflix mit Windows 10 TP

09.Februar 2015

Netflix Systemanforderungen

Netflix Systemanforderungen

Seit Kurzem teste ich die neue Windows 10 Technical Preview auf meinem Laptop. Als ich versuchte auf Netflix einen Film zu schauen, wurden dort jedoch nur die Systemanforderungen angezeigt, obwohl es mit Windows 8.1 problemlos funktionierte. (mehr …)