Spirit Parser Framework
Spirit Parser Framework är ett objektorienterat rekursivt parsergeneratorramverk implementerat med hjälp av mallmetaprogrammeringstekniker . Uttrycksmallar tillåter användare att approximera syntaxen för utökad Backus–Naur-form (EBNF) helt i C++ . Parserobjekt komponeras genom operatoröverbelastning och resultatet är en backtracking LL(∞) -parser som kan analysera ganska tvetydiga grammatiker.
Spirit kan användas för både lexning och analys, tillsammans eller separat.
Detta ramverk är en del av Boost-biblioteken .
Operatörer
På grund av begränsningar i C++-språket har Spirits syntax designats kring operatorprecedens för C++, samtidigt som den liknar både EBNF och reguljära uttryck .
syntax | förklaring |
---|---|
x >> y
|
Matcha x följt av y. |
x > y
|
Efter att ha matchat x, förvänta dig y. |
*x
|
Matcha x upprepade noll eller fler gånger. Detta representerar Kleene-stjärnan ; C++ saknar en unär postfix- operator *. |
x | y
|
Matcha x. Om x inte matchar, försök att matcha y. |
+x
|
Matcha en serie med en eller flera förekomster av x. |
-x
|
Matcha x noll eller en gång. |
x & y
|
Matcha x och y. |
x - y
|
Matcha x men inte y. |
x ^ y
|
Matcha x, eller y, eller båda, i valfri ordning. |
x || y
|
Matcha x, eller y eller x följt av y. |
x [ funktionsuttryck ]
|
Kör funktionen/funktorn som returneras av function_expression, om x matchar. |
( x )
|
Matcha x (kan användas för prioritetsgruppering) |
x % y
|
Matcha en eller flera förekomster av x, åtskilda av förekomster av y. |
~x
|
Matcha allt utom x (endast med teckenklasser som ch_p eller alnum_p) |
Exempel
Det här exemplet visar hur man använder ett inline-parseruttryck med en semantisk åtgärd.
0
#include <string> #include <iostream> #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/phoenix.hpp> int main () { namespace qi = boost :: spirit :: qi ; std :: strängingång ; _ std :: cout << "Mata in en rad: \n " ; getline ( std :: cin , input ); std :: cout << "Fick '" << input << "'. \n " ; osignerat antal = ; /* Analysera sedan ingången (input.c_str()), med en parser konstruerad med följande semantik: Noll eller fler förekomster av ( bokstavlig sträng "cat" (när den matchas, öka räknaren "count") eller något tecken ( som kommer att hoppas över) ) Parsern är konstruerad av kompilatorn med hjälp av operatoröverbelastning och mallmatchning, så det faktiska arbetet görs inom qi::parse(), och uttrycket som börjar med * initierar endast regelobjektet som parsefunktionen använder . */ auto regel = * ( qi :: lit ( "katt" ) [ ++ qi :: _val ] | qi :: utelämna [ qi :: char_ ]); qi :: parse ( input . start (), input . end (), regel , count ); // Till sist, visa resultat. std :: cout << "Inmatningen innehöll " << count << " förekomster av 'cat' \n " ; }
externa länkar
- Spirit parser framework github sida
- Spirit parser-ramverk
- Dokumentation i Boost-projektet
- Artikel om Spirit av designern Joel de Guzman i Dr. Dobb's Journal