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