C++20-Coroutinen-Tutorial Teil 4: Der Stream-Parser
Ein Parser kann die Vorteile von Coroutinen nutzen und die Datenverarbeitung bei Bedarf pausieren. Das verbessert die Effizienz und erhöht die Code-Lesbarkeit.
- Andreas Fertig
Parser brechen Daten in verwertbare Stücke auf, analysieren sie und wandeln sie in eine strukturierte Form um, die die Anwendung weiterverwenden kann. Nachdem sich die ersten drei Teile des Tutorials auf Grundlagen und Einsatzzwecke von C++20-Coroutinen konzentriert haben, erläutert der vierte und letzte Teil, wie sich Parser mit Coroutinen vereinfachen lassen.
Als Beispiel dient ein Byte-Stream-Parser nach Andrew Tanenbaum, der ein minimales Protokoll verwendet (siehe Andrew S. Tanenbaum, David J. Wetherall; "Computer Networks", 2011). Das Protokoll besteht aus ESC und einem Start of Frame (SOF): ESC ('H') dient zum Escapen spezieller Bytes (Kommandos) im Datenstrom und SOF (0x10) markiert sowohl den Start als auch das Ende eines Frames.
- Ein Stream-Parser analysiert Nachrichten in einem Datenstrom und kann so die Netzwerkleistung verbessern.
- Mit C++-20-Coroutinen kann der Parser die Datenverarbeitung pausieren und später fortsetzen.
- Weil eine Coroutine eine andere Coroutine aufrufen kann, lassen sich komplexe Parsing-Operationen in kleinere, handhabbare Funktionen unterteilen.
Die Bytefolge ESC, SOF kennzeichnet also den Beginn eines Frames, dessen Ende durch die gleiche Sequenz erkennbar ist. Die hier gezeigte Version ist leicht vereinfacht, oft gibt es unterschiedliche Werte fĂĽr den Start und das Ende eines Frames.