Spirit (Parser)
# Spirit (Parser)

Spirit ist ein mittels Templatemetaprogrammierung implementierter rekursiv absteigender Parsergenerator. Die Benutzung der erweiterten Backus-Naur-Form (EBNF) in C++ wird mithilfe von Ausdrucks-Templates ermöglicht. Die Parser-Objekte werden durch Überladen von Operatoren erstellt und ergeben einen LL-Parser, der in der Lage ist, mehrdeutige Ausdrücke auszuwerten.

Spirit kann zusammen und getrennt für lexikalische Analyse sowie auch für einfaches Parsen benutzt werden.

Der Spirit-Parser ist Bestandteil der freien Boost-Bibliothek.

## Operatoren

Aufgrund von Beschränkungen seitens der Programmiersprache C++ wurde die Spirit-Syntax um die Operatoren-Rangfolge aufgebaut, wobei Ähnlichkeiten zu EBNF sowie regulären Ausdrücken erhalten bleiben.

| Syntax | Erläuterung |
| - | - |
| x >> y | Entspricht x gefolgt von y. |
| *x | Entspricht x null oder mindestens einmal. (Repräsentiert die kleenesche Hülle; C++ hat keinen unären Postfix-Operator *) |
| x | y | Entspricht x oder y. |
| +x | Entspricht x mindestens einmal. |
| -x | Entspricht x null oder einmal. |
| x & y | Entspricht x und y. |
| x - y | Entspricht x, aber nicht y. |
| x ^ y | Entspricht x, y oder beiden zusammen (in beliebiger Reihenfolge). |
| x [ Funktionsausdruck ] | Ruft die Funktion (oder den Funktor) auf, die (oder der) function_expression zurückgibt, wenn x wahr ist. |
| ( x ) | Entspricht x (kann für Rangfolgen-Gruppierungen benutzt werden) |
| x % y | Entspricht eine oder mehrere Wiederholungen von x, getrennt durch Vorkommnisse von y. |
| ~x | Entspricht allem außer x (nur mit Zeichenklassen wie ch_p oder alnum_p) |

## Beispiel

### Spirit.Classic

Es gibt andere Algorithmen, die zum Durchsuchen von Zeichenketten besser geeignet sind. Dieses Beispiel ist nur zur Veranschaulichung des Konzepts gedacht, wie Regeln erstellt und diesen Aktionen zugewiesen werden.

### Spirit 2.x

Das folgende Programm gibt für Eingabestrings (gegeben als Kommandozeilenargument) "OKAY" aus, wenn sie der Regel $\left\{a^{n}b^{n}\mid n\in \mathbb {N} _{0}\right\}$ entsprechen, andernfalls "NOT OKAY":

